Yandex рдЯреЗрд╕реНрдЯрд╕реБрдЗрдЯ рдЦреЛрд▓рддрд╛ рд╣реИ



рдЖрдЬ рд╣рдо рдкрд░реАрдХреНрд╖рдг рдХреЛрдб рдХреЗ рд▓рд┐рдП рд╕реНрд░реЛрдд рдХреЛрдб рдЦреЛрд▓рддреЗ рд╣реИрдВ, HTTP рд╕реЗрд╡рд╛рдУрдВ рдХреЗ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдПрдХ рд░реВрдкрд░реЗрдЦрд╛, рдЬрд┐рд╕реЗ Yandex.Taxi рджреНрд╡рд╛рд░рд╛ рд╡рд┐рдХрд╕рд┐рдд рдФрд░ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред GITHub рдкрд░ MIT рд▓рд╛рдЗрд╕реЗрдВрд╕ рдХреЗ рддрд╣рдд рд╕реНрд░реЛрдд рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ ред

Testuite рдХреЗ рд╕рд╛рде, HTTP рд╕реЗрд╡рд╛рдУрдВ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдирд╛ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИред рдпрд╣ рддреИрдпрд╛рд░ рддрдВрддреНрд░ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ:

  • HTTP API.
  • HTTP-, .
  • , .
  • , .


Yandex.Taxi рдмреИрдХрдПрдВрдб рдореЗрдВ рд╕реИрдХрдбрд╝реЛрдВ рдорд╛рдЗрдХреНрд░реЛрд╕рд░реНрд╡рд┐рд╕реЗрдЬ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ, рдирдП рд▓рдЧрд╛рддрд╛рд░ рджрд┐рдЦрд╛рдИ рджреЗ рд░рд╣реЗ рд╣реИрдВред рд╣рдо рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдврд╛рдВрдЪреЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ C ++ рдореЗрдВ рд╕рднреА рдЕрддреНрдпрдзрд┐рдХ рднрд░реА рд╣реБрдИ рд╕реЗрд╡рд╛рдУрдВ рдХрд╛ рд╡рд┐рдХрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ, рд╣рдордиреЗ рдкрд╣рд▓реЗ рд╣реА рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ Habr├й рд╕реЗ рдмрд╛рдд рдХреА рд╣реИ ред рд╣рдо рдкрд╛рдпрдерди рдореЗрдВ рдХрдо рдорд╛рдВрдЧ рд╡рд╛рд▓реА рд╕реЗрд╡рд╛рдПрдВ рдФрд░ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдмрдирд╛рддреЗ рд╣реИрдВред

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

рдЗрд╕рдХреЗ рд▓рд┐рдП рдХреЛрдИ рддреИрдпрд╛рд░ рдЙрдкрдХрд░рдг рдирд╣реАрдВ рд╣реИрдВ - рдЖрдкрдХреЛ рдкрд░реАрдХреНрд╖рдг рд╡рд╛рддрд╛рд╡рд░рдг рд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдб рд▓рд┐рдЦрдирд╛ рд╣реЛрдЧрд╛, рдЬреЛ рд╣реЛрдЧрд╛:

  • рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЛ рдмрдврд╝рд╛рдПрдВ рдФрд░ рднрд░реЗрдВ;
  • рдЕрд╡рд░реЛрдзрди рдФрд░ рд╕реНрдкреВрдл HTTP рдЕрдиреБрд░реЛрдз;
  • рдЗрд╕ рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ рдПрдХ рдкрд░реАрдХреНрд╖рдг рд╕реЗрд╡рд╛ рдЪрд▓рд╛рдПрдВред

рдпреВрдирд┐рдЯ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рд▓рд┐рдП рдЪреМрдЦрдЯреЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рдорд╛рдзрд╛рди рдХрд░рдирд╛ рдмрд╣реБрдд рдореБрд╢реНрдХрд┐рд▓ рдФрд░ рдЧрд▓рдд рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЙрдирдХрд╛ рдХрд╛рд░реНрдп рдЕрд▓рдЧ рд╣реИ: рдЫреЛрдЯреЗ рд╕рдВрд░рдЪрдирд╛рддреНрдордХ рдЗрдХрд╛рдЗрдпреЛрдВ рдХреЗ рдЗрдХрд╛рдИ рдкрд░реАрдХреНрд╖рдг - рдШрдЯрдХ, рд╡рд░реНрдЧ, рдХрд╛рд░реНрдпред

рдЯреЗрд╕реНрдЯрд╕реБрдЗрдЯ рдкрд╛рдЗрдЯреЗрд╕реНрдЯ , рдорд╛рдирдХ рдкрд╛рдпрдерди рдкрд░реАрдХреНрд╖рдг рдврд╛рдВрдЪреЗ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИ ред рдЗрд╕рд╕реЗ рдХреЛрдИ рдлрд░реНрдХ рдирд╣реАрдВ рдкрдбрд╝рддрд╛ рдХрд┐ рд╣рдо рдЬрд┐рд╕ рдорд╛рдЗрдХреНрд░реЛрд╕реЗрд╡реНрд╕ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░ рд░рд╣реЗ рд╣реИрдВ рд╡рд╣ рдХрд┐рд╕ рднрд╛рд╖рд╛ рдореЗрдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИред рдЕрдм рдЯреЗрд╕реНрдЯрд╕реБрдЗрдЯ GNU / Linux, macOS рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдкрд░ рдЪрд▓рддрд╛ рд╣реИред

рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЯреЗрд╕реНрдЯрд╕реБрдЗрдЯ рдПрдХреАрдХрд░рдг рдкрд░рд┐рджреГрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ, рдЕрд░реНрдерд╛рдд, рдХрдИ рд╕реЗрд╡рд╛рдУрдВ рдХреА рдмрд╛рддрдЪреАрдд (рдФрд░ рдпрджрд┐ рд╕реЗрд╡рд╛ рдкрд╛рдпрдерди рдореЗрдВ рд▓рд┐рдЦреА рдЧрдИ рд╣реИ, рддреЛ рдирд┐рдореНрди-рд╕реНрддрд░реАрдп рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП), рд╣рдо рдЗрди рдорд╛рдорд▓реЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╣рдо рдХреЗрд╡рд▓ рдПрдХ рд╣реА рд╕реЗрд╡рд╛ рдХреЗ рдкрд░реАрдХреНрд╖рдг рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░реЗрдВрдЧреЗред

рд╡рд┐рд╕реНрддрд╛рд░ рдХрд╛ рд╕реНрддрд░рдкрд░реАрдХреНрд╖рдг рдЙрдкрдХрд░рдг
рд╡рд┐рдзрд┐ / рд╕рдорд╛рд░реЛрд╣, рдХрдХреНрд╖рд╛, рдШрдЯрдХ, рдкреБрд╕реНрддрдХрд╛рд▓рдпрдорд╛рдирдХ рдЗрдХрд╛рдИ рдкрд░реАрдХреНрд╖рдг, pytest , Googletest , рдХрднреА-рдХрднреА рдЕрднреА рднреА рдкрд░реАрдХреНрд╖рдг рдХрд░рддрд╛ рд╣реИ
Microserviceрдкрд░реАрдХреНрд╖рдг рд╕реВрдЯ
рдорд╛рдЗрдХреНрд░реЛрд╕рд┐рд╕реНрдЯ рд╕реЗрд╡рд╛ рдкрд╣рдирд╛рд╡рд╛ (рдРрдк)рдЯреЗрд╕реНрдЯрд╕реБрдЗрдЯ рдПрдХреАрдХрд░рдг рдкрд░реАрдХреНрд╖рдг (рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ)

рдкрд░рд┐рдЪрд╛рд▓рди рд╕рд┐рджреНрдзрд╛рдВрдд


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

рдХрд┐рд╕реА рд╕реЗрд╡рд╛ рдХреЛ рд╢реБрд░реВ рдХрд░рдирд╛ / рд░реЛрдХрдирд╛ рдПрдХ рд░реВрдЯреАрди рдСрдкрд░реЗрд╢рди рд╣реИред рдЗрд╕рд▓рд┐рдП, рд╣рдо рдЬрд╛рдБрдЪ рдХрд░рддреЗ рд╣реИрдВ:

  • рд╕реЗрд╡рд╛ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж HTTP рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХрд░рддрд╛ рд╣реИ;
  • рдпрджрд┐ рдмрд╛рд╣рд░реА рд╕реЗрд╡рд╛рдПрдБ рдЕрд╕реНрдерд╛рдпреА рд░реВрдк рд╕реЗ рдЕрдиреБрдкрд▓рдмреНрдз рд╣реИрдВ рддреЛ рд╕реЗрд╡рд╛ рдХреИрд╕реЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рддреА рд╣реИред




рдкрд░реАрдХреНрд╖рдг рд╕реВрдЯ:

  • рдбреЗрдЯрд╛рдмреЗрд╕ (PostgreSQL, MongoDB ...) рд╢реБрд░реВ рдХрд░рддрд╛ рд╣реИред
  • рдкреНрд░рддреНрдпреЗрдХ рдкрд░реАрдХреНрд╖рдг рд╕реЗ рдкрд╣рд▓реЗ, рдпрд╣ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЛ рдкрд░реАрдХреНрд╖рдг рдбреЗрдЯрд╛ рд╕реЗ рднрд░ рджреЗрддрд╛ рд╣реИред
  • рдПрдХ рдЕрд▓рдЧ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдП рдЧрдП microservice рд╢реБрд░реВ рдХрд░рддрд╛ рд╣реИред
  • рдЕрдкрдирд╛ рд╕реНрд╡рдпрдВ рдХрд╛ рд╡реЗрдм рд╕рд░реНрд╡рд░ (рдореЙрдХрд╕реЗрд╡рд░) рд▓реЙрдиреНрдЪ рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рд╕реЗрд╡рд╛ рдХреЗ рд▓рд┐рдП рдмрд╛рд╣рд░реА рд╡рд╛рддрд╛рд╡рд░рдг рдХреА рдирдХрд▓ рдХрд░рддрд╛ рд╣реИред
  • рдкрд░реАрдХреНрд╖рдг рдХрд░рддрд╛ рд╣реИред

рдкрд░реАрдХреНрд╖рдг рдХреА рдЬрд╛рдБрдЪ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

  • рдХреНрдпрд╛ рд╕реЗрд╡рд╛ HTTP рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рд╕рдВрднрд╛рд▓рддреА рд╣реИред
  • рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рд╕реЗрд╡рд╛ рд╕реАрдзреЗ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддреА рд╣реИред
  • рдмрд╛рд╣реНрдп рд╕реЗрд╡рд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдХреЙрд▓ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ / рдЕрдиреБрдкрд╕реНрдерд┐рддрд┐ / рдЕрдиреБрдХреНрд░рдоред
  • рд╕реЗрд╡рд╛ рдХреА рдЖрдВрддрд░рд┐рдХ рд╕реНрдерд┐рддрд┐ рдЙрд╕ рдЬрд╛рдирдХрд╛рд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЬреЛ рд╡рд╣ рдЯреЗрд╕реНрдЯрдкреЙрдЗрдВрдЯ рдХреЛ рдкрд╛рд╕ рдХрд░рддреА рд╣реИред

mockserver


рд╣рдо рдПрдХ рдПрдХрд▓ рдорд╛рдЗрдХреНрд░реЛрд╕рд┐рд╕реНрдЯ рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рддреЗ рд╣реИрдВред рдмрд╛рд╣рд░реА рд╕реЗрд╡рд╛рдУрдВ рдХреЗ HTTP API рдХреА рдХреЙрд▓ рдХреЛ рдмреНрд░рд┐рдЬ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдкрд░реАрдХреНрд╖рдгреЛрдВ рдореЗрдВ рдХрд╛рдо рдХреЗ рдЗрд╕ рднрд╛рдЧ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ рдкреНрд▓рдЧ-рдЗрди mockserverрдФрд░ рдорд┐рд▓рддреЗ рд╣реИрдВ mockserver_httpsред Mockserver рдЕрдиреБрд░реЛрдз рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреЗ рд╕рд╛рде рдПрдХ HTTP рд╕рд░реНрд╡рд░ рд╣реИ рдЬреЛ рдкреНрд░рддреНрдпреЗрдХ рдкрд░реАрдХреНрд╖рдг рдФрд░ рдореЗрдореЛрд░реА рдХреЗ рд▓рд┐рдП рдЕрдиреБрдХреВрд▓рди рдпреЛрдЧреНрдп рд╣реИ рдЬрд┐рд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдиреБрд░реЛрдз рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ рдФрд░ рдХреНрдпрд╛ рдбреЗрдЯрд╛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдбреЗрдЯрд╛рдмреЗрд╕


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

рдХреИрд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░реЗрдВ


рдЯреЗрд╕реНрдЯрд╕реБрдЗрдЯ рдкрд░реАрдХреНрд╖рдг рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдХ рдбреЗрд╡рд▓рдкрд░ рдХреЛ рдкрд╛рдпрдерди рдФрд░ рдорд╛рдирдХ рдкрд╛рдЗрд╕реНрдЯреЗрд╕реНрдЯ рдлреНрд░реЗрдорд╡рд░реНрдХ рдкрддрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП ред

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



рджреГрд╢реНрдпрдкрдЯрд▓ chat.html рд╕рд╛рде рд╕реВрдЪрдирд╛ рдХрд╛ рдЖрджрд╛рди рдЪреИрдЯ-рдмреИрдХрдПрдВрдб рд╕реЗрд╡рд╛ ред

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

рдЪреИрдЯ рдмреИрдХреЗрдВрдб


рдЪреИрдЯ-рдмреИрдХреЗрдВрдб рд╕реЗрд╡рд╛ рдлреНрд░рдВрдЯ-рдПрдВрдб рд╕реЗ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╡реЗрд╢ рдмрд┐рдВрджреБ рд╣реИред рд╕рдВрджреЗрд╢реЛрдВ рдХреА рд╕реВрдЪреА рднреЗрдЬрдиреЗ рдФрд░ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо ред

рд╕рд░реНрд╡рд┐рд╕


рд╣рдо рдПрдХ рдЙрджрд╛рд╣рд░рдг рдЕрдиреБрд░реЛрдз рд╣реИрдВрдбрд▓рд░ рджрд┐рдЦрд╛рддреЗ рд╣реИрдВ POST /messages/retrieve:

рд╕реНрд░реЛрдд рдХреЛрдб

@routes.post('/messages/retrieve')
async def handle_list(request):
async with aiohttp.ClientSession() as session:
    #     
    response = await session.post(
        storage_service_url + 'messages/retrieve',
            timeout=HTTP_TIMEOUT,
        )
        response.raise_for_status()
        response_body = await response.json()

        #    ,      
        messages = list(reversed(response_body['messages']))
        result = {'messages': messages}
        return web.json_response(result)

рдЯреЗрд╕реНрдЯ


рд╕реЗрд╡рд╛ рдХреЗ рд▓реЙрдиреНрдЪ рдХреЗ рд▓рд┐рдП рдЯреЗрд╕реНрдЯрд╕реБрдЗрдЯ рдЗрдиреНрдлреНрд░рд╛рд╕реНрдЯреНрд░рдХреНрдЪрд░ рддреИрдпрд╛рд░ рдХрд░реЗрдВред рд╣рдо рдЗрдВрдЧрд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рд╣рдо рд╕реЗрд╡рд╛ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреМрди рд╕реА рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдЪрд╛рд╣рддреЗ рд╣реИрдВред

рд╕реНрд░реЛрдд

#      . 
#       ( scope='session'),   
@pytest.fixture(scope='session')
async def service_daemon(
        register_daemon_scope, service_spawner, mockserver_info,
):
    python_path = os.getenv('PYTHON3', 'python3')
    service_path = pathlib.Path(__file__).parent.parent
    async with register_daemon_scope(
            name='chat-backend',
            spawn=service_spawner(
                #   .    тАФ  ,
                #    
                [
                    python_path,
                    str(service_path.joinpath('server.py')),
                    '--storage-service-url',
                    #       mockserver,
                    #         mockserver   /storage
                    mockserver_info.base_url + 'storage/',
                ],
                #  URL,      
                check_url=SERVICE_BASEURL + 'ping',
            ),
    ) as scope:
        yield scope

рд╣рдо рдХреНрд▓рд╛рдЗрдВрдЯ рд╕реНрдерд┐рд░рддрд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкрд░реАрдХреНрд╖рдг рд╕реЗрд╡рд╛ рдХреЛ рдПрдХ HTTP рдЕрдиреБрд░реЛрдз рднреЗрдЬрддрд╛ рд╣реИред

рд╕реНрд░реЛрдд

@pytest.fixture
async def server_client(
        service_daemon, # HTTP-  == 204
        service_client_options,
        ensure_daemon_started,
        #   mockserver ,      ,
        #    ,    
        mockserver,
):
    await ensure_daemon_started(service_daemon)
    yield service_client.Client(SERVICE_BASEURL, **service_client_options)

рдЕрдм рдмреБрдирд┐рдпрд╛рджреА рдврд╛рдВрдЪрд╛ рдЬрд╛рдирддрд╛ рд╣реИ рдХрд┐ рдХреИрд╕реЗ рд╢реБрд░реВ рдХрд┐рдпрд╛ рдЬрд╛рдП chat-backendрдФрд░ рдХреИрд╕реЗ рдЙрд╕реЗ рдПрдХ рдЕрдиреБрд░реЛрдз рднреЗрдЬрд╛ рдЬрд╛рдПред рдпрд╣ рдкрд░реАрдХреНрд╖рдг рд▓рд┐рдЦрдирд╛ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИред

рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдореЗрдВ chat-backendрд╣рдо рднрдВрдбрд╛рд░рдг рд╕реЗрд╡рд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рди chat-storage-mongoрд╣реА , рди рд╣реА chat-storage-postgresред chat-backendрд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдХреЙрд▓ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП , рд╣рдордиреЗ рд╕реНрдЯреЛрд░реЗрдЬ рдПрдкреАрдЖрдИ рдХреЛ рдЧреАрд▓рд╛ рдХрд░ рджрд┐рдпрд╛ рд╣реИ mockserverред

рдЖрдЗрдП рд╡рд┐рдзрд┐ рдХреЗ рд▓рд┐рдП рдПрдХ рдкрд░реАрдХреНрд╖рдг рд▓рд┐рдЦреЗрдВ POST messages/sendред рд╣рдо рдпрд╣ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░рддреЗ рд╣реИрдВ:

  • рдЕрдиреБрд░реЛрдз рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ;
  • рдЕрдиреБрд░реЛрдз рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рддреЗ рд╕рдордп, chat-backendрд╕рдВрдЧреНрд░рд╣рдг рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИ POST messages/sendред

рд╕реНрд░реЛрдд

async def test_messages_send(server_client, mockserver):
    #    mockserver   POST messages/send
    @mockserver.handler('/storage/messages/send')    
    async def handle_send(request):
        # ,       ,
        #     chat-backend
        assert request.json == {
            'username': 'Bob',
            'text': 'Hello, my name is Bob!',
        }
        return mockserver.make_response(status=204)

    #    chat-backend
    response = await server_client.post(
        'messages/send',
        json={'username': 'Bob', 'text': 'Hello, my name is Bob!'},
    )
    
    # ,        HTTP-
    assert response.status == 204

    # ,  chat-backend       POST messages/send
    assert handle_send.times_called == 1

рдЖрдЗрдП рд╡рд┐рдзрд┐ рдХреЗ рд▓рд┐рдП рдПрдХ рдкрд░реАрдХреНрд╖рдг рд▓рд┐рдЦреЗрдВ POST messages/retrieveред рд╣рдо рдпрд╣ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░рддреЗ рд╣реИрдВ:

  • рдЕрдиреБрд░реЛрдз рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ;
  • рдЕрдиреБрд░реЛрдз рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рддреЗ рд╕рдордп, chat-backendрд╕рдВрдЧреНрд░рд╣рдг рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИ POST /messages/retrieve;
  • chat-backend "рдлрд╝реНрд▓рд┐рдкреНрд╕" рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рд╕реЗ рдкреНрд░рд╛рдкреНрдд рд╕рдВрджреЗрд╢реЛрдВ рдХреА рд╕реВрдЪреА рддрд╛рдХрд┐ рдирд╡реАрдирддрдо рд╕рдВрджреЗрд╢ рд╕реВрдЪреА рдХреЗ рдЕрдВрдд рдореЗрдВ рд╣реЛрдВред

рд╕реНрд░реЛрдд

async def test_messages_retrieve(server_client, mockserver):
    messages = [
        {
            'username': 'Bob',
            'created': '2020-01-01T12:01:00.000',
            'text': 'Hi, my name is Bob!',
        },
        {
            'username': 'Alice',
            'created': {'$date': '2020-01-01T12:02:00.000'},
            'text': 'Hi Bob!',
        },
    ]

    #    mockserver   POST messages/retrieve
    @mockserver.json_handler('/storage/messages/retrieve')
    async def handle_retrieve(request):
        return {'messages': messages}

    #    chat-backend
    response = await server_client.post('messages/retrieve')

    # ,        HTTP-
    assert response.status == 200

    body = response.json()
    
    # ,    chat-backend    ,
    #   ,       
    assert body == {'messages': list(reversed(messages))}

    # ,  chat-backend       POST messages/retrieve
    assert handle_retrieve.times_called == 1


рдЪреИрдЯ-рднрдВрдбрд╛рд░рдг-postgres



рд╕реЗрд╡рд╛ chat-storage-postgresрдкреЛрд╕реНрдЯрдЧреНрд░реЗрдПрд╕рдХреНрдпреВрдПрд▓ рдбреЗрдЯрд╛рдмреЗрд╕ рдкрд░ рдЪреИрдЯ рд╕рдВрджреЗрд╢реЛрдВ рдХреЛ рдкрдврд╝рдиреЗ рдФрд░ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИред

рд╕рд░реНрд╡рд┐рд╕


рдпрд╣ рд╣реИ рдХрд┐ рд╣рдо рдХреИрд╕реЗ рд╡рд┐рдзрд┐ рдореЗрдВ PostgreSQL рд╕реЗ рд╕рдВрджреЗрд╢реЛрдВ рдХреА рд╕реВрдЪреА рдкрдврд╝рддреЗ рд╣реИрдВ POST /messages/retrieve:

рд╕реНрд░реЛрдд рдХреЛрдб

@routes.post('/messages/retrieve')
    async def get(request):
        async with app['pool'].acquire() as connection:
            records = await connection.fetch(
                'SELECT created, username, "text" FROM messages '
                'ORDER BY created DESC LIMIT 20',
            )
        messages = [
            {
                'created': record[0].isoformat(),
                'username': record[1],
                'text': record[2],
            }
            for record in records
        ]
        return web.json_response({'messages': messages})

рдЯреЗрд╕реНрдЯ


рд╣рдо рдЬрд┐рд╕ рд╕реЗрд╡рд╛ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░ рд░рд╣реЗ рд╣реИрдВ рд╡рд╣ PostgreSQL рдбреЗрдЯрд╛рдмреЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреА рд╣реИред рд╕рдм рдХреБрдЫ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдХреЗрд╡рд▓ рдпрд╣ рдмрддрд╛рдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рд╣реИ рдХрд┐ рдЯреЗрдмрд▓ рд╕реНрдХреАрдорд╛ рдХреА рддрд▓рд╛рд╢ рдХреЗ рд▓рд┐рдП рдХреМрди рд╕реА рдбрд╛рдпрд░реЗрдХреНрдЯрд░реА рд╣реИред

рд╕реНрд░реЛрдд

@pytest.fixture(scope='session')
def pgsql_local(pgsql_local_create):
    # ,     
    tests_dir = pathlib.Path(__file__).parent
    sqldata_path = tests_dir.joinpath('../schemas/postgresql')
    databases = discover.find_databases('chat_storage_postgres', sqldata_path)
    return pgsql_local_create(list(databases.values()))

рдмрд╛рдХреА рдХрдВрдлрд╝реЗрд╕реНрдЯрд╕реНрдЯреЙрдХрд╣реЛрдо рдЗрдиреНрдлреНрд░рд╛рд╕реНрдЯреНрд░рдХреНрдЪрд░ рд╕реЗрдЯрдЕрдк рдКрдкрд░ рд╡рд░реНрдгрд┐рдд рд╕реЗрд╡рд╛ рд╕реЗ рдЕрд▓рдЧ рдирд╣реАрдВ рд╣реИ chat-backendред

рдЪрд▓рд┐рдП рдкрд░реАрдХреНрд╖рдгреЛрдВ рдкрд░ рдЪрд▓рддреЗ рд╣реИрдВред

рдЖрдЗрдП рд╡рд┐рдзрд┐ рдХреЗ рд▓рд┐рдП рдПрдХ рдкрд░реАрдХреНрд╖рдг рд▓рд┐рдЦреЗрдВ POST messages/sendред рдЬрд╛рдВрдЪреЗрдВ рдХрд┐ рдпрд╣ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЛ рд╕рдВрджреЗрд╢ рдмрдЪрд╛рддрд╛ рд╣реИред

рд╕реНрд░реЛрдд

async def test_messages_send(server_client, pgsql):
    #   POST /messages/send
    response = await server_client.post(
        '/messages/send', json={'username': 'foo', 'text': 'bar'},
    )

    # ,    
    assert response.status_code == 200

    # ,     JSON    
    data = response.json()
    assert 'id' in data

    #     PostgreSQL  
    cursor = pgsql['chat_messages'].cursor()
    cursor.execute(
        'SELECT username, text FROM messages WHERE id = %s', (data['id'],),
    )
    record = cursor.fetchone()

    # ,          , 
    #     HTTP-
    assert record == ('foo', 'bar')

рдЖрдЗрдП рд╡рд┐рдзрд┐ рдХреЗ рд▓рд┐рдП рдПрдХ рдкрд░реАрдХреНрд╖рдг рд▓рд┐рдЦреЗрдВ POST messages/retrieveред рдЬрд╛рдВрдЪреЗрдВ рдХрд┐ рдпрд╣ рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗ рд╕рдВрджреЗрд╢ рд▓реМрдЯрд╛рддрд╛ рд╣реИред

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

рд╕реНрд░реЛрдд

--  chat-storage-postgres/tests/static/test_service/pg_chat_messages.sql
INSERT INTO messages(id, created, username, text) VALUES (DEFAULT, '2020-01-01 00:00:00.0+03', 'foo', 'hello, world!');
INSERT INTO messages(id, created, username, text) VALUES (DEFAULT, '2020-01-01 00:00:01.0+03', 'bar', 'happy ny');

рд╕реНрд░реЛрдд

#  chat-storage-postgres/tests/test_service.py
async def test_messages_retrieve(server_client, pgsql):
    #     testsuite     
    #  pg_chat_messages.sql
    response = await server_client.post('/messages/retrieve', json={})
    assert response.json() == {
        'messages': [
            {
                'created': '2019-12-31T21:00:01+00:00',
                'text': 'happy ny',
                'username': 'bar',
            },
            {
                'created': '2019-12-31T21:00:00+00:00',
                'text': 'hello, world!',
                'username': 'foo',
            },
        ],
    }

рдкреНрд░рдХреНрд╖реЗрдкрдг


рдбреЙрдХрдЯрд░ рдХрдВрдЯреЗрдирд░ рдореЗрдВ рд░рдирд┐рдВрдЧ рдЙрджрд╛рд╣рд░рдг рд╕рдмрд╕реЗ рдЖрд╕рд╛рди рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдорд╢реАрди рдкрд░ рд╕реНрдерд╛рдкрд┐рдд рдбреЙрдХрдЯрд░ рдФрд░ рдбреЙрдХрдЯрд░-рдХрдВрдкреЛрдЬрд╝ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред

рд╕рднреА рдЙрджрд╛рд╣рд░рдг рдкреНрд░рд╛рд░рдВрдн рдЪреИрдЯ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рд╕реЗ рд▓реЙрдиреНрдЪ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВредdocs/examples



#   MongoDB
docs/examples$ make run-chat-mongo

#   PostgreSQL
docs/examples$ make run-chat-postgres

рд▓реЙрдиреНрдЪ рдХреЗ рдмрд╛рдж, URL рдХрдВрд╕реЛрд▓ рдореЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реЛрдЧрд╛, рдЬрд╣рд╛рдБ рдЖрдк рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рдЪреИрдЯ рдЦреЛрд▓ рд╕рдХрддреЗ рд╣реИрдВ:

chat-postgres_1 | ======== Running on http://0.0.0.0:8081 ========
chat-postgres_1 | (Press CTRL+C to quit)

рдкрд░реАрдХреНрд╖рдг рдЪрд▓рд╛рдПрдВ

#    
docs/examples$ make docker-runtests

#    
docs/examples$ make docker-runtests-mockserver-example
docs/examples$ make docker-runtests-mongo-example
docs/examples$ make docker-runtests-postgres-example

рдкреНрд░рд▓реЗрдЦрди


рд╡рд┐рд╕реНрддреГрдд рдкрд░реАрдХреНрд╖рдгрд╕реВрдЪрдирд╛ рдкреНрд░рд▓реЗрдЦрди рдпрд╣рд╛рдБ рдЙрдкрд▓рдмреНрдз рд╣реИ ред рдЙрджрд╛рд╣рд░рдг рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдФрд░ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП

рдирд┐рд░реНрджреЗрд╢ ред

рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдкреНрд░рд╢реНрди рд╣реИрдВ github.com/yandex/yandex-taxi-testsuite/issues - рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдЫреЛрдбрд╝ рджреЗрдВред

All Articles