рдЧреЛрдирдХреА - рдорд╛рдЗрдХреНрд░реЛрд╕рд░реНрд╡рд┐рд╕ рдЯреЗрд╕реНрдЯрд┐рдВрдЧ рдЯреВрд▓

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


рдЫрд╡рд┐


рдиреАрдЪреЗ рдореИрдВ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдмрд╛рдд рдХрд░реВрдВрдЧрд╛ рдФрд░ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рд╕рд╛рде рджрд┐рдЦрд╛рдКрдВрдЧрд╛ рдХрд┐ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд░рдирд╛ рд╣реИред


рдЧреЛрдирдХреА рдХрд╛ рдЬрдиреНрдо рдХреИрд╕реЗ рд╣реБрдЖ рдерд╛


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


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


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


  1. рдПрдкреАрдЖрдИ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕реЗрд╡рд╛рдУрдВ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░реЗрдВ , рдХреНрдпреЛрдВрдХрд┐ рд╕реЗрд╡рд╛ рдХреА рд▓рдЧрднрдЧ рд╕рднреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдЗрд╕рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХреА рдЬрд╛рддреА рд╣реИ
  2. рдЬреИрд╕рд╛ рдХрд┐ рд╡реЗ рдХрд╣рддреЗ рд╣реИрдВ, "рд╣рдорд╛рд░реЗ CI / CD рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдПрдХреАрдХреГрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рдкреНрд░рдХреНрд╖реЗрдкрдг рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ ," рдмрдЯрди рджреНрд╡рд╛рд░рд╛ рд╕рдВрдЪрд╛рд▓рд┐рдд "
  3. рд▓реЗрдЦрди рдкрд░реАрдХреНрд╖рдг рдЕрд▓рдЧ-рдерд▓рдЧ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП , рдЕрд░реНрдерд╛рддреН , рди рдХреЗрд╡рд▓ рдПрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдкрд░реАрдХреНрд╖рдг рд▓рд┐рдЦ рд╕рдХрддрд╛ рд╣реИ, рдЖрджрд░реНрд╢ рд░реВрдк рд╕реЗ рдПрдХ рд╡реНрдпрдХреНрддрд┐ рдЬреЛ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рдирд╣реАрдВ рд╣реИред

рддреЛ рдЧреЛрдирдХреА рдХрд╛ рдЬрдиреНрдо рд╣реБрдЖред


рддреЛ рдпрд╣ рдХреНрдпрд╛ рд╣реИ?


рдЧреЛрдирдХреА рдПрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп (рдЧреЛрд▓рдВрдЧ рдкрд░ рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдХреЗ рд▓рд┐рдП) рдФрд░ рдПрдХ рдХрдВрд╕реЛрд▓ рдЙрдкрдпреЛрдЧрд┐рддрд╛ (рдХрд┐рд╕реА рднреА рднрд╛рд╖рд╛рдУрдВ рдФрд░ рдкреНрд░реМрджреНрдпреЛрдЧрд┐рдХрд┐рдпреЛрдВ рдореЗрдВ рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдХреЗ рд▓рд┐рдП) рд╣реИ, рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рдЖрдк рдкреВрд░реНрд╡рдирд┐рд░реНрдзрд╛рд░рд┐рдд рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдЕрдкрдиреЗ рдПрдкреАрдЖрдИ рддрдХ рдкрд╣реБрдВрдЪрдХрд░ рд╕реЗрд╡рд╛рдУрдВ рдХреЗ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдФрд░ рдкреНрд░рддрд┐рдЧрдорди рдкрд░реАрдХреНрд╖рдг рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЯреЗрд╕реНрдЯ рд▓рд┐рдкрд┐рдпреЛрдВ рдХреЛ YAML рдлрд╛рдЗрд▓реЛрдВ рдореЗрдВ рд╡рд░реНрдгрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред


рд╕реАрдзреЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ рдХрд╣реЗрдВ, рдЧреЛрдирдХреА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:


  • HTTP рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЗ рд╕рд╛рде рдЕрдкрдиреА рд╕реЗрд╡рд╛ рдкрд░ рдмрдордмрд╛рд░реА рдХрд░реЗрдВ рдФрд░ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рдЗрд╕рдХреА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рдПрдВ рдЕрдкреЗрдХреНрд╖рд┐рдд рд╣реИрдВред рдпрд╣ рдорд╛рдирддрд╛ рд╣реИ рдХрд┐ JSON рдЕрдиреБрд░реЛрдзреЛрдВ рдФрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рдУрдВ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди, рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ, рдпрд╣ рдПрдХ рдЕрд▓рдЧ рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдЬрд╡рд╛рдм рдХреЗ рд╕рд╛рде рд╕рд░рд▓ рдорд╛рдорд▓реЛрдВ рдкрд░ рдХрд╛рдо рдХрд░реЗрдЧрд╛;
  • рдЬреБрдбрд╝рдирд╛рд░ рд╕реЗ рдбреЗрдЯрд╛ (рдпрд╣ рднреА YAML рдлрд╝рд╛рдЗрд▓реЛрдВ рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ) рд╕реЗ рднрд░рдХрд░ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдбреЗрдЯрд╛рдмреЗрд╕ рддреИрдпрд╛рд░ рдХрд░реЗрдВ;
  • рдореЙрдм рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдмрд╛рд╣рд░реА рд╕реЗрд╡рд╛рдУрдВ рдХреА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рдУрдВ рдХрд╛ рдЕрдиреБрдХрд░рдг рдХрд░реЗрдВ (рдпрд╣ рд╕реБрд╡рд┐рдзрд╛ рдХреЗрд╡рд▓ рддрднреА рдЙрдкрд▓рдмреНрдз рд╣реИ рдЬрдм рдЖрдк рдЧреЛрдирдХреА рдХреЛ рдПрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рд░реВрдк рдореЗрдВ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ);
  • рдХрдВрд╕реЛрд▓ рдХреЛ рдкрд░реАрдХреНрд╖рд╛ рдкрд░рд┐рдгрд╛рдо рджреЗрдВ рдпрд╛ рдПрдХ рдПрд▓реНрдпреЛрд░ рд░рд┐рдкреЛрд░реНрдЯ рдЙрддреНрдкрдиреНрди рдХрд░реЗрдВред

рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА
рдбреЙрдХрдЯрд░ рдЫрд╡рд┐


рдЧреЛрдирдХреА рдХреЗ рд╕рд╛рде рд╕реЗрд╡рд╛ рдкрд░реАрдХреНрд╖рдг рдЙрджрд╛рд╣рд░рдг


рдЖрдкрдХреЛ рдкрд╛рда рдХреЗ рд╕рд╛рде рдмреЛрдЭ рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВ рд╢рдмреНрджреЛрдВ рд╕реЗ рдХрд░реНрдореЛрдВ рдХреА рдУрд░ рдЬрд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдФрд░ рдпрд╣реАрдВ рдХреБрдЫ рдПрдкреАрдЖрдИ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рддрд╛ рд╣реВрдВ рдФрд░ рдмрддрд╛рддрд╛ рд╣реВрдВ рдХрд┐ рдХреИрд╕реЗ рд░рд╛рд╕реНрддреЗ рдореЗрдВ рдкрд░реАрдХреНрд╖рдг рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд▓рд┐рдЦреА рдЬрд╛рддреА рд╣реИрдВред


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


//    const ( lightRed = "red" lightYellow = "yellow" lightGreen = "green" ) //      type trafficLights struct { currentLight string `json:"currentLight"` mutex sync.RWMutex `json:"-"` } //   var lights = trafficLights{ currentLight: lightRed, } func main() { //       http.HandleFunc("/light/get", func(w http.ResponseWriter, r *http.Request) { lights.mutex.RLock() defer lights.mutex.RUnlock() resp, err := json.Marshal(lights) if err != nil { log.Fatal(err) } w.Write(resp) }) //       http.HandleFunc("/light/set", func(w http.ResponseWriter, r *http.Request) { lights.mutex.Lock() defer lights.mutex.Unlock() request, err := ioutil.ReadAll(r.Body) if err != nil { log.Fatal(err) } var newTrafficLights trafficLights if err := json.Unmarshal(request, &newTrafficLights); err != nil { http.Error(w, err.Error(), http.StatusBadRequest) return } if err := validateRequest(&newTrafficLights); err != nil { http.Error(w, err.Error(), http.StatusBadRequest) return } lights = newTrafficLights }) //   () log.Fatal(http.ListenAndServe(":8080", nil)) } func validateRequest(lights *trafficLights) error { if lights.currentLight != lightRed && lights.currentLight != lightYellow && lights.currentLight != lightGreen { return fmt.Errorf("incorrect current light: %s", lights.currentLight) } return nil } 

Main.go рдХреЗ рд▓рд┐рдП рдкреВрд░реНрдг рд╕реНрд░реЛрдд рдХреЛрдб рдпрд╣рд╛рдБ рд╣реИ ред


рдкреНрд░реЛрдЧреНрд░рд╛рдо рдЪрд▓рд╛рдПрдБ:


 go run . 

15 рдорд┐рдирдЯ рдореЗрдВ рдмрд╣реБрдд рддреЗрдЬреА рд╕реЗ рд╕реНрдХреЗрдЪ рдХрд┐рдпрд╛! рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рд╡рд╣ рдХрд╣реАрдВ рдЧрд▓рдд рдерд╛, рдЗрд╕рд▓рд┐рдП рд╣рдо рдкрд░реАрдХреНрд╖рдг рдФрд░ рдЬрд╛рдВрдЪ рд▓рд┐рдЦреЗрдВрдЧреЗред


рдЧреЛрдирдХреА рдбрд╛рдЙрдирд▓реЛрдб рдФрд░ рдЪрд▓рд╛рдПрдВ:


 mkdir -p tests/cases docker run -it -v $(pwd)/tests:/tests lamoda/gonkey -tests tests/cases -host host.docker.internal:8080 

рдпрд╣ рдХрдорд╛рдВрдб рдбреЙрдХ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЧреЛрдирдХреА рдХреЗ рд╕рд╛рде рдЫрд╡рд┐ рд╢реБрд░реВ рдХрд░рддрд╛ рд╣реИ, рдХрдВрдЯреЗрдирд░ рдХреЗ рдЕрдВрджрд░ рдкрд░реАрдХреНрд╖рдгреЛрдВ / рдорд╛рдорд▓реЛрдВ рдХреА рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдХреЛ рдЧрд┐рдирддрд╛ рд╣реИ рдФрд░ -рд╕реНрдЯреЗрд╕реНрдЯ рдкрд░реАрдХреНрд╖рдг / рдорд╛рдорд▓реЛрдВ / -рд╣реЛрд╕реНрдЯ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд╕рд╛рде рдЧреЛрдирдХреА рд╢реБрд░реВ рдХрд░рддрд╛ рд╣реИред


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


 go get github.com/lamoda/gonkey go run github.com/lamoda/gonkey -tests tests/cases -host localhost:8080 

рд▓реЙрдиреНрдЪ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдФрд░ рдкрд░рд┐рдгрд╛рдо рдорд┐рд▓рд╛:


 Failed tests: 0/0 

рдХреЛрдИ рдкрд░реАрдХреНрд╖рдг рдирд╣реАрдВ - рдЬрд╛рдБрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рднреА рдирд╣реАрдВред рдкрд╣рд▓рд╛ рдЯреЗрд╕реНрдЯ рд▓рд┐рдЦрддреЗ рд╣реИрдВред рдиреНрдпреВрдирддрдо рд╕рд╛рдордЧреНрд░реА рдХреЗ рд╕рд╛рде рдПрдХ рдлрд╝рд╛рдЗрд▓ рдкрд░реАрдХреНрд╖рдг / рдорд╛рдорд▓реЛрдВ / light_get.yaml рдмрдирд╛рдПрдБ:


 - name: WHEN currentLight is requested MUST return red method: GET path: /light/get response: 200: > { "currentLight": "red" } 

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


рдиреАрдЪреЗ рджреА рдЧрдИ рдлрд╝рд╛рдЗрд▓ рдЕрдиреБрд░реЛрдз рдХреЗ рд╡рд┐рд╡рд░рдг рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддреА рд╣реИ рдЬреЛ рд╕рд░реНрд╡рд░ рдХреЛ рднреЗрдЬрд╛ рдЬрд╛рдПрдЧрд╛: рд╡рд┐рдзрд┐, рдкрдеред рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдХрдо рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЛрдб (200) рдФрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╢рд░реАрд░ рд╣реИ рдЬреЛ рд╣рдо рд╕рд░реНрд╡рд░ рд╕реЗ рдЙрдореНрдореАрдж рдХрд░рддреЗ рд╣реИрдВред


рдкреВрд░реНрдг рдлрд╝рд╛рдЗрд▓ рдкреНрд░рд╛рд░реВрдк README рдореЗрдВ рд╡рд░реНрдгрд┐рдд рд╣реИ ред


рдлрд┐рд░ рд╕реЗ рдЪрд▓рд╛рдПрдВ:


 docker run -it -v $(pwd)/tests:/tests lamoda/gonkey -tests tests/cases -host host.docker.internal:8080 

рдкрд░рд┐рдгрд╛рдо:


  Name: WHEN currentlight is requested MUST return red Request: Method: GET Path: /light/get Query: Body: <no body> Response: Status: 200 OK Body: {} Result: ERRORS! Errors: 1) at path $ values do not match: expected: { "currentLight": "red" } actual: {} Failed tests: 1/1 

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


  expected: { "currentLight": "red" } 

рдХрд╛рд░рдг рд╕рд░рд▓ рд╣реИ: рдореИрдВ рд▓рд┐рдЦрдирд╛ рднреВрд▓ рдЧрдпрд╛ рддрд╛рдХрд┐ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рд╕реЗрд╡рд╛ рд╕рд╛рдордЧреНрд░реА рдкреНрд░рдХрд╛рд░ рдХреЗ рдЖрд╡реЗрджрди / json рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░реЗред рд╣рдо рдареАрдХ рдХрд░рддреЗ рд╣реИрдВ:


 //       http.HandleFunc("/light/get", func(w http.ResponseWriter, r *http.Request) { lights.mutex.RLock() defer lights.mutex.RUnlock() resp, err := json.Marshal(lights) if err != nil { log.Fatal(err) } w.Header().Add("Content-Type", "application/json") // <--  w.Write(resp) }) 

рд╣рдо рд╕реЗрд╡рд╛ рдХреЛ рдкреБрдирдГ рдЖрд░рдВрдн рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдлрд┐рд░ рд╕реЗ рдкрд░реАрдХреНрд╖рдг рдЪрд▓рд╛рддреЗ рд╣реИрдВ:


  Name: WHEN currentlight is requested MUST return red Request: Method: GET Path: /light/get Query: Body: <no body> Response: Status: 200 OK Body: {} Result: ERRORS! Errors: 1) at path $ key is missing: expected: currentLight actual: <missing> 

рдорд╣рд╛рди, рдкреНрд░рдЧрддрд┐ рд╣реИред рдЧреЛрдиреНрдХреА рдЕрдм рд╕рдВрд░рдЪрдирд╛ рдХреЛ рдкрд╣рдЪрд╛рдирддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдЕрднреА рднреА рдЧрд▓рдд рд╣реИ: рдЙрддреНрддрд░ рдЦрд╛рд▓реА рд╣реИред рдХрд╛рд░рдг рдпрд╣ рд╣реИ рдХрд┐ рдореИрдВрдиреЗ рдЯрд╛рдЗрдк рдкрд░рд┐рднрд╛рд╖рд╛ рдореЗрдВ рдПрдХ рдЧреИрд░-рдирд┐рд░реНрдпрд╛рдд рдпреЛрдЧреНрдп рд╡рд░реНрддрдорд╛рди рд▓рд╛рдЗрдЯ рдлрд╝реАрд▓реНрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рд╣реИ:


 //      type trafficLights struct { currentLight string `json:"currentLight"` mutex sync.RWMutex `json:"-"` } 

рдЧреЛ рдореЗрдВ, рд▓реЛрдЕрд░рдХреЗрд╕ рдЕрдХреНрд╖рд░ рдХреЗ рд╕рд╛рде рдирд╛рдорд┐рдд рдПрдХ рд╕рдВрд░рдЪрдирд╛ рдХреНрд╖реЗрддреНрд░ рдХреЛ рдЧреИрд░-рдирд┐рд░реНрдпрд╛рдд рдпреЛрдЧреНрдп рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдХрд┐ рдЕрдиреНрдп рдкреИрдХреЗрдЬреЛрдВ рд╕реЗ рджреБрд░реНрдЧрдо рд╣реИред JSON рдзрд╛рд░рд╛рд╡рд╛рд╣рд┐рдХ рдЗрд╕реЗ рдирд╣реАрдВ рджреЗрдЦрддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рд╣рдо рд╕рд╣реА рдХрд░рддреЗ рд╣реИрдВ: рд╣рдо рдлрд╝реАрд▓реНрдб рдХреЛ рдПрдХ рдмрдбрд╝реЗ рдЕрдХреНрд╖рд░ рдХреЗ рд╕рд╛рде рдмрдирд╛рддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдпрд╣ рдирд┐рд░реНрдпрд╛рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:


 //      type trafficLights struct { urrentLight string `json:"currentLight"` // <--   mutex sync.RWMutex `json:"-"` } 

рд╕реЗрд╡рд╛ рдХреЛ рдкреБрдирд░рд╛рд░рдВрдн рдХрд░реЗрдВред рдлрд┐рд░ рд╕реЗ рдкрд░реАрдХреНрд╖рдг рдЪрд▓рд╛рдПрдВред


 Failed tests: 0/1 

рдЗрдореНрддрд┐рд╣рд╛рди рдкрд╛рд╕ рд╣реЛ рдЧрдП!


рд╣рдо рджреВрд╕рд░реА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд▓рд┐рдЦреЗрдВрдЧреЗ рдЬреЛ рд╕реЗрдЯ рд╡рд┐рдзрд┐ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░реЗрдЧреАред рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕рд╛рдордЧреНрд░реА рдХреЗ рд╕рд╛рде рдлрд╝рд╛рдЗрд▓ рдкрд░реАрдХреНрд╖рдг / рдорд╛рдорд▓реЗ / light_set.yaml рднрд░реЗрдВ:


 - name: WHEN set is requested MUST return no response method: POST path: /light/set request: > { "currentLight": "green" } response: 200: '' - name: WHEN get is requested MUST return green method: GET path: /light/get response: 200: > { "currentLight": "green" } 

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


рдПрдХ рд╣реА рдЖрджреЗрд╢ рдХреЗ рд╕рд╛рде рдкрд░реАрдХреНрд╖рдг рдЪрд▓рд╛рдПрдВ:


 docker run -it -v $(pwd)/tests:/tests lamoda/gonkey -tests tests/cases -host host.docker.internal:8080 

рдкрд░рд┐рдгрд╛рдо:


 Failed tests: 0/3 

рдПрдХ рд╕рдлрд▓ рдкрд░рд┐рдгрд╛рдо, рд▓реЗрдХрд┐рди рд╣рдо рднрд╛рдЧреНрдпрд╢рд╛рд▓реА рдереЗ рдХрд┐ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдЙрд╕ рдХреНрд░рдо рдореЗрдВ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдЬрд┐рд╕рдХреА рд╣рдореЗрдВ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереА: рдкрд╣рд▓реЗ light_get, рдФрд░ рдлрд┐рд░ light_setред рдЕрдЧрд░ рдЙрдиреНрд╣реЛрдВрдиреЗ рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд рдХрд┐рдпрд╛ рддреЛ рдХреНрдпрд╛ рд╣реЛрдЧрд╛? рдЪрд▓реЛ рдирд╛рдо рдмрджрд▓реЗрдВ:


 mv tests/cases/light_set.yaml tests/cases/_light_set.yaml 

рдФрд░ рдлрд┐рд░ рд╕реЗ рджреМрдбрд╝реЗрдВ:


 Errors: 1) at path $.currentLight values do not match: expected: red actual: green Failed tests: 1/3 

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


рдЗрд╕ рддрдереНрдп рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рд╣реИ рдХрд┐ рдкрд░реАрдХреНрд╖рдг рд╕рдВрджрд░реНрдн рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ, рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреА рд╢реБрд░реБрдЖрдд (рдпрд╛рдиреА, рдлрд╝рд╛рдЗрд▓ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ) рд╕реЗрд╡рд╛ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИ, рдЬрд┐рд╕реЗ рд╣рдо рдЖрдо рддреМрд░ рдкрд░ рд╕реЗрдЯ рдкрд░реАрдХреНрд╖рдг рдореЗрдВ рдХрд░рддреЗ рд╣реИрдВ - рдкрд╣рд▓реЗ рд╣рдо рдЬреНрдЮрд╛рдд рдореВрд▓реНрдп рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рдПрдХ рдЬреНрдЮрд╛рдд рдкреНрд░рднрд╛рд╡ рдкреИрджрд╛ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ рдЬрд╛рдВрдЪ рд▓реЗрдВ рдХрд┐ рдкреНрд░рднрд╛рд╡ рдХрд╛ рдкреНрд░рднрд╛рд╡ рдерд╛ред


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


рдЗрд╕ рдмреАрдЪ, рдореИрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕рдорд╛рдзрд╛рди рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд░рддрд╛ рд╣реВрдВред рдЪреВрдВрдХрд┐ рд╕реЗрдЯ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рд╣рдо рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдкреНрд░рдХрд╛рд╢ / рд╕реЗрдЯ рд╡рд┐рдзрд┐ рдФрд░ рдкреНрд░рдХрд╛рд╢ / рдкреНрд░рд╛рдкреНрдд рд╡рд┐рдзрд┐ рджреЛрдиреЛрдВ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рд╣рдореЗрдВ рдмрд╕ light_get рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдЬреЛ рдХрд┐ рд╕рдВрджрд░реНрдн рд╕рдВрд╡реЗрджрдирд╢реАрд▓ рд╣реИред рдореИрдВ рдЗрд╕реЗ рд╣рдЯрд╛ рджреЗрддрд╛ рд╣реВрдВ, рдФрд░ рд╢реЗрд╖ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рдирд╛рдо рдмрджрд▓ рджреЗрддрд╛ рд╣реВрдВ рддрд╛рдХрд┐ рдирд╛рдо рд╕рд╛рд░ рдХреЛ рджрд░реНрд╢рд╛рддрд╛ рд╣реИред


 rm tests/cases/light_get.yaml mv tests/cases/_light_set.yaml tests/cases/light_set_get.yaml 

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


рдПрдХ рдирдпрд╛ рдкрд░реАрдХреНрд╖рдг / рдорд╛рдорд▓реЗ рдмрдирд╛рдПрдБ / light_set_get_negative.yaml рд╕реНрдХреНрд░рд┐рдкреНрдЯ:


 - name: WHEN set is requested MUST return no response method: POST path: /light/set request: > { "currentLight": "green" } response: 200: '' - name: WHEN incorrect color is passed MUST return error method: POST path: /light/set request: > { "currentLight": "blue" } response: 400: > incorrect current light: blue - name: WHEN color is missing MUST return error method: POST path: /light/set request: > {} response: 400: > incorrect current light: - name: WHEN get is requested MUST have color untouched method: GET path: /light/get response: 200: > { "currentLight": "green" } 

рд╡рд╣ рдЬрд╛рдБрдЪрддрд╛ рд╣реИ рдХрд┐:


  • рдЬрдм рдЧрд▓рдд рд░рдВрдЧ рдкреНрд░рд╕рд╛рд░рд┐рдд рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдПрдХ рддреНрд░реБрдЯрд┐ рд╣реЛрддреА рд╣реИ;
  • рдЬрдм рд░рдВрдЧ рдкреНрд░рд╕рд╛рд░рд┐рдд рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдПрдХ рддреНрд░реБрдЯрд┐ рд╣реЛрддреА рд╣реИ;
  • рдЧрд▓рдд рд░рдВрдЧ рд╕рдВрдЪрд░рдг рдпрд╛рддрд╛рдпрд╛рдд рдкреНрд░рдХрд╛рд╢ рдХреА рдЖрдВрддрд░рд┐рдХ рд╕реНрдерд┐рддрд┐ рдХреЛ рдирд╣реАрдВ рдмрджрд▓рддрд╛ рд╣реИред

рдЪрд▓рд╛рдПрдБ:


 Failed tests: 0/6 

рд╕рдм рдХреБрдЫ рдареАрдХ рд╣реИ :)


рдЧреЛрдирдХреА рдХреЛ рдПрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рд░реВрдк рдореЗрдВ рдЬреЛрдбрд╝рдирд╛


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


рд▓реЗрдХрд┐рди рд╣рдорд╛рд░реЗ рд╕реНрд╡рдпрдВ рдХреЗ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рд▓рд┐рдЦрд┐рдд рд░реВрдк рдореЗрдВ, рдЧреЛрдирдХреА рдХреЛ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдФрд░ рдЕрдзрд┐рдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рддрд░реАрдХрд╛ рд╣реИ - рдЗрд╕реЗ рдПрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рд░реВрдк рдореЗрдВ рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╕реЗ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдПред рдпрд╣ рдЕрдЧреНрд░рд┐рдо рдореЗрдВ рдХреБрдЫ рднреА рд╕рдВрдХрд▓рд┐рдд рдХрд┐рдП рдмрд┐рдирд╛ - рди рддреЛ рдЧреЛрдирдХреА, рдФрд░ рди рд╣реА рдкрд░рд┐рдпреЛрдЬрдирд╛ - рдХреЗрд╡рд▓ go test рдЪрд▓рд╛рдХрд░ рдЪрд▓рд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ред


рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рд╕рд╛рде, рд╣рдо рдПрдХ рдЗрдХрд╛рдИ рдкрд░реАрдХреНрд╖рдг рд▓рд┐рдЦрдирд╛ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд╢рд░реАрд░ рдореЗрдВ рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрд░рддреЗ рд╣реИрдВ:


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

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


рдореИрдВрдиреЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рдХреЛ рдПрдХ рдЕрд▓рдЧ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рд░рдЦрд╛ рд╣реИ:


 func initServer() { //       http.HandleFunc("/light/get", func(w http.ResponseWriter, r *http.Request) { //   }) //       http.HandleFunc("/light/set", func(w http.ResponseWriter, r *http.Request) { //   }) } 

рдореБрдЦреНрдп рдХрд╛рд░реНрдп рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реЛрдЧрд╛:


 func main() { initServer() //   () log.Fatal(http.ListenAndServe(":8080", nil)) } 

рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рдВрд╢реЛрдзрд┐рдд рдореБрдЦреНрдп рдЧреЛ рдлрд╝рд╛рдЗрд▓ ред


рдЗрд╕рдиреЗ рд╣рдорд╛рд░реЗ рд╣рд╛рдереЛрдВ рдХреЛ рдореБрдХреНрдд рдХрд░ рджрд┐рдпрд╛, рддреЛ рдЪрд▓рд┐рдП рдПрдХ рдкрд░реАрдХреНрд╖рд╛ рд▓рд┐рдЦрдирд╛ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред рдореИрдВ рдПрдХ func_test.go рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рддрд╛ рд╣реВрдВ:


 func Test_API(t *testing.T) { initServer() srv := httptest.NewServer(nil) runner.RunWithTesting(t, &runner.RunWithTestingParams{ Server: srv, TestsDir: "tests/cases", }) } 

рдпрд╣рд╛рдБ рдкреВрд░реНрдг func_test.go рдлрд╝рд╛рдЗрд▓ рд╣реИ ред


рд╡рд╣ рд╕рдм рд╣реИ! рд╣рдо рдЬрд╛рдБрдЪ рдХрд░рддреЗ рд╣реИрдВ:


 go test ./... 

рдкрд░рд┐рдгрд╛рдо:


 ok github.com/lamoda/gonkey/examples/traffic-lights-demo 0.018s 

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


рдПрдХ рдПрд▓реНрдпреЛрд░ рд░рд┐рдкреЛрд░реНрдЯ рдмрдирд╛рдПрдБ


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


 docker run -it -v $(pwd)/tests:/tests -w /tests lamoda/gonkey -tests cases/ -host host.docker.internal:8080 -allure 

рд░рд┐рдкреЛрд░реНрдЯ рдХреЛ рд╡рд░реНрддрдорд╛рди рдХрд╛рд░реНрдпрд╢реАрд▓ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдХреЗ рдПрд▓реНрдпреЛрд░-рд░рд┐рдЬрд▓реНрдЯ рд╕рдмрдбрд╛рдпрд░реЗрдХреНрдЯ рдореЗрдВ рд░рдЦрд╛ рдЬрд╛рдПрдЧрд╛ (рдЗрд╕реАрд▓рд┐рдП рдореИрдВрдиреЗ -w / рдкрд░реАрдХреНрд╖рдг рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдпрд╛ рд╣реИ)ред


рдЧреЛрдирдХреА рдХреЛ рдПрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рд░реВрдк рдореЗрдВ рдЬреЛрдбрд╝рдиреЗ рдкрд░, рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рдкрд░реНрдпрд╛рд╡рд░рдг рдЪрд░ GONKEY_ALLURE_DIR рдХреЛ рд╕реЗрдЯ рдХрд░рдХреЗ Allure рд░рд┐рдкреЛрд░реНрдЯ рд╕рдХреНрд░рд┐рдп рд╣реЛ рдЬрд╛рддреА рд╣реИ:


 GONKEY_ALLURE_DIR="tests/allure-results" go test ./тАж 

рдлрд╛рдЗрд▓реЛрдВ рдореЗрдВ рджрд░реНрдЬ рдХрд┐рдП рдЧрдП рдкрд░реАрдХреНрд╖рд╛ рдкрд░рд┐рдгрд╛рдо рдХрдорд╛рдВрдб рджреНрд╡рд╛рд░рд╛ рдПрдХ рдЗрдВрдЯрд░реИрдХреНрдЯрд┐рд╡ рд░рд┐рдкреЛрд░реНрдЯ рдореЗрдВ рдмрджрд▓ рджрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ:


 allure generate allure serve 

рд░рд┐рдкреЛрд░реНрдЯ рдХреИрд╕реА рджрд┐рдЦрддреА рд╣реИ:
рдЫрд╡рд┐


рдирд┐рд╖реНрдХрд░реНрд╖


рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд▓реЗрдЦреЛрдВ рдореЗрдВ, рдореИрдВ рдЧреЛрдирдХреА рдореЗрдВ рдЬреБрдбрд╝рдирд╛рд░ рдХреЗ рдЙрдкрдпреЛрдЧ рдкрд░ рдФрд░ рдореЛрдЬрд╝реЗрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдиреНрдп рд╕реЗрд╡рд╛рдУрдВ рдХреА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреА рдирдХрд▓ рдХрд░рдиреЗ рдкрд░ рдзреНрдпрд╛рди рджреВрдВрдЧрд╛ред


рдореИрдВ рдЖрдкрдХреЛ рдЕрдкрдиреА рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдореЗрдВ рдЧреЛрдирдХреА рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдордВрддреНрд░рд┐рдд рдХрд░рддрд╛ рд╣реВрдВ, рдЗрд╕рдХреЗ рд╡рд┐рдХрд╛рд╕ рдореЗрдВ рднрд╛рдЧ рд▓реЗрддрд╛ рд╣реВрдВ (рдкреВрд▓ рдЕрдиреБрд░реЛрдзреЛрдВ рдХрд╛ рд╕реНрд╡рд╛рдЧрдд рд╣реИ!) рдпрд╛ рдЗрд╕реЗ рдЧрд┐рддреБрдм рдкрд░ рдПрдХ рддрд╛рд░рд╛рдВрдХрди рдЪрд┐рд╣реНрди рдХреЗ рд╕рд╛рде рдЪрд┐рд╣реНрдирд┐рдд рдХрд░реЗрдВ рдпрджрд┐ рдпрд╣ рдкрд░рд┐рдпреЛрдЬрдирд╛ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдЖрдкрдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реЛ рд╕рдХрддреА рд╣реИред

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


All Articles