рд╣реЗрдирд░рд┐рдХ рдирд╛рдЗрдмреЗрд░рдЧ рдХреЗ рд▓реЗрдЦ рдХрд╛ рдЕрдиреБрд╡рд╛рдж "рдЯреНрд░реЗрдВрдЪ рд╕реЗ ATDD" (рдЙрдиреНрдирдд рдХреЗ рд╕рд╛рде ATDD)

рдореВрд▓: www.infoq.com/articles/atdd-from-the-trenches

рдЙрдиреНрдирдд рдХреЗ рд╕рд╛рде ATDD


рд╢реБрд░реБрдЖрддреА рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рд╕реНрд╡реАрдХреГрддрд┐ рдкрд░реАрдХреНрд╖рдг рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╡рд┐рдХрд╛рд╕

рдЫрд╡рд┐

рдпрджрд┐ рдЖрдк рдХрднреА рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд░рд╣реЗ рд╣реИрдВ:

рдлрд┐рд░ рдпрд╣ рд▓реЗрдЦ рдЖрдкрдХреЗ рд▓рд┐рдП рдПрдХ рдареЛрд╕ рдЙрджрд╛рд╣рд░рдг рд╣реИ рдХрд┐ рд╡рд┐рд░рд╛рд╕рдд рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдХреЗ рд╕рд╛рде рдореМрдЬреВрджрд╛ рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдореЗрдВ рд╕реНрд╡реАрдХреГрддрд┐ рдкрд░реАрдХреНрд╖рдгреЛрдВ (рд╕реНрд╡реАрдХреГрддрд┐-рдкрд░реАрдХреНрд╖рдг рд╕рдВрдЪрд╛рд▓рд┐рдд рд╡рд┐рдХрд╛рд╕) рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╡рд┐рдХрд╛рд╕ рдХреИрд╕реЗ рд╢реБрд░реВ рдХрд░реЗрдВред рдпрд╣ рддрдХрдиреАрдХреА рдЛрдг рдХреА рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рдмрддрд╛рддрд╛ рд╣реИред
рдпрд╣ рд╕рднреА рджреЛрд╖реЛрдВ рдФрд░ рдХрдорд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╕реЗ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ, рди рдХрд┐ рдПрдХ рдкреБрд╕реНрддрдХ рд╕реЗ рдПрдХ рдкреЙрд▓рд┐рд╢ рдЕрднреНрдпрд╛рд╕ред рддреЛ рдЕрдкрдиреЗ рдмрд░реНрде рдкрд░ рд░рдЦреЛред рдореИрдВ рдЬрд╛рд╡рд╛ рдФрд░ JUnit рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реВрдВрдЧрд╛, рдмрд┐рдирд╛ рдХрд┐рд╕реА рдлреИрдВрд╕реА рддреАрд╕рд░реЗ рдкрдХреНрд╖ рдХреЗ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ (рдЬреЛ рдЖрдорддреМрд░ рдкрд░ рджреБрд░реБрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ) рдХреЗ рдмрд┐рдирд╛ред
рдЪреЗрддрд╛рд╡рдиреА: рдореИрдВ рдпрд╣ рджрд╛рд╡рд╛ рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реВрдБ рдХрд┐ рдпрд╣ рдПрдХрдорд╛рддреНрд░ рд╕рд╣реА рддрд░реАрдХрд╛ рд╣реИ, рдХрдИ рдЕрдиреНрдп ATDD "рд╢реИрд▓рд┐рдпрд╛рдБ" рд╣реИрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рдмрд╣реБрдд рдХреБрдЫ рдирдпрд╛ рдФрд░ рдЕрднрд┐рдирд╡ рдирд╣реАрдВ рд╣реИ, рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рд╕рд┐рджреНрдз рджреГрд╖реНрдЯрд┐рдХреЛрдг рдФрд░ рдЕрдиреБрднрд╡ рдмрд╕ рдпрд╣рд╛рдБ рдкрд╣рд▓реЗ рд╣рд╛рде рд╕реЗ рд╡рд░реНрдгрд┐рдд рд╣реИрдВред

рдЬреЛ рдореИрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛

рдХреБрдЫ рджрд┐рдиреЛрдВ рдкрд╣рд▓реЗ, рдореИрдВрдиреЗ webwhiteboard.com (рдореЗрд░реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдПрдХ рд╢реМрдХ рд╣реИ) рдХреЗ рд▓рд┐рдП рдкрд╛рд╕рд╡рд░реНрдб рд╕реБрд░рдХреНрд╖рд╛ рдмрдирд╛рдирд╛ рд╢реБрд░реВ рдХрд░ рджрд┐рдпрд╛ рд╣реИред рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд▓рдВрдмреЗ рд╕рдордп рд╕реЗ рдкрд╛рд╕рд╡рд░реНрдб-рд╕реБрд░рдХреНрд╖рд┐рдд рд╡рд░реНрдЪреБрдЕрд▓ рд╡реНрд╣рд╛рдИрдЯрдмреЛрд░реНрдб рдХреА рдХреНрд╖рдорддрд╛ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣ рд░рд╣реЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдЕрдм рдпрд╣ рдХрд░рдиреЗ рдХрд╛ рд╕рдордп рд╣реИред
рд╢рдмреНрджреЛрдВ рдореЗрдВ рдпрд╣ рд╕рд░рд▓ рд▓рдЧрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЖрдкрдХреЛ рдбрд┐рдЬрд╝рд╛рдЗрди рдореЗрдВ рдХрд╛рдлреА рдмрджрд▓рд╛рд╡ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЕрдм рддрдХ, рдпрд╣ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ webwhiteboards.com рдХрд╛ рдЙрдкрдпреЛрдЧ рдЕрдирд╛рдо рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рджреНрд╡рд╛рд░рд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдмрд┐рдирд╛ рдХрд┐рд╕реА рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдирд╛рдо рдпрд╛ рдкрд╛рд╕рд╡рд░реНрдб рдХреЗред рдмреЛрд░реНрдб рдХреА рд╕реБрд░рдХреНрд╖рд╛ рдХрд░рдиреЗ рдореЗрдВ рдХреМрди рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП? рдХреМрди рдЙрд╕реЗ рдПрдХреНрд╕реЗрд╕ рдХрд░ рдкрд╛рдПрдЧрд╛? рдЕрдЧрд░ рдореИрдВ рдЕрдкрдирд╛ рдкрд╛рд╕рд╡рд░реНрдб рднреВрд▓ рдЬрд╛рдКрдВ рддреЛ рдХреНрдпрд╛ рд╣реЛрдЧрд╛? рдЗрд╕реЗ рд╕рд░рд▓ рддрд░реАрдХреЗ рд╕реЗ рдХреИрд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рдП, рд▓реЗрдХрд┐рди рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рдХрд╛рдлреА рд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рддрд░реАрдХреЗ рд╕реЗ?
Webwhiteboard рдХреЛрдб рдпреВрдирд┐рдЯ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдФрд░ рдПрдХреАрдХрд░рдг рдкрд░реАрдХреНрд╖рдгреЛрдВ рджреНрд╡рд╛рд░рд╛ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХрд╡рд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
рд▓реЗрдХрд┐рди рд╕реНрд╡реАрдХреГрддрд┐ рдкрд░реАрдХреНрд╖рдг, рдЕрд░реНрдерд╛рддреН, рдЕрдВрдд рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ рд╕рднреА рдкрд░рддреЛрдВ рд╕реЗ рдЧреБрдЬрд░рдиреЗ рд╡рд╛рд▓реЗ рдкрд░реАрдХреНрд╖рдг рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрдиреБрдкрд╕реНрдерд┐рдд рд╣реИрдВред

рдбрд┐рдЬрд╛рдЗрди рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ

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


рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рджреГрд╖реНрдЯрд┐рдХреЛрдг

рдмрд╣реБрдд рдЕрдирд┐рд╢реНрдЪрд┐рддрддрд╛ рд╣реИред рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдерд╛ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рди рдХрд┐ рдЗрд╕рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХреИрд╕реЗ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрд╣рд╛рдБ рдореИрдВ рдХреНрдпрд╛ рдХрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ рд╣реИ (ATDD рд╣реА):

рдЗрди рдЪрд░рдгреЛрдВ рдХреЛ рдХрдИ рдмрд╛рд░ рджреЛрд╣рд░рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдкреНрд░рддреНрдпреЗрдХ рдЪрд░рдг рдкрд░, рдореБрдЭреЗ рдкрд┐рдЫрд▓реЗ рдЪрд░рдг рдХреЛ рд╡рд╛рдкрд╕ рдЬрд╛рдиреЗ рдФрд░ рд╕рд╣реА рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИ (рдЬреЛ рдореИрдВрдиреЗ рдЕрдХреНрд╕рд░ рдХрд┐рдпрд╛ рдерд╛)ред

рдЪрд░рдг 1: рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд╛ рджрд╕реНрддрд╛рд╡реЗрдЬ

рдХрд▓реНрдкрдирд╛ рдХреАрдЬрд┐рдП рдХрд┐ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рддреИрдпрд╛рд░ рд╣реИред рдорд╛рдиреЛ рд╕реНрд╡рд░реНрдЧ рд╕реЗ рдХреЛрдИ рджреЗрд╡рджреВрдд рдЖрдпрд╛ рдФрд░ рд╕реЛрддреЗ рд╕рдордп рд╕рдм рдХреБрдЫ рдХрд┐рдпрд╛ред рд╕рдЪ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд▓рдЧрддрд╛ рд╣реИ! рдореИрдВ рдХреИрд╕реЗ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ рдХрд┐ рдХрд╛рдо рдкрд╣рд▓реЗ рд╣реА рд╣реЛ рдЪреБрдХрд╛ рд╣реИ? рдкрд╣рд▓реЗ рдЬрд╛рдБрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреМрди рд╕рд╛ рдкрд░рд┐рджреГрд╢реНрдп? рдЖрдЗрдП рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ:
  1. рдореИрдВ рдПрдХ рдирдпрд╛ рдмреЛрд░реНрдб рдмрдирд╛ рд░рд╣рд╛ рд╣реВрдВ
  2. рдореИрдВрдиреЗ рдЙрд╕ рдкрд░ рдПрдХ рдкрд╛рд╕рд╡рд░реНрдб рд╕реЗрдЯ рдХрд┐рдпрд╛
  3. рдЬреЛ рдореЗрд░рд╛ рдмреЛрд░реНрдб рдЦреЛрд▓рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реИ, рд╕рд┐рд╕реНрдЯрдо рдкрд╛рд╕рд╡рд░реНрдб рдорд╛рдВрдЧрддрд╛ рд╣реИ
  4. рдЬреЛ рдЧрд▓рдд рдкрд╛рд╕рд╡рд░реНрдб рджрд░реНрдЬ рдХрд░рддрд╛ рд╣реИ, рдкреНрд░рд╡реЗрд╢ рдирд┐рд╖реЗрдз рд╣реИ
  5. рдЬреЛ рдлрд┐рд░ рд╕реЗ рдХреЛрд╢рд┐рд╢ рдХрд░рддрд╛ рд╣реИ, рд╕рд╣реА рдкрд╛рд╕рд╡рд░реНрдб рджрд░реНрдЬ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдкрд╣реБрдВрдЪ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИред (рдЖрдкрдХреЛ рдпрд╣ рд╕рдордЭрдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рд╣реИ рдХрд┐ "рдЬреЛ" рдореИрдВ рд╣реА рд╣реВрдВ, рдмрд╕ рджреВрд╕рд░реЗ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рд╕реЗ)ред

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

рдЪрд░рдг 2: рдПрдХ рд▓реЙрдиреНрдЪ рд╕реНрд╡реАрдХреГрддрд┐ рдкрд░реАрдХреНрд╖рдг рдореЗрдВ рдЗрд╕реЗ рдЪрд╛рд▓реВ рдХрд░реЗрдВ

рдпрд╣ рдЗрддрдирд╛ рд╕рд░рд▓ рдирд╣реАрдВ рд╣реИред рдХреЛрдИ рдЕрдиреНрдп рд╕реНрд╡реАрдХреГрддрд┐ рдкрд░реАрдХреНрд╖рдг рдирд╣реАрдВ рд╣реИрдВ, рддреЛ рдореИрдВ рдХрд╣рд╛рдВ рд╕реЗ рд╢реБрд░реВ рдХрд░реВрдВ? рдирдИ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рдХреБрдЫ рдмрд╛рд╣рд░реА рдШрдЯрдХ рдХреЗ рд╕рд╛рде рдмрд╛рддрдЪреАрдд рдХрд░реЗрдЧреА (рдкрд╣рд▓реЗ рдореИрдВрдиреЗ рдЬреЗрдиреЗрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ рдерд╛)ред рдкреЙрдк-рдЕрдк рд╕рдВрд╡рд╛рдж, рдЯреЛрдХрди, рдкреГрд╖реНрда рд╕рдВрдХреНрд░рдордг рдФрд░ рдЙрд╕ рд╕рдм рдХреЗ рд╕рд╛рде рдЬрдЯрд┐рд▓ рд╡реЗрдм рд╕рд╛рдорд╛рди рдХрд╛ рдПрдХ рдбреЗрдЯрд╛рдмреЗрд╕ рдФрд░ рдПрдХ рдЧреБрдЪреНрдЫрд╛ рднреА рд╣реЛрдЧрд╛ред рд╡рд╛рд╣ред
рдпрд╣ рдХрджрдо рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХрд╛ рд╕рдордп рд╣реИред "рдореИрдВ рдПрдХ рд╕реНрд╡реАрдХреГрддрд┐ рдкрд░реАрдХреНрд╖рдг рдХреИрд╕реЗ рд▓рд┐рдЦреВрдВ" рдХреА рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдореБрдЭреЗ "рдореМрдЬреВрджрд╛ рдХреЛрдб рдХреЗ рд╕рд╛рде рд╕реНрд╡реАрдХреГрддрд┐ рдкрд░реАрдХреНрд╖рдг рдХреИрд╕реЗ рд▓рд┐рдЦрдирд╛ рд╣реИ" рдХреА рд╕рд░рд▓ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ?
рдЗрд╕ рдкреНрд░рд╢реНрди рдХрд╛ рдЙрддреНрддрд░ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВ рдкрд╣рд▓реЗ рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ "рд╕рдмрд╕реЗ рд╕рд░рд▓ рдкрд░рд┐рджреГрд╢реНрдп" рдХреЗ рд▓рд┐рдП рдПрдХ рдкрд░реАрдХреНрд╖рд╛ рд▓рд┐рдЦреВрдВрдЧрд╛ рдЬреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рд╣реИрдВред

рдЪрд░рдг 2.1 рд╕рдмрд╕реЗ рдЖрд╕рд╛рди рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд╕реНрд╡реАрдХреГрддрд┐ рдкрд░реАрдХреНрд╖рдг рд▓рд┐рдЦреЗрдВ

рдпрд╣рд╛рдБ рд╡рд╣ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╣реИ рдЬрд┐рд╕реЗ рдореИрдВрдиреЗ рд╢реБрд░реВ рдХрд┐рдпрд╛ рдерд╛:
  1. рдХреЛрдИ рднреА рдирд╣реАрдВ рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдмреЛрд░реНрдб рдЦреЛрд▓рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ
  2. рдЬрд╛рдВрдЪреЗрдВ рдХрд┐ рдореИрдВ рдЙрд╕реЗ рдирд╣реАрдВ рджреЗрдЦ рдкрд╛ рд░рд╣рд╛ рд╣реВрдВ

рдРрд╕реА рдкрд░реАрдХреНрд╖рд╛ рдХреИрд╕реЗ рд▓рд┐рдЦреЗрдВ? рдХрд┐рд╕ рдврд╛рдВрдЪреЗ рдХреЗ рд╕рд╛рде? рдХреНрдпрд╛ рдЙрдкрдХрд░рдг? рдореБрдЭреЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкрд░реАрдХреНрд╖рдг рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдпрд╛ рдирд╣реАрдВ? рдХреНрдпрд╛ рдореБрдЭреЗ рдкрд░реАрдХреНрд╖рдг рдореЗрдВ рдЧреНрд░рд╛рд╣рдХ рдХреЛрдб рд╢рд╛рдорд┐рд▓ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдпрд╛ рд╕реЗрд╡рд╛ рдХреЛ рд╕реАрдзреЗ рдХреЙрд▓ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП?
рд╕рд╡рд╛рд▓реЛрдВ рдХрд╛ рдПрдХ рдЧреБрдЪреНрдЫрд╛ред рдЪрд╛рд▓: рдЙрдиреНрд╣реЗрдВ рдЬрд╡рд╛рдм рдирд╣реАрдВ! рдмрд╕ рдмрд╣рд╛рдирд╛ рд╣реИ рдХрд┐ рд╕рдм рдХреБрдЫ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЬрд╛рджреБрдИ рддрд░реАрдХреЗ рд╕реЗ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдмрд╕ рдЫрджреНрдо рдХреЛрдб рдкрд░ рдПрдХ рдкрд░реАрдХреНрд╖рдг рд▓рд┐рдЦреЗрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:
public class AcceptanceTest { @Test public void openWhiteboardThatDoesntExist() { //1.     //2. ,       } } 

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

рд╢рд╛рдпрдж рдореИрдВ рдХреБрдЫ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдХреЛрдб рд▓рд┐рдЦрдХрд░ рд╢реБрд░реВ рдХрд░реВрдБрдЧрд╛ред рдлрд┐рд░ рднреА, рдЫрджреНрдо рдХреЛрдб рдиреЗ рдореБрдЭреЗ рд╕рд╣реА рджрд┐рд╢рд╛ рдореЗрдВ рдПрдХ рдХрджрдо рдЙрдард╛рдиреЗ рдореЗрдВ рдорджрдж рдХреАред

рдЪрд░рдг реи.реи рд╕рдмрд╕реЗ рдЖрд╕рд╛рди рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд╕реНрд╡реАрдХреГрддрд┐ рдкрд░реАрдХреНрд╖рдг рд▓рд╛рд▓ рдХрд░реЗрдВ

рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВ AcceptanceTestClient рд╡рд░реНрдЧ рдХреЗ рд╕рд╛рде рдЖрдпрд╛ рдФрд░ рдЬрд╛рджреБрдИ рд░реВрдк рд╕реЗ рд╕рднреА рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХрд╛ рдирд╛рдЯрдХ рдХрд┐рдпрд╛ рдФрд░ рдореБрдЭреЗ рдЕрдкрдиреА рд╕реНрд╡реАрдХреГрддрд┐ рдкрд░реАрдХреНрд╖рдг рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдорд╣рд╛рди рдЙрдЪреНрдЪ-рд╕реНрддрд░реАрдп рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ред рдпрд╣рд╛рдВ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдХрд┐рддрдирд╛ рдЖрд╕рд╛рди рд╣реИ:
client.openWhiteboard ("xyz");
assertFalse (client.hasWhiteboard ());
рдПрдХ рдмрд╛рд░ рдЬрдм рдореИрдВрдиреЗ рдЗрд╕ рдХреЛрдб рдХреЛ рд▓рд┐рдЦрд╛, рддреЛ рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЙрд╕ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рд╕рд╛рде рдЖрдпрд╛ рдЬреЛ рдореЗрд░реА рдЯреЗрд╕реНрдЯ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдкрд░реАрдХреНрд╖рдг рдореЗрдВ рдХреЛрдб рдХреА рдХрдИ рдкрдВрдХреНрддрд┐рдпрд╛рдБ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП рдХреНрдпреЛрдВрдХрд┐ рдЫрджреНрдо рдХреЛрдб рдореЗрдВ рдерд╛ред
рдЕрдЧрд▓рд╛, рдПрдХреНрд▓рд┐рдкреНрд╕ рд╣реЙрдЯрдХреАрдЬрд╝ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рдореИрдВрдиреЗ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдПрдХ рдЦрд╛рд▓реА рдПрдХреНрд╕реЗрдкреНрдЯреЗрдВрд╕рдЯреЗрдХреНрд╕реНрдЯ рдХреНрд▓рд╛рд╕ рдФрд░ рдореЗрд░реА рдЬрд╝рд░реВрд░рдд рдХреЗ рддрд░реАрдХреЛрдВ рдХреЛ рдЙрддреНрдкрдиреНрди рдХрд┐рдпрд╛:
 public class AcceptanceTestClient { public void openWhiteboard(String string) { // TODO Auto-generated method stub } public boolean hasWhiteboard() { // TODO Auto-generated method stub return false; } } 

рдпрд╣рд╛рдБ рдкрд░реАрдХреНрд╖рдг рд╡рд░реНрдЧ рдХреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ:
 public class AcceptanceTest { AcceptanceTestClient client; @Test public void openWhiteboardThatDoesntExist() { //1.     client.openWhiteboard("xyz"); //2. ,       assertFalse(client.hasWhiteboard()); } } 

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

рдЪрд░рдг 2.3 рд╕рдмрд╕реЗ рдЖрд╕рд╛рди рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд╕реНрд╡реАрдХреГрддрд┐ рдкрд░реАрдХреНрд╖рдг рдЧреНрд░реАрди рдмрдирд╛рдПрдВ

рдЕрдЧрд▓рд╛ рдХрджрдо рд╕реНрд╡реАрдХреГрддрд┐ рдкрд░реАрдХреНрд╖рдг рдХреЛ рд╣рд░рд╛ рдмрдирд╛рдиреЗ рдХрд╛ рд╣реИред

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

(рд╡рд┐рд╕реНрддрд╛рд░ рдХреЗ рд▓рд┐рдП рдЫрд╡рд┐ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ)
рддрдХрдиреАрдХреА рд╡рд┐рд╡рд░рдг: рд╡реЗрдм рд╡реНрд╣рд╛рдЗрдЯрдмреЛрд░реНрдб GWT (Google рд╡реЗрдм рдЯреВрд▓рдХрд┐рдЯ) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рд╕рдм рдХреБрдЫ рдЬрд╛рд╡рд╛ рдореЗрдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди GWT рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛрдб рдХреЛ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдЕрдиреБрд╡рд╛рджрд┐рдд рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдХреНрд▓рд╛рдЗрдВрдЯ-рд╕рд░реНрд╡рд░ рдЗрдВрдЯрд░реИрдХреНрд╢рди рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд╕рднреА рдирд┐рдореНрди-рд╕реНрддрд░реАрдп рд╡рд┐рд╡рд░рдгреЛрдВ рдХреЛ рдЫрд┐рдкрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд╛рджреБрдИ рд░реВрдк рд╕реЗ рдЖрд░рдкреАрд╕реА (рджреВрд░рд╕реНрде рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЙрд▓) рдХреЙрд▓ рд╕рдореНрдорд┐рд▓рд┐рдд рдХрд░рддрд╛ рд╣реИред
рд╕реНрд╡реАрдХреГрддрд┐ рдкрд░реАрдХреНрд╖рдг рд╢реБрд░реВ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдореИрдВ рд╕рд┐рд╕реНрдЯрдо рдХреЛ рд╕реАрдзреЗ "рдмрдВрдж" рдХрд░рддрд╛ рд╣реВрдВ рдФрд░ рд╕рднреА рдврд╛рдВрдЪреЗ, рдмрд╛рд╣рд░реА рдШрдЯрдХреЛрдВ рдФрд░ рдиреЗрдЯрд╡рд░реНрдХ рдЗрдВрдЯрд░реИрдХреНрд╢рди рдХреЛ рдХрд╛рдЯ рджреЗрддрд╛ рд╣реВрдВред

(рд╡рд┐рд╕реНрддрд╛рд░ рдХреЗ рд▓рд┐рдП рдЫрд╡рд┐ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ)
рддреЛ рдореИрдВ рдПрдХ AcceptTestClient рдмрдирд╛рддрд╛ рд╣реВрдВ, рдЬреЛ рдХрд┐ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЧреНрд░рд╛рд╣рдХ рдХреЛрдб рдХреА рддрд░рд╣ рд╡реЗрдмрд╡реНрд╣рд╛рдЗрдЯрдмреЛрд░реНрдб рд╕реЗрд╡рд╛ рд╕реЗ рдмрд╛рдд рдХрд░рддрд╛ рд╣реИред рдЕрдВрддрд░ рдкрд░реНрджреЗ рдХреЗ рдкреАрдЫреЗ рдЫрд┐рдкреЗ рд╣реБрдП рд╣реИрдВ:

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЗрд╕рдХреЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдореЗрдВ AcceptanceTestClient рдЕрд╕рд▓реА mongo рдбреЗрдЯрд╛рдмреЗрд╕ (рдХреНрд▓рд╛рдЙрдб NoSQL рдбреЗрдЯрд╛рдмреЗрд╕) рдХреЛ рдПрдХ рдирдХрд▓реА рдХреЗ рд╕рд╛рде рдмрджрд▓ рджреЗрддрд╛ рд╣реИ рдЬреЛ рд░реИрдо рдореЗрдВ рдбреЗрдЯрд╛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИред
рд╕рднреА рдирд┐рд░реНрднрд░рддрд╛рдУрдВ рдХреЛ рдЦрд░рд╛рдм рдХрд░рдиреЗ рдХрд╛ рдореБрдЦреНрдп рдХрд╛рд░рдг рдкрд░реНрдпрд╛рд╡рд░рдг рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдирд╛, рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЛ рдЧрддрд┐ рджреЗрдирд╛ рдФрд░ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдирд╛ рд╣реИ рдХрд┐ рдкрд░реАрдХреНрд╖рдг рд╕рднреА рдШрдЯрдХреЛрдВ рдФрд░ рдиреЗрдЯрд╡рд░реНрдХ рдХрдиреЗрдХреНрд╢рдиреЛрдВ рд╕реЗ рдЕрд▓рдЧрд╛рд╡ рдореЗрдВ рд╡реНрдпрд╛рд╡рд╕рд╛рдпрд┐рдХ рддрд░реНрдХ рдХреЛ рдХрд╡рд░ рдХрд░рддреЗ рд╣реИрдВред
рдРрд╕рд╛ рд▓рдЧ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╕рдм рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдмрд╣реБрдд рдЬрдЯрд┐рд▓ рд╣реИ, рд▓реЗрдХрд┐рди рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдпрд╣ рдХреЗрд╡рд▓ рдПрдХ init рдкрджреНрдзрддрд┐ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдХреЛрдб рдХреА рдХреЗрд╡рд▓ 3 рд▓рд╛рдЗрдиреЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИрдВред
 public class AcceptanceTest { AcceptanceTestClient client; @Before public void initClient() { WhiteboardStorage fakeStorage = new FakeWhiteboardStorage(); WhiteboardService service = new WhiteboardServiceImpl(fakeStorage); client = new AcceptanceTestClient(service); } @Test public void openWhiteboardThatDoesntExist() { client.openWhiteboard("xyz"); assertFalse(client.hasWhiteboard()); } } 

WhiteboardServiceImpl webwhiteboard рд╕реЗрд╡рд╛ рдХрд╛ рдПрдХ рд╕рд╣реА рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИред
рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ AcceptanceTestClient рдирд┐рд░реНрдорд╛рддрд╛ рдЕрдм WhiteboardService (рдирд┐рд░реНрднрд░рддрд╛ рдЗрдВрдЬреЗрдХреНрд╢рди рдбрд┐рдЬрд╛рдЗрди рдкреИрдЯрд░реНрди) рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИред рдпрд╣ рд╣рдореЗрдВ рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рджреБрд╖реНрдкреНрд░рднрд╛рд╡ рджреЗрддрд╛ рд╣реИ: рдпрд╣ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрд░рд╡рд╛рд╣ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдПрдХ рд╣реА рдПрдХреНрд╕реЗрдкреНрдЯреЗрдВрд╕рдЯреЗрдХреНрд╕реНрдЯрд┐рдПрдВрдЯ рдХреНрд▓рд╛рд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рд┐рд╕реНрдЯрдо рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдмрд╕ рдЗрд╕реЗ рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЖрдзрд╛рд░ рдкрд░ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдП рдЧрдП рд╡реНрд╣рд╛рдЗрдЯрдмреЛрд░реНрдб рд╕рд░реНрд╡рд┐рд╕ рдХреЗ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЛ рдкрд╛рд╕ рдХрд░рдХреЗред
 public class AcceptanceTestClient { private final WhiteboardService service; private WhiteboardEnvelope envelope; public AcceptanceTestClient(WhiteboardService service) { this.service = service; } public void openWhiteboard(String whiteboardId) { boolean createIfMissing = false; this.envelope = service.getWhiteboard(whiteboardId, createIfMissing); } public boolean hasWhiteboard() { return envelope != null; } } 

рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ, AcceptanceTestClient рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╡реЗрдмрд╡реНрд╣рд╛рдЗрдЯрдмреЛрд░реНрдб рд╡реЗрдм рдХреНрд▓рд╛рдЗрдВрдЯ рдХреА рддрд░рд╣ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рддрд╛ рд╣реИ, рдЬрдмрдХрд┐ рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рд╕реНрд╡реАрдХреГрддрд┐ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрдЪреНрдЪ-рд╕реНрддрд░реАрдп рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред
рдЖрдк рдкреВрдЫ рд╕рдХрддреЗ рд╣реИрдВ, "рдЕрдЧрд░ рд╣рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ рд╡реНрд╣рд╛рдЗрдЯрдмреЛрд░реНрдб рд╕реЗрд╡рд╛ рд╣реИ рдЬрд┐рд╕реЗ рд╣рдо рд╕реАрдзреЗ рдХреЙрд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рдПрдХреНрд╕реЗрдкреНрдЯреЗрдВрд╕рдЯреЗрдХреНрд╕реНрдЯ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпреЛрдВ рд╣реИ?" рдЗрд╕рдХреЗ 2 рдХрд╛рд░рдг рд╣реИрдВ:

рдореИрдВ рдЕрдм рдЖрдкрдХреЛ AcceptanceTestClient рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд╡рд┐рд╡рд░рдг рдХреЗ рд╕рд╛рде рдмреЛрд░ рдирд╣реАрдВ рдХрд░рдиреЗ рдЬрд╛ рд░рд╣рд╛ рд╣реВрдВ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд▓реЗрдЦ рд╡реЗрдмрд╡реЙрдЪ рдбрд┐рд╡рд╛рдЗрд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рд╣реИред рдпрд╣ рдХрд╣рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ рдХрд┐ AcceptanceTestClient рд╕реНрд╡реАрдХреГрддрд┐ рдкрд░реАрдХреНрд╖рдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдФрд░ рд╕реЗрд╡рд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рд╕рд╛рде рд╕рд╣рднрд╛рдЧрд┐рддрд╛ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдирд┐рдореНрди-рд╕реНрддрд░реАрдп рд╡рд┐рд╡рд░рдг рдХреЛ рдЬреЛрдбрд╝рддрд╛ рд╣реИред рдЗрд╕реЗ рд▓рд┐рдЦрдирд╛ рдЖрд╕рд╛рди рдерд╛, рдХреНрдпреЛрдВрдХрд┐ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЧреНрд░рд╛рд╣рдХ рдХреЛрдб рдХреИрд╕реЗ-рд╕реЗ-рдмрд╛рддрдЪреАрдд-рд╕реЗрд╡рд╛ рдХреЗ рд▓рд┐рдП рд╕рдВрдХреЗрдд рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИред
рдХрд┐рд╕реА рднреА рдорд╛рдорд▓реЗ рдореЗрдВ, рдЕрдм рд╣рдорд╛рд░реА рд╕рдмрд╕реЗ рдЖрд╕рд╛рди рд╕реНрд╡реАрдХреГрддрд┐ рдкрд░реАрдХреНрд╖рд╛ рдкрд╛рд╕ рд╣реИ!
 @Test public void openWhiteboardThatDoesntExist() { myClient.openWhiteboard("xyz"); assertFalse(myClient.hasWhiteboard()); } 

рдЕрдЧрд▓рд╛ рдХрджрдо рдереЛрдбрд╝рд╛ рд╕рд╛ рдЪреБрд╕реНрдд рдХрд░рдирд╛ рд╣реИред

рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдореИрдВрдиреЗ рдЕрднреА рддрдХ рдЙрддреНрдкрд╛рдж рдХреЛрдб рдХреА рдПрдХ рднреА рдкрдВрдХреНрддрд┐ рдирд╣реАрдВ рд▓рд┐рдЦреА рд╣реИ (рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдкрд╣рд▓реЗ рд╕реЗ рдореМрдЬреВрдж рд╣реИ рдФрд░ рдХрд╛рдо рдХрд░ рд░рд╣реА рд╣реИ), рдпрд╣ рдХреЗрд╡рд▓ рдкрд░реАрдХреНрд╖рдг рдврд╛рдВрдЪреЗ рдХрд╛ рдХреЛрдб рдерд╛ред рдлрд┐рд░ рднреА, рдореИрдВрдиреЗ рдЗрд╕реЗ рд╕рд╛рдл рдХрд░рдиреЗ, рджреЛрд╣рд░рд╛рд╡ рдХреЛ рд╣рдЯрд╛рдиреЗ, рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдЕрдзрд┐рдХ рд╕рдордЭрдиреЗ рдпреЛрдЧреНрдп рдирд╛рдо рджреЗрдиреЗ рдЖрджрд┐ рдореЗрдВ рдХрдИ рдорд┐рдирдЯ рдмрд┐рддрд╛рдПред
рдЕрдВрдд рдореЗрдВ, рдореИрдВрдиреЗ рдПрдХ рдФрд░ рдкрд░реАрдХреНрд╖рд╛ рдЬреЛрдбрд╝ рджреА, рд╕рд┐рд░реНрдл рдкреВрд░реНрдгрддрд╛ рдХреЗ рд▓рд┐рдП рдФрд░ рдЗрд╕рд▓рд┐рдП рднреА рдХрд┐ рдпрд╣ рдЖрд╕рд╛рди рдерд╛: рдУ)
 @Test public void createNewWhiteboard() { client.createNewWhiteboard(); assertTrue(client.hasWhiteboard()); } 

рд╣реБрд░реНрд░реЗ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдкрд░реАрдХреНрд╖рдг рдврд╛рдВрдЪрд╛ рд╣реИ! рдФрд░ рдмрд┐рдирд╛ рдХрд┐рд╕реА рдлреИрд╢рдиреЗрдмрд▓ рдерд░реНрдб-рдкрд╛рд░реНрдЯреА рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗред рдХреЗрд╡рд▓ рдЬрд╛рд╡рд╛ рдФрд░ рдЬреБрдирд┐рддред

рдЪрд░рдг 2.4 рдкрд╛рд╕рд╡рд░реНрдб рд╕реБрд░рдХреНрд╖рд╛ рдХреЗ рд▓рд┐рдП рд╕реНрд╡реАрдХреГрддрд┐ рдкрд░реАрдХреНрд╖рдг рд▓рд┐рдЦреЗрдВ

рдЕрдм рдкрд╛рд╕рд╡рд░реНрдб рдкрд░реАрдХреНрд╖рдг рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рд╕рдордп рдЖ рдЧрдпрд╛ рд╣реИред
рдореИрдВ рдЫрджреНрдо рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдкрдиреЗ рдкрд░реАрдХреНрд╖рдг рдХреЗ "рд╡рд┐рдирд┐рд░реНрджреЗрд╢" рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдХреЗ рд╢реБрд░реВ рдХрд░реВрдВрдЧрд╛:
 @Test public void passwordProtect() { //1.     //2.     //3.     ,     //4.          //5.   ,       } 


рдФрд░ рдЕрдм, рдкрд╣рд▓реЗ рдХреА рддрд░рд╣, рдореИрдВ рдЯреЗрд╕реНрдЯ рдХреЛрдб рд▓рд┐рдЦ рд░рд╣рд╛ рд╣реВрдВ, рдпрд╣ рджрд┐рдЦрд╛рддреЗ рд╣реБрдП рдХрд┐ рдПрдХреНрд╕реЗрдкреНрдЯреЗрдВрд╕рдЯреЗрдХреНрд╕реНрдЯрд┐рдПрдВрдЯ рдХреНрд▓рд╛рд╕ рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдореЗрд░реА рдЬрд░реВрд░рдд рдХрд╛ рд╕рдм рдХреБрдЫ рд╣реИред рдпрд╣ рддрдХрдиреАрдХ рдмреЗрд╣рдж рдЙрдкрдпреЛрдЧреА рд╣реИред
 @Test public void passwordProtect() { //1.     myClient.createNewWhiteboard(); String whiteboardId = myClient.getCurrentWhiteboardId(); //2.      myClient.protectWhiteboard("bigsecret"); //3.     ,     try { joesClient.openWhiteboard(whiteboardId); fail("Expected WhiteboardProtectedException"); } catch (WhiteboardProtectedException err) { //  } assertFalse(joesClient.hasWhiteboard()); //4.          try { joesClient.openProtectedWhiteboard(whiteboardId, "wildguess"); fail("Expected WhiteboardProtectedException"); } catch (WhiteboardProtectedException err) { //  } assertFalse(joesClient.hasWhiteboard()); //5.   ,       joesClient.openProtectedWhiteboard(whiteboardId, "bigsecret"); assertTrue(joesClient.hasWhiteboard()); } 

рдореИрдВрдиреЗ рдЗрд╕ рдХреЛрдб рдХреЛ рд▓рд┐рдЦрдиреЗ рдореЗрдВ рдХреЗрд╡рд▓ рдХреБрдЫ рдорд┐рдирдЯ рдмрд┐рддрд╛рдП рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ рдмрд╕ рд╡рд╣реА рд▓рд┐рдЦрддрд╛ рд╣реВрдВ рдЬреЛ рдореБрдЭреЗ рдЪрд╛рд╣рд┐рдП рдерд╛ред рдЗрдирдореЗрдВ рд╕реЗ рд▓рдЧрднрдЧ рдХреЛрдИ рднреА рддрд░реАрдХрд╛ рдПрдХреНрд╕реЗрдкреНрдЯреЗрдВрд╕рдЯреЗрдХреНрд╕реНрдЯрд┐рдПрдВрдЯ рдХреНрд▓рд╛рд╕ (рдЕрднреА рддрдХ рдирд╣реАрдВ) рдореЗрдВ рд╣реИред
рдЬрдм рдореИрдВ рдХреЛрдб рд▓рд┐рдЦ рд░рд╣рд╛ рдерд╛, рдореБрдЭреЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХрдИ рдирд┐рд░реНрдгрдп рд▓реЗрдиреЗ рдереЗред рдмрд╣реБрдд рдореБрд╢реНрдХрд┐рд▓ рд╕реЛрдЪрдиреЗ рдХреА рдЬрд░реВрд░рдд рдирд╣реАрдВ рд╣реИ, рдмрд╕ рд╡рд╣реА рдХрд░реЗрдВ рдЬреЛ рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ рджрд┐рдорд╛рдЧ рдореЗрдВ рдЖрдПред рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рджреБрд╢реНрдорди рдХрд╛ рджреБрд╢реНрдорди рд╣реИ, рдФрд░ рдЕрдм рдореИрдВ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдПрдХ рдЕрдЪреНрдЫрд╛ рдкрд░реНрдпрд╛рдкреНрдд рдкрд░рд┐рдгрд╛рдо рдкреНрд░рд╛рдкреНрдд рд╣реЛ, рдпрд╛рдиреА рдПрдХ рдкрд░реАрдХреНрд╖рдг рдЬреЛ рдЪрд▓рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдЬреЛ рдЧрд┐рд░ рдЬрд╛рдПрдЧрд╛ред рдмрд╛рдж рдореЗрдВ, рдЬрдм рдкрд░реАрдХреНрд╖рдг рд╣рд░рд╛ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдореИрдВ рдЕрдкрдиреЗ рдХреЛрдб рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦреВрдВрдЧрд╛ рдФрд░ рдЗрд╕рдХреЗ рдбрд┐рдЬрд╛рдЗрди рдХреЛ рдмреЗрд╣рддрд░ рдмрдирд╛рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдзреНрдпрд╛рди рд╕реЗ рд╕реЛрдЪреВрдВрдЧрд╛ред
рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЗрди рднрдпрд╛рдирдХ рдХреЛрд╢рд┐рд╢реЛрдВ / рдмрдпрд╛рдиреЛрдВ рдХреЛ рд░рджреНрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЕрдкрдиреЗ рдХреЛрдб рдХреЛ рдХрдВрдШреА рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдорд╣рд╛рди рдкреНрд░рд▓реЛрднрди рд╣реИред рд▓реЗрдХрд┐рди рдЯреАрдбреАрдбреА рдХреЗ рдХрд╛рдиреВрдиреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдпрд╣ рд╣реИ рдХрд┐ рдкрд░реАрдХреНрд╖рдг рд╢реБрд░реВ рд╣реЛрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдкрд░реАрдХреНрд╖рдг рдХреЛ рд╣рд░рд╛ рдмрдирд╛ рджрд┐рдпрд╛ рдЬрд╛рдП, рдЬрдм рдЖрдк рд░рд┐рдлреНрд▓реЗрдХреНрдЯрд░ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдкрд░реАрдХреНрд╖рдг рдЖрдкрдХреА рд░рдХреНрд╖рд╛ рдХрд░реЗрдВрдЧреЗред рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдХреЛрдб рдХреЛ рдХрдВрдШреА рдХрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ред

рдЪрд░рдг 3 - рд╕реНрд╡реАрдХрд╛рд░ рдЯреЗрд╕реНрдЯ рд░рди рдФрд░ рдкрддрди рдХрд░реЗрдВ

рдкрд░реАрдХреНрд╖рдг рддреНрд░рд┐рдХреЛрдг рдХреЗ рдмрд╛рдж, рдореЗрд░рд╛ рдЕрдЧрд▓рд╛ рдХрджрдо рдореЗрд░реА рдкрд░реАрдХреНрд╖рд╛ рд╢реБрд░реВ рдХрд░рдиреЗ рдФрд░ рдЕрд╕рдлрд▓ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИред

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

рдЪрд░рдг 4: рд╕реНрд╡реАрдХреГрддрд┐ рдЯреЗрд╕реНрдЯ рдЧреНрд░реАрди рдмрдирд╛рдПрдВ

рдЕрдм рдореБрдЭреЗ рдкреНрд░реЛрдбрдХреНрдЯ рдХреЛрдб рд▓рд┐рдЦрдирд╛ рд╣реИред рдореИрдВ рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдХрдИ рдирдИ рдЗрдХрд╛рдЗрдпрд╛рдБ рдЬреЛрдбрд╝ рд░рд╣рд╛ рд╣реВрдБред рдХрднреА-рдХрднреА рдЬреЛ рдХреЛрдб рдореИрдВрдиреЗ рдЬреЛрдбрд╝рд╛ рдерд╛, рд╡рд╣ рдмрд╣реБрдд рд╣реА рдорд╛рдореВрд▓реА рдерд╛, рдЗрд╕рд▓рд┐рдП рдЗрд╕реЗ рдпреВрдирд┐рдЯ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╡рд░ рдХрд░рдирд╛ рдкрдбрд╝рд╛ред рдореИрдВрдиреЗ рдЯреАрдбреАрдбреА рдХреЗ рд╕рд╛рде рдРрд╕рд╛ рдХрд┐рдпрд╛ред рдпрд╣ ATDD рдХреЗ рд╕рдорд╛рди рд╣реИ, рд▓реЗрдХрд┐рди рдЫреЛрдЯреЗ рдкреИрдорд╛рдиреЗ рдкрд░ред
рдпрд╣ рдХреИрд╕реЗ ATDD рдФрд░ TDD рдПрдХ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред ATDD рдХреЛ рдмрд╛рд╣рд░реА рд▓реВрдк рдорд╛рдиреЗрдВ:

рд╕реНрд╡реАрдХреГрддрд┐ рдкрд░реАрдХреНрд╖рдг рд▓рд┐рдЦрдиреЗ рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рдЪрдХреНрд░ рдХреЗ рд▓рд┐рдП (рдирдИ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЗ рд╕реНрддрд░ рдкрд░), рд╣рдо рдЗрдХрд╛рдИ рдкрд░реАрдХреНрд╖рдг (рдХрдХреНрд╖рд╛рдУрдВ рдФрд░ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рд╕реНрддрд░ рдкрд░) рд▓реЗрдЦрди рдХреЗ рдХрдИ рдЪрдХреНрд░ рдХрд░рддреЗ рд╣реИрдВред

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

рдЪрд░рдг 5 рдХреЛрдб рд╕рд╛рдлрд╝ рдХрд░реЗрдВ

рд╣рдореЗрд╢рд╛ рдХреА рддрд░рд╣, рдПрдХ рдмрд╛рд░ рд╕реНрд╡реАрдХреГрддрд┐ рдкрд░реАрдХреНрд╖рдг рд╣рд░рд╛ рд╣реЛ рдЧрдпрд╛ рд╣реИ, рдпрд╣ рд╕рдлрд╛рдИ рдХрд░рдиреЗ рдХрд╛ рд╕рдордп рд╣реИред рдЗрд╕ рдкрд░ рдХрднреА рдирд╣реАрдВ рдмрдЪрд╛! рдпрд╣ рдЦрд╛рдиреЗ рдХреЗ рдмрд╛рдж рдмрд░реНрддрди рдзреЛрдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣реИ - рдЗрд╕реЗ рддреБрд░рдВрдд рдХрд░рдирд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╣реИред

рдореИрдВ рди рдХреЗрд╡рд▓ рдЙрддреНрдкрд╛рджрди рдХреЛрдб, рдмрд▓реНрдХрд┐ рдкрд░реАрдХреНрд╖рдг рдХреЛрдб рднреА рд╕рд╛рдл рдХрд░ рд░рд╣рд╛ рд╣реВрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдПрдХ рд╣реЗрд▓реНрдкрд░ рд╡рд┐рдзрд┐ рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рдЧрдВрджреЗ рдкреНрд░рдпрд╛рд╕ рдХреЛ рдкрдХрдбрд╝рд╛, рдФрд░ рдореБрдЭреЗ рдПрдХ рд╕рд╛рдл рдФрд░ рд╕реНрд╡рдЪреНрдЫ рдкрд░реАрдХреНрд╖рдг рд╡рд┐рдзрд┐ рдорд┐рд▓реА:
 @Test public void passwordProtect() { myClient.createNewWhiteboard(); String whiteboardId = myClient.getCurrentWhiteboardId(); myClient.protectWhiteboard("bigsecret"); assertCantOpenWhiteboard(joesClient, whiteboardId); assertCantOpenWhiteboard(joesClient, whiteboardId, "wildguess"); joesClient.openProtectedWhiteboard(whiteboardId, "bigsecret"); assertTrue(joesClient.hasWhiteboard()); } 

рдореЗрд░рд╛ рд▓рдХреНрд╖реНрдп рд╕реНрд╡реАрдХреГрддрд┐ рдкрд░реАрдХреНрд╖рдг рдХреЛ рдЗрддрдирд╛ рдЫреЛрдЯрд╛, рд╕реНрд╡рдЪреНрдЫ рдФрд░ рдкрдардиреАрдп рдмрдирд╛рдирд╛ рд╣реИ рдХрд┐ рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдВ рдирд┐рд░рд░реНрдердХ рд╣реЛ рдЬрд╛рдПрдВред рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдЫрджреНрдо рдХреЛрдб рдФрд░ рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдВ рдХреЗрд╡рд▓ рдПрдХ рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рдо рдХрд░рддреА рд╣реИрдВ - "рдпрд╣ рд╣реИ рдХрд┐ рдХреЛрдб рдХрд┐рддрдирд╛ рд╕рд╛рдл рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП!" рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЛ рд╣рдЯрд╛рдиреЗ рд╕реЗ рдЬреАрдд рдХреА рднрд╛рд╡рдирд╛ рдорд┐рд▓рддреА рд╣реИ, рдФрд░ рдПрдХ рдмреЛрдирд╕ рдХреЗ рд░реВрдк рдореЗрдВ рд╡рд┐рдзрд┐ рдФрд░ рднреА рдХрдо рд╣реЛ рдЬрд╛рддреА рд╣реИ!

рдЖрдЧреЗ рдХреНрдпрд╛ рд╣реИ?

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

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

рдореИрдиреБрдЕрд▓ рдкрд░реАрдХреНрд╖рдг рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреИрд╕реЗ?

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

рдореБрдЦреНрдп рдмрд┐рдВрджреБ

рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЙрджрд╛рд╣рд░рдг рдЖрдкрдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рдерд╛! рд╡рд╣ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕реНрдерд┐рддрд┐ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИ - "рдореИрдВ рдПрдХ рдирдИ рд╕реБрд╡рд┐рдзрд╛ рдЬреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рдФрд░ рдЙрд╕ рдкрд░ рдПрдХ рд╕реНрд╡рдд: рд╕реНрд╡реАрдХреГрддрд┐ рдкрд░реАрдХреНрд╖рдг рд▓рд┐рдЦрдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдЕрднреА рддрдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдХреЛрдИ рд╕реНрд╡реАрдХреГрддрд┐ рдкрд░реАрдХреНрд╖рдг рдирд╣реАрдВ рд╣реИрдВ, рдФрд░ рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдХрд┐рд╕ рд░реВрдкрд░реЗрдЦрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИ рдФрд░ рдХрд╣рд╛рдВ рд╢реБрд░реВ рдХрд░рдирд╛ рд╣реИ"ред
рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕ рдЯреЗрдореНрдкрд▓реЗрдЯ рд╕реЗ рдкреНрдпрд╛рд░ рдХрд░рддрд╛ рд╣реВрдВ, рдЗрд╕рдиреЗ рдореБрдЭреЗ рдХрдИ рдмрд╛рд░ рдореИрджрд╛рди рд╕реЗ рдмрд╛рд╣рд░ рдЬрд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреАред рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ:
  1. рдмрд╣рд╛рдирд╛ рдХрд░реЗрдВ рдХрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╕рд╣рд╛рдпрдХ рд╡рд░реНрдЧ (рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, AcceptanceTestClient) рдореЗрдВ рдПрдХ рдЙрддреНрдХреГрд╖реНрдЯ рд░реВрдкрд░реЗрдЦрд╛ рд╣реИред
  2. рдЖрдЬ рдЬреЛ рдкрд╣рд▓реЗ рд╕реЗ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИ рдЙрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рдмрд╣реБрдд рд╣реА рд╕рд░рд▓ рд╕реНрд╡реАрдХреГрддрд┐ рдкрд░реАрдХреНрд╖рдг рд▓рд┐рдЦреЗрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдмрд╕ рдЕрдкрдирд╛ рдЖрд╡реЗрджрди рдЦреЛрд▓рдирд╛)ред рдЗрд╕ рдкрд░реАрдХреНрд╖рд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдПрдХреНрд╕реЗрдкреНрдЯреЗрдВрд╕рдЯреЗрдХреНрд╕реНрдЯ рдФрд░ рдЙрдирдХреА рд╕рдВрдмрджреНрдз рдкрд░реАрдХреНрд╖рдг рдмрд╛рдЗрдВрдбрд┐рдВрдЧ (рдЬреИрд╕реЗ рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдбреЗрдЯрд╛рдмреЗрд╕ рдпрд╛ рдЕрдиреНрдп рдмрд╛рд╣рд░реА рд╕реЗрд╡рд╛рдУрдВ рдХреЛ рдЦрд╝рд░рд╛рдм рдХрд░рдирд╛) рдЬреИрд╕реА рдХрдХреНрд╖рд╛рдУрдВ рдХреЛ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░реЗрдВред
  3. рдЕрдкрдиреА рдирдИ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЗ рд▓рд┐рдП рд╕реНрд╡реАрдХреГрддрд┐ рдкрд░реАрдХреНрд╖рдг рд▓рд┐рдЦреЗрдВред рдЗрд╕реЗ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд╛рдУ, рд▓реЗрдХрд┐рди рджреБрд░реНрдШрдЯрдирд╛ред
  4. рдкрд░реАрдХреНрд╖рдг рдХреЛ рд╣рд░рд╛ рдмрдирд╛рдпреЗрдВред рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдХреЛрдб рд▓рд┐рдЦрддреЗ рд╣реИрдВ, рдХрд┐рд╕реА рднреА рдЕрдзрд┐рдХ рдпрд╛ рдХрдо рдЬрдЯрд┐рд▓ рдХреЛрдб рдХреЗ рд▓рд┐рдП рдпреВрдирд┐рдЯ рдкрд░реАрдХреНрд╖рдг рд▓рд┐рдЦреЗрдВред
  5. Refaktorteред рдФрд░ рд╢рд╛рдпрдж рдореЗрдЯреНрд░рд┐рдХ рдХреЛ рдмреЗрд╣рддрд░ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдФрд░ рдпреВрдирд┐рдЯ рдкрд░реАрдХреНрд╖рдг рд▓рд┐рдЦреЗрдВ, рдпрд╛ рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд - рдЕрдирд╛рд╡рд╢реНрдпрдХ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдпрд╛ рдХреЛрдб рдХреЛ рд╣рдЯрд╛ рджреЗрдВред рдХреЛрдб рдХреЛ рдмрд┐рд▓реНрд▓реА рдХреЗ рдЕрдВрдбреЛрдВ рдХреА рддрд░рд╣ рд╕рд╛рдл рд░рдЦреЗрдВ!

рдПрдХ рдмрд╛рд░ рдЬрдм рдЖрдк рдпрд╣ рдХрд░ рд▓реЗрддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдиреЗ рд╕рдмрд╕реЗ рдХрдард┐рди рдмрд╛рдзрд╛ рдХреЛ рдкрд╛рд░ рдХрд░ рд▓рд┐рдпрд╛ рд╣реИред рдЖрдкрдиреЗ ATDD рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рджрд┐рдпрд╛!

рд▓реЗрдЦрдХ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ


рд╣реЗрдирд░рд┐рдХ рдирд╛рдЗрдмрд░реНрдЧ рд╕реНрдЯреЙрдХрд╣реЛрдо рдореЗрдВ рдХреНрд░рд┐рд╕реНрдк рдореЗрдВ рдПрдХ рдлреБрд░реНрддреАрд▓реА / рджреБрдмрд▓рд╛ рд╕рд▓рд╛рд╣рдХрд╛рд░ рд╣реИ, рдЬреЛ рдореБрдЦреНрдп рд░реВрдк рд╕реЗ Spotify рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИред рдЙрдиреНрд╣реЗрдВ рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ рд╡рд┐рдХрд╛рд╕ рдХреЗ рддрдХрдиреАрдХреА рдФрд░ рдорд╛рдирд╡реАрдп рджреЛрдиреЛрдВ рдкрд╣рд▓реБрдУрдВ рдореЗрдВ рд╕рдлрд▓ рд╣реЛрдиреЗ рдореЗрдВ рдХрдВрдкрдирд┐рдпреЛрдВ рдХреА рдорджрдж рдХрд░рдиреЗ рдореЗрдВ рдЖрдирдВрдж рдорд┐рд▓рддрд╛ рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рдЙрдирдХреА рд▓реЛрдХрдкреНрд░рд┐рдп рдХрд┐рддрд╛рдмреЛрдВ рдореЗрдВ рд╡рд░реНрдгрд┐рдд рд╣реИ " рдЯреНрд░реЗрдВрдЪ рд╕реЗ рд╕реНрдХреНрд░реИрдо рдФрд░ рдПрдХреНрд╕рдкреА ", " рдХрд╛рдирдмрди рдФрд░ рд╕реНрдХреНрд░реИрдо, рджреЛрдиреЛрдВ рдореЗрдВ рд╕реЗ рдЕрдзрд┐рдХрд╛рдВрд╢ рдмрдирд╛ " рдФрд░ " рдЦрд╛рдЗрдпреЛрдВ рд╕реЗ рдЭреБрдХ "ред

рдЕрд▓реЗрдХреНрдЬреЗрдВрдбрд░ рдПрдВрдбреНрд░реЛрдиреЛрд╡ (@ alex4Zero), рдПрдВрдЯреЛрди рдмреЗрд╡рдЬрд╝реБрдХ (@bevzuk) рдФрд░ рджрд┐рдорд┐рддреНрд░реА рдкрд╛рд╡рд▓реЛрд╡ рджреНрд╡рд╛рд░рд╛ рдЕрдиреБрд╡рд╛рджрд┐рдд
рд╕реНрдорд╛рд░реНрдЯ рд╕реНрдЯреЗрдк рдЧреНрд░реБрдк ред

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


All Articles