рдЯрд┐рдбреНрдбреА рдХреЗ рд╕рд╛рде рд▓реЛрдб рдкрд░реАрдХреНрд╖рдгред рднрд╛рдЧ реи

рдореЗрд░реЗ рдкрд┐рдЫрд▓реЗ рд▓реЗрдЦ рдХреЛ рдкрд╕рдВрдж рдХрд░рдиреЗ рд╡рд╛рд▓реЛрдВ рдХреЗ рд▓рд┐рдП, рдореИрдВ рдЯрд┐рдбреНрдбреЗ рддрдирд╛рд╡ рдкрд░реАрдХреНрд╖рдг рдЙрдкрдХрд░рдг рдХреЗ рдЕрдкрдиреЗ рдЫрд╛рдкреЛрдВ рдХреЛ рд╕рд╛рдЭрд╛ рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦрддрд╛ рд╣реВрдВред

рдореИрдВ рдХреЛрдб рдХреЗ рд╕рд╛рде рд▓реЛрдб рдЯреЗрд╕реНрдЯ рдЕрдЬрдЧрд░ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд╛рднреЛрдВ рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реВрдВрдЧрд╛ рдЬрд┐рд╕рдореЗрдВ рдЖрдк рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдХреЛрдИ рднреА рдбреЗрдЯрд╛ рдЖрд╕рд╛рдиреА рд╕реЗ рддреИрдпрд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред


рд╕рд░реНрд╡рд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг


рдХрднреА-рдХрднреА рд▓реЛрдб рдкрд░реАрдХреНрд╖рдг рдореЗрдВ, HTTP рд╕рд░реНрд╡рд░ рд╕реЗ рдХреЗрд╡рд▓ 200 OK рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рд╣реИред рд╣реЛрддрд╛ рд╣реИ, рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреА рд╕рд╛рдордЧреНрд░реА рдХреА рдЬрд╛рдВрдЪ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдХрд┐ рд▓реЛрдб рдХреЗ рддрд╣рдд рд╕рд░реНрд╡рд░ рд╕рд╣реА рдбреЗрдЯрд╛ рдЬрд╛рд░реА рдХрд░рддрд╛ рд╣реИ рдпрд╛ рд╕рдЯреАрдХ рдЧрдгрдирд╛ рдХрд░рддрд╛ рд╣реИред рдмрд╕ рдРрд╕реЗ рдорд╛рдорд▓реЛрдВ рдХреЗ рд▓рд┐рдП, рдЯрд┐рдбрд╕реНрдЯ рдиреЗ рд╕рд░реНрд╡рд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╕рдлрд▓рддрд╛ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдЬреЛрдбрд╝реАред рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЙрджрд╛рд╣рд░рдг рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:

from locust import HttpLocust, TaskSet, task import random as rnd class UserBehavior(TaskSet): @task(1) def check_albums(self): photo_id = rnd.randint(1, 5000) with self.client.get(f'/photos/{photo_id}', catch_response=True, name='/photos/[id]') as response: if response.status_code == 200: album_id = response.json().get('albumId') if album_id % 10 != 0: response.success() else: response.failure(f'album id cannot be {album_id}') else: response.failure(f'status code is {response.status_code}') class WebsiteUser(HttpLocust): task_set = UserBehavior min_wait = 1000 max_wait = 2000 

рдЗрд╕рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ рдЕрдиреБрд░реЛрдз рд╣реИ, рдЬреЛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкрд░рд┐рджреГрд╢реНрдп рдореЗрдВ рдПрдХ рднрд╛рд░ рдкреИрджрд╛ рдХрд░реЗрдЧрд╛:
рд╕рд░реНрд╡рд░ рд╕реЗ, рд╣рдо 1 рд╕реЗ 5000 рддрдХ рдХреА рд░реЗрдВрдЬ рдореЗрдВ рд░реИрдВрдбрдо рдЖрдИрдбреА рдХреЗ рд╕рд╛рде рдлреЛрдЯреЛ рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рдПрд▓реНрдмрдо рдЖрдИрдбреА рдХреА рдЬрд╛рдВрдЪ рдХрд░рддреЗ рд╣реИрдВ, рдпрд╣ рдорд╛рдирддреЗ рд╣реБрдП рдХрд┐ рдпрд╣ 10 рд╕реЗ рдЕрдзрд┐рдХ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ
рдпрд╣рд╛рдБ рдЖрдк рддреБрд░рдВрдд рдХреБрдЫ рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рджреЗ рд╕рдХрддреЗ рд╣реИрдВ:

  • рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдЕрдиреБрд░реЛрдз () рдХреЗ рд╕рд╛рде рднрдпрд╛рдирдХ рдирд┐рд░реНрдорд╛рдг : рдЖрдк рдЗрд╕реЗ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ = рдЕрдиреБрд░реЛрдз () рдХреЗ рд╕рд╛рде рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд╕рд╛рде рдЪреБрдкрдЪрд╛рдк рдХрд╛рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ
  • URL рдХреЛ python 3.6 рдореЗрдВ рдЬреЛрдбрд╝реЗ рдЧрдП рд╕реНрдЯреНрд░рд┐рдВрдЧ рдкреНрд░рд╛рд░реВрдк рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЕрдЧрд░ рдореИрдВ рдЧрд▓рдд рдирд╣реАрдВ рд╣реВрдВ - f '/ рдлреЛрдЯреЛ / {photo_id}' ред рдкрд┐рдЫрд▓реЗ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдореЗрдВ, рдпрд╣ рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛!
  • рдПрдХ рдирдпрд╛ рддрд░реНрдХ рдЬреЛ рд╣рдордиреЗ рдкрд╣рд▓реЗ рдЗрд╕реНрддреЗрдорд╛рд▓ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдерд╛, catch_response = True , Locust рдХреЛ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рд╣рдо рд╕реНрд╡рдпрдВ рд╕рд░реНрд╡рд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреА рд╕рдлрд▓рддрд╛ рдХрд╛ рдирд┐рд░реНрдзрд╛рд░рдг рдХрд░реЗрдВрдЧреЗред рдпрджрд┐ рдЖрдк рдЗрд╕реЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдЙрд╕реА рддрд░рд╣ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдСрдмреНрдЬреЗрдХреНрдЯ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВрдЧреЗ рдФрд░ рдЗрд╕рдХреЗ рдбреЗрдЯрд╛ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдВрдЧреЗ, рд▓реЗрдХрд┐рди рдкрд░рд┐рдгрд╛рдо рдХреЛ рдлрд┐рд░ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗред рдиреАрдЪреЗ рдПрдХ рд╡рд┐рд╕реНрддреГрдд рдЙрджрд╛рд╣рд░рдг рд╣реИред
  • рдПрдХ рдФрд░ рддрд░реНрдХ рдирд╛рдо = '/ рддрд╕реНрд╡реАрд░реЗрдВ / [рдЖрдИрдбреА]' ред рдЖрдВрдХрдбрд╝реЛрдВ рдореЗрдВ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рд╕рдореВрд╣реАрдХреГрдд рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред рдирд╛рдо рдХреЛрдИ рднреА рдкрд╛рда рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдпреВрдЖрд░рдПрд▓ рдХреЛ рджреЛрд╣рд░рд╛рдирд╛ рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИред рдЗрд╕рдХреЗ рдмрд┐рдирд╛, рдПрдХ рдЕрджреНрд╡рд┐рддреАрдп рдкрддреЗ рдпрд╛ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд╕рд╛рде рдкреНрд░рддреНрдпреЗрдХ рдЕрдиреБрд░реЛрдз рдХреЛ рдЕрд▓рдЧ рд╕реЗ рджрд░реНрдЬ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдпрд╣рд╛рдВ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ:


рдПрдХ рд╣реА рддрд░реНрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рдЖрдк рдПрдХ рдФрд░ рдЪрд╛рд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ - рдХрднреА-рдХрднреА рдРрд╕рд╛ рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рд╡рд┐рднрд┐рдиреНрди рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рд╕реЗрд╡рд╛ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, POST рдЕрдиреБрд░реЛрдзреЛрдВ рдХреА рд╡рд┐рднрд┐рдиреНрди рд╕рд╛рдордЧреНрд░реА) рдЕрд▓рдЧ-рдЕрд▓рдЧ рддрд░реНрдХ рдХрд░рддреА рд╣реИред рддрд╛рдХрд┐ рдкрд░реАрдХреНрд╖рд╛ рдкрд░рд┐рдгрд╛рдо рдорд┐рд╢реНрд░рд┐рдд рди рд╣реЛрдВ, рдЖрдк рдХрдИ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдХрд╛рд░реНрдп рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдкреНрд░рддреНрдпреЗрдХ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рддрд░реНрдХ рдирд╛рдо рдХреЗ рд▓рд┐рдП рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдЖрдЧреЗ рд╣рдо рдЪреЗрдХ рдХрд░рддреЗ рд╣реИрдВред рдореЗрд░реЗ рдкрд╛рд╕ рдЙрдирдореЗрдВ рд╕реЗ 2 рд╣реИрдВред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рд╕рд░реНрд╡рд░ рдиреЗ рдПрдХ рдЙрддреНрддрд░ рджрд┐рдпрд╛ рд╣реИ рдпрджрд┐ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛редрд╕реНрдЯреИрдЯрд╕_рдХреЛрдб == 200 )

рдпрджрд┐ рд╣рд╛рдБ, рддреЛ рдЬрд╛рдВрдЪреЗрдВ рдХрд┐ рдХреНрдпрд╛ рдПрд▓реНрдмрдо рдХрд╛ рдЖрдИрдбреА 10 рдХрд╛ рдЧреБрдгрдХ рд╣реИред рдпрджрд┐ рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рдирд╣реАрдВ рд╣реИ, рддреЛ рдЗрд╕ рдЙрддреНрддрд░ рдХреЛ рдПрдХ рд╕рдлрд▓ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░реЗрдВред ()

рдЕрдиреНрдп рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рд╣рдо рдЗрдВрдЧрд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреНрдпреЛрдВ рд╡рд┐рдлрд▓ рд░рд╣реАред рдЕрд╕рдлрд▓рддрд╛ ('рддреНрд░реБрдЯрд┐ рдкрд╛рда') ред рдпрд╣ рдкрд╛рда рдкрд░реАрдХреНрд╖рдг рдХреЗ рджреМрд░рд╛рди рд╡рд┐рдлрд▓рддрд╛ рдкреГрд╖реНрда рдкрд░ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред



рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЪреМрдХрд╕ рдкрд╛рдардХ рдЕрдкрд╡рд╛рдж рдХреА рдЕрдиреБрдкрд╕реНрдерд┐рддрд┐ рдХреЛ рдиреЛрдЯрд┐рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдХреЛрдб рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИ рдЬреЛ рдиреЗрдЯрд╡рд░реНрдХ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рджрд░рдЕрд╕рд▓, рдЯрд╛рдЗрдордЖрдЙрдЯ, рдХрдиреЗрдХреНрд╢рди рддреНрд░реБрдЯрд┐ рдФрд░ рдЕрдиреНрдп рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рдШрдЯрдирд╛рдУрдВ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЯрд┐рдбреНрдбреЗ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓ рд▓реЗрдВрдЧреЗ рдФрд░ рдЕрднреА рднреА рдПрдХ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд▓реМрдЯрд╛рдПрдВрдЧреЗ, рдпрд╣ рджрд░реНрд╢рд╛рддрд╛ рд╣реИ рдХрд┐, рд╣рд╛рд▓рд╛рдВрдХрд┐, рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЛрдб рдХреА рд╕реНрдерд┐рддрд┐ 0 рд╣реИред

рдпрджрд┐ рдХреЛрдб рдЕрднреА рднреА рдПрдХ рдЕрдкрд╡рд╛рдж рдлреЗрдВрдХрддрд╛ рд╣реИ, рддреЛ рдпрд╣ рд░рдирдЯрд╛рдЗрдо рдкрд░ рдЕрдкрд╡рд╛рдж рдЯреИрдм рдкрд░ рд▓рд┐рдЦрд╛ рдЬрд╛рдПрдЧрд╛ рддрд╛рдХрд┐ рд╣рдо рдЗрд╕реЗ рд╕рдВрднрд╛рд▓ рд╕рдХреЗрдВред рд╕рдмрд╕реЗ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕реНрдерд┐рддрд┐ рдпрд╣ рд╣реИ рдХрд┐ рдЙрддреНрддрд░ рдХреЗ json'e рдиреЗ рдЙрд╕ рдорд╛рди рдХреЛ рд╡рд╛рдкрд╕ рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИ рдЬрд┐рд╕рдХреА рд╣рдо рддрд▓рд╛рд╢ рдХрд░ рд░рд╣реЗ рдереЗ, рд▓реЗрдХрд┐рди рд╣рдо рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЗрд╕ рдкрд░ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕рдВрдЪрд╛рд▓рди рдХрд░ рд░рд╣реЗ рд╣реИрдВред

рд╡рд┐рд╖рдп рдХреЛ рдмрдВрдж рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ - рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдореИрдВ рд╕реНрдкрд╖реНрдЯрддрд╛ рдХреЗ рд▓рд┐рдП json рд╕рд░реНрд╡рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ, рдХреНрдпреЛрдВрдХрд┐ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИред рд▓реЗрдХрд┐рди рдЖрдк HTML, XML, FormData, рдлрд╝рд╛рдЗрд▓ рдЕрдЯреИрдЪрдореЗрдВрдЯ рдФрд░ HTTP-рдЖрдзрд╛рд░рд┐рдд рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдЕрдиреНрдп рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рдПрдХ рд╣реА рд╕рдлрд▓рддрд╛ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдЬрдЯрд┐рд▓ рдкрд░рд┐рджреГрд╢реНрдпреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░реЗрдВ


рд▓рдЧрднрдЧ рд╣рд░ рдмрд╛рд░ рдХрд╛рд░реНрдп рдХрд┐рд╕реА рд╡реЗрдм рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд▓реЛрдб рдкрд░реАрдХреНрд╖рдг рдХрд╛ рд╕рдВрдЪрд╛рд▓рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реЛрддрд╛ рд╣реИ, рдпрд╣ рдЬрд▓реНрджреА рд╕реЗ рд╕реНрдкрд╖реНрдЯ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдЕрдХреЗрд▓реЗ рдЬреАрдИрдЯреА рд╕реЗрд╡рд╛рдУрдВ рдХреЗ рд╕рд╛рде рд╕рднреНрдп рдХрд╡рд░реЗрдЬ рдкреНрд░рджрд╛рди рдХрд░рдирд╛ рдЕрд╕рдВрднрд╡ рд╣реИ - рдЬреЛ рдХреЗрд╡рд▓ рдбреЗрдЯрд╛ рд╡рд╛рдкрд╕ рдХрд░рддреЗ рд╣реИрдВред

рдХреНрд▓рд╛рд╕рд┐рдХ рдЙрджрд╛рд╣рд░рдг: рдПрдХ рдСрдирд▓рд╛рдЗрди рд╕реНрдЯреЛрд░ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдпрд╣ рд╡рд╛рдВрдЫрдиреАрдп рд╣реИ рдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛

  1. рдореБрдЦреНрдп рд╕реНрдЯреЛрд░ рдЦреЛрд▓рд╛
  2. рдореБрдЭреЗ рдорд╛рд▓ рдХреА рддрд▓рд╛рд╢ рдереА
  3. рдЖрдЗрдЯрдо рд╡рд┐рд╡рд░рдг рдЦреЛрд▓рд╛ рдЧрдпрд╛
  4. рдХрд╛рд░реНрдЯ рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рдЖрдЗрдЯрдо
  5. рд╡реЗрддрди

рдЙрджрд╛рд╣рд░рдг рд╕реЗ, рд╣рдо рдорд╛рди рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдХреНрд░рдо рдореЗрдВ рдХреЙрд▓рд┐рдВрдЧ рд╕реЗрд╡рд╛рдПрдВ рдХреЗрд╡рд▓ рдХреНрд░рдорд┐рдХ рд░реВрдк рд╕реЗ рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдВрдЧреАред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдорд╛рд▓, рдмрд╛рд╕реНрдХреЗрдЯ рдФрд░ рднреБрдЧрддрд╛рди рдХреЗ рдкреНрд░рдХрд╛рд░ рдкреНрд░рддреНрдпреЗрдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред

рдкрд┐рдЫрд▓реЗ рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рдорд╛рдореВрд▓реА рд╕рдВрд╢реЛрдзрдиреЛрдВ рдХреЗ рд╕рд╛рде, рдЖрдк рдЖрд╕рд╛рдиреА рд╕реЗ рдРрд╕реЗ рдкрд░рд┐рджреГрд╢реНрдп рдХреЗ рдкрд░реАрдХреНрд╖рдг рдХреЛ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╣рдо рдЕрдкрдиреЗ рдкрд░реАрдХреНрд╖рдг рд╕рд░реНрд╡рд░ рдХреЗ рд▓рд┐рдП рдЙрджрд╛рд╣рд░рдг рдХреЛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рддреЗ рд╣реИрдВ:

  1. рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдПрдХ рдирдИ рдкреЛрд╕реНрдЯ рд▓рд┐рдЦ рд░рд╣рд╛ рд╣реИред
  2. рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдПрдХ рдирдИ рдкреЛрд╕реНрдЯ рдкрд░ рдПрдХ рдЯрд┐рдкреНрдкрдгреА рд▓рд┐рдЦрддрд╛ рд╣реИ
  3. рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЯрд┐рдкреНрдкрдгреА рдкрдврд╝рддрд╛ рд╣реИ

 from locust import HttpLocust, TaskSet, task class FlowException(Exception): pass class UserBehavior(TaskSet): @task(1) def check_flow(self): # step 1 new_post = {'userId': 1, 'title': 'my shiny new post', 'body': 'hello everybody'} post_response = self.client.post('/posts', json=new_post) if post_response.status_code != 201: raise FlowException('post not created') post_id = post_response.json().get('id') # step 2 new_comment = { "postId": post_id, "name": "my comment", "email": "test@user.habr", "body": "Author is cool. Some text. Hello world!" } comment_response = self.client.post('/comments', json=new_comment) if comment_response.status_code != 201: raise FlowException('comment not created') comment_id = comment_response.json().get('id') # step 3 self.client.get(f'/comments/{comment_id}', name='/comments/[id]') if comment_response.status_code != 200: raise FlowException('comment not read') class WebsiteUser(HttpLocust): task_set = UserBehavior min_wait = 1000 max_wait = 2000 

рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдореИрдВрдиреЗ рдПрдХ рдирдИ FlowException рдХреНрд▓рд╛рд╕ рдЬреЛрдбрд╝реАред рдкреНрд░рддреНрдпреЗрдХ рдЪрд░рдг рдХреЗ рдмрд╛рдж, рдпрджрд┐ рдпрд╣ рдЙрдореНрдореАрдж рдХреЗ рдореБрддрд╛рдмрд┐рдХ рдирд╣реАрдВ рд╣реБрдЖ, рддреЛ рдореИрдВрдиреЗ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдирд┐рд░рд╕реНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕ рдЕрдкрд╡рд╛рдж рд╡рд░реНрдЧ рдХреЛ рдлреЗрдВрдХ рджрд┐рдпрд╛ - рдпрджрд┐ рдкреЛрд╕реНрдЯ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рддреЛ рдЯрд┐рдкреНрдкрдгреА рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рднреА рдирд╣реАрдВ рд╣реЛрдЧрд╛, рдЖрджрд┐ред рдпрджрд┐ рд╡рд╛рдВрдЫрд┐рдд рд╣реИ, рддреЛ рдирд┐рд░реНрдорд╛рдг рдХреЛ рд╕рд╛рдорд╛рдиреНрдп рд░рд┐рдЯрд░реНрди рдХреЗ рд╕рд╛рде рдмрджрд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд░рдирдЯрд╛рдЗрдо рдкрд░ рдФрд░ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рддреЗ рд╕рдордп, рдпрд╣ рдЗрддрдирд╛ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реЛрдЧрд╛ рдХрд┐ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЕрдкрд╡рд╛рдж рдЯреИрдм рдкрд░ рдХрд╣рд╛рдВ рдЧрд┐рд░рддреА рд╣реИред рдЙрд╕реА рдХрд╛рд░рдг рд╕реЗ, рдореИрдВ рдирд┐рд░реНрдорд╛рдг ... рдХреЛ рдЫреЛрдбрд╝рдХрд░ рдкреНрд░рдпрд╛рд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддрд╛ред

рд▓реЛрдб рдХреЛ рдпрдерд╛рд░реНрдерд╡рд╛рджреА рдмрдирд╛ рд░рд╣рд╛ рд╣реИ


рдЕрдм рдореБрдЭреЗ рдлрдЯрдХрд╛рд░рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ - рд╕реНрдЯреЛрд░ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рд╕рдм рдХреБрдЫ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд░реИрдЦрд┐рдХ рд╣реИ, рд▓реЗрдХрд┐рди рдкреЛрд╕реНрдЯ рдФрд░ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдЙрджрд╛рд╣рд░рдг рдмрд╣реБрдд рджреВрд░ рд╣реИ - рд╡реЗ рдкреЛрд╕реНрдЯ рдХреЛ 10 рдЧреБрдирд╛ рдЕрдзрд┐рдХ рдмрд╛рд░ рдкрдврд╝рддреЗ рд╣реИрдВ рдЬреЛ рд╡реЗ рдмрдирд╛рддреЗ рд╣реИрдВред рдЙрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдЖрдЗрдП рдЙрджрд╛рд╣рд░рдг рдХреЛ рдЕрдзрд┐рдХ рд╡реНрдпрд╡рд╣рд╛рд░реНрдп рдмрдирд╛рддреЗ рд╣реИрдВред рдФрд░ рдХрдо рд╕реЗ рдХрдо 2 рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╣реИрдВ:

  1. рдпрджрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдРрд╕реА рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ рдФрд░ рдмреИрдХрдПрдВрдб рдХреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкрджреЛрдВ рдкрд░ рдирд┐рд░реНрднрд░ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рддреЛ рдЖрдк рдЙрди рдкреЛрд╕реНрдЯ рдХреА рд╕реВрдЪреА рдХреЛ "рд╣рд╛рд░реНрдбрдХреЛрдб" рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдкрдврд╝рддреЗ рд╣реИрдВ рдФрд░ рдкрд░реАрдХреНрд╖рдг рдХреЛрдб рдХреЛ рд╕рд░рд▓ рдмрдирд╛рддреЗ рд╣реИрдВред
  2. рдмрдирд╛рдИ рдЧрдИ рдкреЛрд╕реНрдЯ рдХреЛ рд╕рд╣реЗрдЬреЗрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдкрдврд╝реЗрдВ рдпрджрд┐ рдкреЛрд╕реНрдЯ рдХреА рд╕реВрдЪреА рдХреЛ рдкреВрд░реНрд╡-рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдирд╛ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИ рдпрд╛ рдпрдерд╛рд░реНрдерд╡рд╛рджреА рд▓реЛрдб рдЗрд╕ рдмрд╛рдд рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдХреМрди рд╕реА рдкреЛрд╕реНрдЯ рдкрдврд╝реА рдЬрд╛рддреА рд╣реИрдВ (рдореИрдВрдиреЗ рдЗрд╕рдХреЗ рдХреЛрдб рдХреЛ рдЫреЛрдЯрд╛ рдФрд░ рдЕрдзрд┐рдХ рджреГрд╢реНрдп рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрджрд╛рд╣рд░рдгреЛрдВ рд╕реЗ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЛ рд╣рдЯрд╛ рджрд┐рдпрд╛)

 from locust import HttpLocust, TaskSet, task import random as r class UserBehavior(TaskSet): created_posts = [] @task(1) def create_post(self): new_post = {'userId': 1, 'title': 'my shiny new post', 'body': 'hello everybody'} post_response = self.client.post('/posts', json=new_post) if post_response.status_code != 201: return post_id = post_response.json().get('id') self.created_posts.append(post_id) @task(10) def read_post(self): if len(self.created_posts) == 0: return post_id = r.choice(self.created_posts) self.client.get(f'/posts/{post_id}', name='read post') class WebsiteUser(HttpLocust): task_set = UserBehavior min_wait = 1000 max_wait = 2000 

UserBehavior рд╡рд░реНрдЧ рдореЗрдВ , рдореИрдВрдиреЗ рдПрдХ create_posts рд╕реВрдЪреА рдмрдирд╛рдИред рд╡рд┐рд╢реЗрд╖ рдзреНрдпрд╛рди рджреЗрдВ - рдпрд╣ рдПрдХ рд╡рд╕реНрддреБ рд╣реИ рдФрд░ рдЗрд╕реЗ __init __ () рд╡рд░реНрдЧ рдХреЗ рдирд┐рд░реНрдорд╛рддрд╛ рдореЗрдВ рдирд╣реАрдВ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдерд╛ , рдЗрд╕рд▓рд┐рдП, рдХреНрд▓рд╛рдЗрдВрдЯ рд╕рддреНрд░ рдХреЗ рд╡рд┐рдкрд░реАрдд, рдпрд╣ рд╕реВрдЪреА рд╕рднреА рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рд╕рд╛рдорд╛рдиреНрдп рд╣реИред рдкрд╣рд▓рд╛ рдХрд╛рд░реНрдп рдПрдХ рдкреЛрд╕реНрдЯ рдмрдирд╛рддрд╛ рд╣реИ рдФрд░ рд╕реВрдЪреА рдореЗрдВ рдЕрдкрдирд╛ рдЖрдИрдбреА рд▓рд┐рдЦрддрд╛ рд╣реИред рджреВрд╕рд░рд╛ - 10 рдЧреБрдирд╛ рдЕрдзрд┐рдХ рдмрд╛рд░, рд╕реВрдЪреА рд╕реЗ рдПрдХ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рд░реВрдк рд╕реЗ рдЪрдпрдирд┐рдд рдкреЛрд╕реНрдЯ рдкрдврд╝рддрд╛ рд╣реИред рджреВрд╕рд░реЗ рдХрд╛рд░реНрдп рдХреА рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рд╕реНрдерд┐рддрд┐ рдпрд╣ рдЬрд╛рдВрдЪрдирд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдХреЛрдИ рдкреЛрд╕реНрдЯ рдмрдирд╛рдИ рдЧрдИ рд╣реИред

рдпрджрд┐ рд╣рдо рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗрд╡рд▓ рдЕрдкрдиреЗ рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░реЗ, рддреЛ рд╣рдо рдЙрдиреНрд╣реЗрдВ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдореЗрдВ рдШреЛрд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

 class UserBehavior(TaskSet): def __init__(self, parent): super(UserBehavior, self).__init__(parent) self.created_posts = list() 

рдХреБрдЫ рдФрд░ рд╕реБрд╡рд┐рдзрд╛рдПрдБ


рдХрд╛рд░реНрдпреЛрдВ рдХреА рдХреНрд░рдорд┐рдХ рд▓реЙрдиреНрдЪрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП, рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рдкреНрд░рд▓реЗрдЦрди рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рд╣рдо @seq_task (1) рдХрд╛рд░реНрдп рдПрдиреЛрдЯреЗрд╢рди рдХрд╛ рднреА рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рддрд░реНрдХ рдореЗрдВ рдХрд╛рд░реНрдп рдХреНрд░рдо рд╕рдВрдЦреНрдпрд╛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддрд╛ рд╣реИред

 class MyTaskSequence(TaskSequence): @seq_task(1) def first_task(self): pass @seq_task(2) def second_task(self): pass @seq_task(3) @task(10) def third_task(self): pass 

рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдкреНрд░рддреНрдпреЗрдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкрд╣рд▓реЗ first_task , рдлрд┐рд░ second_task , рдлрд┐рд░ 10 рдмрд╛рд░ third_task рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░реЗрдЧрд╛ред

рд╕рдЪ рдХрд╣реВрдБ рддреЛ, рдЗрд╕ рддрд░рд╣ рдХреЗ рдЕрд╡рд╕рд░ рдХреА рдЙрдкрд▓рдмреНрдзрддрд╛ рдкреНрд░рд╕рдиреНрди рдХрд░рддреА рд╣реИ, рд▓реЗрдХрд┐рди, рдкрд┐рдЫрд▓реЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рд╡рд┐рдкрд░реАрдд, рдпрд╣ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ рддреЛ рдкрд╣рд▓реЗ рдХрд╛рд░реНрдп рдХреЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЛ рджреВрд╕рд░реЗ рдореЗрдВ рдХреИрд╕реЗ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПред

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЬрдЯрд┐рд▓ рдкрд░рд┐рджреГрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП, рдиреЗрд╕реНрдЯреЗрдб рдЯрд╛рд╕реНрдХ рд╕реЗрдЯ рдмрдирд╛рдирд╛ рд╕рдВрднрд╡ рд╣реИ, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдХрдИ рдЯрд╛рд╕реНрдХрд╕реЗрдЯ рдХрдХреНрд╖рд╛рдПрдВ рдмрдирд╛рдирд╛ рдФрд░ рдПрдХ рджреВрд╕рд░реЗ рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░рдирд╛ред

 from locust import HttpLocust, TaskSet, task class Todo(TaskSet): @task(3) def index(self): self.client.get("/todos") @task(1) def stop(self): self.interrupt() class UserBehavior(TaskSet): tasks = {Todo: 1} @task(3) def index(self): self.client.get("/") @task(2) def posts(self): self.client.get("/posts") class WebsiteUser(HttpLocust): task_set = UserBehavior min_wait = 1000 max_wait = 2000 

рдКрдкрд░ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, 1 рд╕реЗ 6 рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдХреЗ рд╕рд╛рде, рдЯреЛрдбреЛ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд▓реЙрдиреНрдЪ рдХреА рдЬрд╛рдПрдЧреА, рдФрд░ рддрдм рддрдХ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХреА рдЬрд╛рдПрдЧреА, рдЬрдм рддрдХ рдХрд┐ 1 рд╕реЗ 4 рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдХреЗ рд╕рд╛рде, рдпрд╣ UserBehavior рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдкрд░ рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рдПрдЧрд╛ред рдпрд╣ рдмрд╣реБрдд рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ self.interrupt () рдХреЗ рд▓рд┐рдП рдПрдХ рдХреЙрд▓ рд╣реИ - рдЗрд╕рдХреЗ рдмрд┐рдирд╛, рдкрд░реАрдХреНрд╖рдг рдЙрдкрдорд╛ рдкрд░ рдХреЗрдВрджреНрд░рд┐рдд рд╣реЛрдЧрд╛ред

рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред рдЕрдВрддрд┐рдо рд▓реЗрдЦ рдореЗрдВ рдореИрдВ рдпреВрдЖрдИ рдХреЗ рдмрд┐рдирд╛ рд╡рд┐рддрд░рд┐рдд рдкрд░реАрдХреНрд╖рдг рдФрд░ рдкрд░реАрдХреНрд╖рдг рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд▓рд┐рдЦреВрдВрдЧрд╛, рд╕рд╛рде рд╣реА рд╕рд╛рде рдЯрд┐рдбреНрдбреЗ рдХреЗ рд╕рд╛рде рдкрд░реАрдХреНрд╖рдг рдХреЗ рджреМрд░рд╛рди рдореБрдЭреЗ рдЬреЛ рдХрдард┐рдирд╛рдЗрдпреЛрдВ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рдирд╛ рдкрдбрд╝рд╛ рдФрд░ рдЙрдирдХреЗ рдЖрд╕рдкрд╛рд╕ рдХреИрд╕реЗ рдкрд╣реБрдВрдЪрд╛ рдЬрд╛рдП, рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд▓рд┐рдЦреВрдВрдЧрд╛ред

Source: https://habr.com/ru/post/hi430810/


All Articles