рдпреИрдВрдбреЗрдХреНрд╕ рд╕реЗ рдЕрдиреБрднрд╡ред рдСрдЯреЛрдЯреЗрд╕реНрдЯ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреА рд░рд┐рдкреЛрд░реНрдЯ рдХреИрд╕реЗ рдмрдирд╛рдПрдВ

рдореИрдВ рдЕрдкрдиреЗ рдЕрдиреБрднрд╡ рдХреЛ рдСрдЯреЛ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдкрд░ рдЕрдЪреНрдЫреА рд░рд┐рдкреЛрд░реНрдЯ рдмрдирд╛рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдкрд░ рд╕рд╛рдЭрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдФрд░ рд╕рд╛рде рд╣реА рдЖрдкрдХреЛ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдкрд░реАрдХреНрд╖рдг рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрд╣рд▓реЗ рдпреИрдВрдбреЗрдХреНрд╕ рдХрд╛рд░реНрдпрдХреНрд░рдо рдореЗрдВ рдЖрдордВрддреНрд░рд┐рдд рдХрд░рддрд╛ рд╣реВрдВред

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

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

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

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

рдЙрдЪреНрдЪ-рд╕реНрддрд░реАрдп рдкрд░реАрдХреНрд╖рдг рдЗрдХрд╛рдИ рдкрд░реАрдХреНрд╖рдгреЛрдВ рд╕реЗ рднрд┐рдиреНрди рд╣реЛрддреЗ рд╣реИрдВ рдФрд░ рдЗрдирдореЗрдВ рдХрдИ рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ рд╣реЛрддреА рд╣реИрдВ:

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

рдпреЗ рд╕рднреА рдХрд╛рд░рдХ рд╕рдорд╕реНрдпрд╛ рдХреЗ рд╕реНрдерд╛рдиреАрдпрдХрд░рдг рдХреА рджрд░ рдХреЛ рдХрд╛рдлреА рдзреАрдорд╛ рдХрд░ рджреЗрддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╡реЗрдм рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рд▓рд┐рдП рдкрд░реАрдХреНрд╖рдг рдореЗрдВ рддреНрд░реБрдЯрд┐ "рддрддреНрд╡ рдмрдЯрди рдкрд░ рдХреНрд▓рд┐рдХ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИ" рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ:


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

рдПрдХ рдмрд╛рд░ рдЯреЗрд╕реНрдЯ рдерд╛


рд╣рдорд╛рд░реЗ рдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдкрд░реАрдХреНрд╖рдг рд╡рд┐рд╖рдп рдХреЗ рд░реВрдк рдореЗрдВ, рд╣рдо рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рд╛рдзрд╛рд░рдг рдкрд░реАрдХреНрд╖рд╛ рд▓реЗрддреЗ рд╣реИрдВ:

public class ScreenShotDifferTest { private final long DEVIATION = 20L; private WebDriver driver = new FirefoxDriver(); public ScreenShooter screenShooter = new ScreenShooter(); @Test public void originPageShouldBeSameAsModifiedPage() throws Exception { BufferedImage originScreenShot = screenShooter.takeScreenShot("http://www.yandex.ru", driver); BufferedImage modifiedScreenShot = screenShooter.takeScreenShot("http://beta.yandex.ru", driver); long diffPixels = screenShooter.diff(originScreenShot, modifiedScreenShot); assertThat(diffPixels, lessThan(DEVIATION); } @After public void closeDriver() { driver.quit(); } } 

рдХреЛрдб рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЪрд▓рддреЗ рд╣реИрдВ:


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

  @RunWith(Parameterized.class) public class ScreenShotDifferTest { ... private String originPageUrl; private String modifiedPageUrl; public ScreenShotDifferTest (String originPageUrl, String modifiedPageUrl) { this.modifiedPageUrl = modifiedPageUrl; this.originPageUrl = originPageUrl; } @Parameterized.Parameters(name = "{0}") public static Collection<Object[]> readUrlPairs () { return Arrays.asList( new Object[]{"Yandex Main Page", "http://www.yandex.ru/", "http://beta.yandex.ru/"}, new Object[]{"Yandex.Market Main Page", "http://market.yandex.ru/", "http://beta.market.yandex.ru/"} ); } ... } 

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

рддреЛ, рдорд╛рди рд▓реЗрдВ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ 2 рдкреИрд░рд╛рдореАрдЯрд░ рдирд╣реАрдВ рд╣реИрдВ, рд▓реЗрдХрд┐рди 20 рдпрд╛ 200 рд╕реЗ рдмреЗрд╣рддрд░ рд╣реИред рдПрдХ рдорд╛рдирдХ рдкрд░реАрдХреНрд╖рдг рд░рд┐рдкреЛрд░реНрдЯ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрд╛рдИ рджреЗрдЧреА:

рдЫрд╡рд┐

рдкрд░реАрдХреНрд╖рдг рд░рд┐рдкреЛрд░реНрдЯ рд╕реЗ рдХреНрдпрд╛ рдирд┐рд╖реНрдХрд░реНрд╖ рдирд┐рдХрд╛рд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ?

рдЫрд╡рд┐

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

  1. рдореВрд▓ рдкреГрд╖реНрда рдФрд░ рдЙрдореНрдореАрджрд╡рд╛рд░ рдХрд╛ рд╕реНрдХреНрд░реАрдирд╢реЙрдЯред
  2. рдлрд╝рдВрдХреНрд╢рдирд▓ рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ (рдЖрдк, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд▓рд╛рд▓ рд░рдВрдЧ рдХреЗ рд╕рднреА рдЕрд▓рдЧ-рдЕрд▓рдЧ рдкрд┐рдХреНрд╕реЗрд▓ рдХреЛ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ)
  3. рдореВрд▓ рдкреГрд╖реНрда рдФрд░ рдЙрдореНрдореАрджрд╡рд╛рд░ рдХреЗ рд╕реНрд░реЛрддред

рдЗрд╕ рддрд░рд╣ рдХреЗ рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде, рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд┐рд╖реНрдХрд░реНрд╖ рдирд┐рдХрд╛рд▓рдирд╛ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реЛ рдЬрд╛рдПрдЧрд╛, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рд╕рд╕реНрддрд╛ред

рд░рд┐рдкреЛрд░реНрдЯ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди


рдПрдХ рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рдкрд░реАрдХреНрд╖рдг рд░рд┐рдкреЛрд░реНрдЯ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рддреАрди рдЪрд░рдгреЛрдВ рд╕реЗ рдЧреБрдЬрд░рдирд╛ рд╣реЛрдЧрд╛:

  1. рдореЙрдбрд▓ ред рдЗрд╕рдореЗрдВ рд░рд┐рдкреЛрд░реНрдЯ рдореЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╕рднреА рдЬрд╛рдирдХрд╛рд░реА рд╣реЛрдЧреАред
  2. рдПрдбрд╛рдкреНрдЯрд░ред рдЙрд╕реЗ рдкрд░реАрдХреНрд╖рдг рд╕реЗ рдореЙрдбрд▓ рддрдХ рд╕рднреА рдЖрд╡рд╢реНрдпрдХ рдЬрд╛рдирдХрд╛рд░реА рдПрдХрддреНрд░ рдХрд░рдиреА рд╣реЛрдЧреАред
  3. рд░рд┐рдкреЛрд░реНрдЯ рдЬрдирд░реЗрд╢рди рдПрдХрддреНрд░рд┐рдд рдЖрдВрдХрдбрд╝реЛрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рд╣рдо рдЯреЗрдореНрдкрд▓реЗрдЯреНрд╕ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдПрдХ рд░рд┐рдкреЛрд░реНрдЯ рддреИрдпрд╛рд░ рдХрд░рддреЗ рд╣реИрдВред

рддреЛ, рдХреНрд░рдо рдореЗрдВред

рдЖрджрд░реНрд╢


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

 <?xml version="1.0" encoding="UTF-8"?> <xsd:schema attributeFormDefault="unqualified" elementFormDefault="unqualified" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:ns="urn:report.examples.qatools.yandex.ru" targetNamespace="urn:report.examples.qatools.yandex.ru" version="2.1"> <xsd:element name="testCaseResult" type="ns:TestCaseResult"/> <!--  --> <xsd:complexType name="TestCaseResult"> <xsd:sequence> <xsd:element name="description" type="xsd:string"/> <!--      --> <xsd:element name="origin" type="ns:ScreenShotData" nillable="false"/> <!--   (   )--> <xsd:element name="modified" type="ns:ScreenShotData" nillable="false"/> <!--     (  )--> <xsd:element name="diff" type="ns:DiffData" nillable="false"/> <!--   --> <xsd:element name="message" type="xsd:string"/> <!--  ,   --> </xsd:sequence> <xsd:attribute name="uid" type="xsd:string"/> <!--ID- --> <xsd:attribute name="title" type="xsd:string"/> <!--  ,    --> <xsd:attribute name="status" type="ns:Status"/> <!--  --> </xsd:complexType> <xsd:complexType name="ScreenShotData"> <xsd:sequence> <xsd:element name="pageUrl" type="xsd:string"/> <!-- ,    --> <xsd:element name="fileName" type="xsd:string"/> <!--   --> </xsd:sequence> </xsd:complexType> <xsd:complexType name="DiffData"> <xsd:sequence> <xsd:element name="pixels" type="xsd:long" default="0"/> <!--  --> <xsd:element name="fileName" type="xsd:string"/><!--   --> </xsd:sequence> </xsd:complexType> <xsd:simpleType name="Status"> <xsd:restriction base="xsd:string"> <xsd:enumeration value="OK"/> <xsd:enumeration value="FAIL"/> <xsd:enumeration value="ERROR"/> </xsd:restriction> </xsd:simpleType> </xsd:schema> 

рдпреЛрдЬрдирд╛ рддреИрдпрд╛рд░ рд╣реИ! рдЕрдм рдпрд╣ рдЗрд╕ рдпреЛрдЬрдирд╛ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдХрдХреНрд╖рд╛рдПрдВ рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдиреА рд╣реБрдИ рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╢рдХреНрддрд┐рд╢рд╛рд▓реА maven-jaxb2- рдкреНрд▓рдЧрдЗрди рд▓рд╛рдЧреВ рдХрд░реЗрдВред рдЗрд╕ рдкреНрд▓рдЧрдЗрди рдХрд╛ рд▓рд╛рдн рдпрд╣ рд╣реИ рдХрд┐ рдХрдХреНрд╖рд╛рдПрдВ рдкреНрд░рддреНрдпреЗрдХ рд╕рдВрдХрд▓рди рдкрд░ рдЙрддреНрдкрдиреНрди рд╣реЛрддреА рд╣реИрдВред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдЖрдк 100% рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЙрддреНрдкрдиреНрди рдХреЛрдб рдпреЛрдЬрдирд╛ рдХреЗ рдЕрдиреБрд░реВрдк рд╣реИ рдФрд░ "рдУрд╣, рдореИрдВ рдлрд┐рд░ рд╕реЗ рдмрдирд╛рдирд╛ рднреВрд▓ рдЧрдпрд╛" рдЬреИрд╕реА рддреНрд░реБрдЯрд┐рдпреЛрдВ рд╕реЗ рдЦреБрдж рдХреЛ рдмрдЪрд╛ рд╕рдХрддрд╛ рд╣реВрдВ ... рдкреНрд▓рдЧрдЗрди рдХрд╛ рдкрд░рд┐рдгрд╛рдо рдЙрддреНрдкрдиреНрди рдХрдХреНрд╖рд╛рдПрдВ рд╣реЛрдВрдЧреА (рдзреНрдпрд╛рди рд╕реЗ, рд╡реЗ рдмрд╣реБрдд рдмрдбрд╝реА рд╣реИрдВ):
TestCaseReport
 /** * <p>Java class for TestCaseResult complex type. * * <p>The following schema fragment specifies the expected content contained within this class. * * <pre> * <complexType name="TestCaseResult"> * <complexContent> * <restriction base="{http://www.w3.org/2001/XMLSchema}anyType"> * <sequence> * <element name="message" type="{http://www.w3.org/2001/XMLSchema}string"/> * <element name="description" type="{http://www.w3.org/2001/XMLSchema}string"/> * <element name="origin" type="{urn:report.examples.qatools.yandex.ru}ScreenShotData"/> * <element name="modified" type="{urn:report.examples.qatools.yandex.ru}ScreenShotData"/> * <element name="diff" type="{urn:report.examples.qatools.yandex.ru}DiffData"/> * </sequence> * <attribute name="uid" type="{http://www.w3.org/2001/XMLSchema}string" /> * <attribute name="title" type="{http://www.w3.org/2001/XMLSchema}string" /> * <attribute name="status" type="{urn:report.examples.qatools.yandex.ru}Status" /> * </restriction> * </complexContent> * </complexType> * </pre> * * */ @XmlAccessorType(XmlAccessType.FIELD) @XmlType(name = "TestCaseResult", propOrder = { "message", "description", "origin", "modified", "diff" }) public class TestCaseResult { @XmlElement(required = true) protected String message; @XmlElement(required = true) protected String description; @XmlElement(required = true) protected ScreenShotData origin; @XmlElement(required = true) protected ScreenShotData modified; @XmlElement(required = true) protected DiffData diff; @XmlAttribute(name = "uid") protected String uid; @XmlAttribute(name = "title") protected String title; @XmlAttribute(name = "status") protected Status status; /** * Gets the value of the message property. * * @return * possible object is * {@link String } * */ public String getMessage() { return message; } /** * Sets the value of the message property. * * @param value * allowed object is * {@link String } * */ public void setMessage(String value) { this.message = value; } /** * Gets the value of the description property. * * @return * possible object is * {@link String } * */ public String getDescription() { return description; } /** * Sets the value of the description property. * * @param value * allowed object is * {@link String } * */ public void setDescription(String value) { this.description = value; } /** * Gets the value of the origin property. * * @return * possible object is * {@link ScreenShotData } * */ public ScreenShotData getOrigin() { return origin; } /** * Sets the value of the origin property. * * @param value * allowed object is * {@link ScreenShotData } * */ public void setOrigin(ScreenShotData value) { this.origin = value; } /** * Gets the value of the modified property. * * @return * possible object is * {@link ScreenShotData } * */ public ScreenShotData getModified() { return modified; } /** * Sets the value of the modified property. * * @param value * allowed object is * {@link ScreenShotData } * */ public void setModified(ScreenShotData value) { this.modified = value; } /** * Gets the value of the diff property. * * @return * possible object is * {@link DiffData } * */ public DiffData getDiff() { return diff; } /** * Sets the value of the diff property. * * @param value * allowed object is * {@link DiffData } * */ public void setDiff(DiffData value) { this.diff = value; } /** * Gets the value of the uid property. * * @return * possible object is * {@link String } * */ public String getUid() { return uid; } /** * Sets the value of the uid property. * * @param value * allowed object is * {@link String } * */ public void setUid(String value) { this.uid = value; } /** * Gets the value of the title property. * * @return * possible object is * {@link String } * */ public String getTitle() { return title; } /** * Sets the value of the title property. * * @param value * allowed object is * {@link String } * */ public void setTitle(String value) { this.title = value; } /** * Gets the value of the status property. * * @return * possible object is * {@link Status } * */ public Status getStatus() { return status; } /** * Sets the value of the status property. * * @param value * allowed object is * {@link Status } * */ public void setStatus(Status value) { this.status = value; } } 

рдХрдХреНрд╖рд╛рдПрдВ рднреА рддреИрдпрд╛рд░ рд╣реИрдВред рдЕрдм рдЖрдк рдЖрд╕рд╛рдиреА рд╕реЗ рдФрд░ рдЖрд╕рд╛рдиреА рд╕реЗ xml рдлрд╝рд╛рдЗрд▓реЛрдВ рдореЗрдВ рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдХреНрд░рдордмрджреНрдз рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
 TestCaseResult testCaseResult = ... JAXB.marshal(testCaseResult, file); 


рдФрд░ xml рдлрд╝рд╛рдЗрд▓ рд╕реЗ рдСрдмреНрдЬреЗрдХреНрдЯ рдкрдврд╝реЗрдВ
 TestCaseResult testCaseResult = JAXB.unmarshal(file, TestCaseResult.class) 


рдЕрдиреБрдХреВрд▓рдХ


рдореБрдЭреЗ рдЖрдкрдХреЛ рдпрд╛рдж рджрд┐рд▓рд╛рдирд╛ рд╣реИ рдХрд┐ рдЗрд╕рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рджреМрд░рд╛рди рдкрд░реАрдХреНрд╖рдг рд╕реЗ рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рдореЙрдбрд▓ рдХреЛ рднрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдореЗрдВ рдПрдХ рдПрдбрд╛рдкреНрдЯрд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдПрдбреЗрдкреНрдЯрд░ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо jUnit рд░реВрд▓реНрд╕ рддрдВрддреНрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ, рдпрд╛ рдЕрдзрд┐рдХ рд╕рдЯреАрдХ рд╣реЛрдЧрд╛, TestWatcher рдирд┐рдпрдо:
 public abstract class TestWatcher implements org.junit.rules.TestRule { //     protected void starting(org.junit.runner.Description description) {...} //        protected void succeeded(org.junit.runner.Description description) {...} //  ,  // // !!()!! assumeThat() protected void skipped(org.junit.internal.AssumptionViolatedException e, org.junit.runner.Description description) {...} //          protected void failed(java.lang.Throwable e, org.junit.runner.Description description) {...} //     protected void finished(org.junit.runner.Description description) {...} } 

рдЖрдЗрдП рдЙрддреНрддрд░рд╛рдзрд┐рдХрд╛рд░ рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рд╡рд┐рдзрд┐ рдкрд░ рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдВ рдФрд░ рд╕реЛрдЪреЗрдВ рдХрд┐ рдЖрдк рдЖрд╡рд╢реНрдпрдХ рдбреЗрдЯрд╛ рдХрд╣рд╛рдБ рд╕реЗ рдПрдХрддреНрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

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


рд╣рдо рд╕рднреА рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ target/site/custom рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рдбрд╛рд▓ рджреЗрдВрдЧреЗ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд░рд┐рдкреЛрд░реНрдЯ рдХреЗ рд▓рд┐рдП рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╣реИред

'ScreenShotDifferRule' рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдорд╛рд░рд╛ рдкрд░реАрдХреНрд╖рдг рд╢рд╛рдпрдж рд╣реА рдмрджрд▓ рдЬрд╛рдПрдЧрд╛:
 @RunWith(Parameterized.class) public class ScreenShotDifferTest { private String originPageUrl; private String modifiedPageUrl; ... @Rule public ScreenShotDifferRule screenShotDiffer = new ScreenShotDifferRule(driver); public ScreenShotDifferTest(String title, String originPageUrl, String modifiedPageUrl) { this.modifiedPageUrl = modifiedPageUrl; this.originPageUrl = originPageUrl; } ... @Test public void originShouldBeSameAsModified() throws Exception { BufferedImage originScreenShot = screenShotDiffer.takeOriginScreenShot(originPageUrl); BufferedImage modifiedScreenShot = screenShotDiffer.takeModifiedScreenShot(modifiedPageUrl); long diffPixels = screenShotDiffer.diff(originScreenShot, modifiedScreenShot); assertThat(diffPixels, lessThan((long) 20)); } ... } 


рдЕрдм, рдкреНрд░рддреНрдпреЗрдХ рдкрд░реАрдХреНрд╖рдг рдХреЗ рдмрд╛рдж , рд╕рд░рд▓ ScreenShotDifferRule рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд░реВрдк рдореЗрдВ рд╕рдВрд░рдЪрд┐рдд рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВрдЧреЗ:

* {Uid} -testcase.xml
 <?xml version="1.0" encoding="UTF-8" standalone="yes"?> <testCaseResult status="OK" title="originShouldBeSameAsModified[0](ru.yandex.qatools.examples.report.ScreenShotDifferTest)" uid="ru.yandex.qatools.examples.report.ScreenShotDifferTest.originShouldBeSameAsModified[0]"> <origin> <pageUrl>http://www.yandex.ru/</pageUrl> <fileName>{uid}-origin.png</fileName> </origin> <modified> <pageUrl>http://www.yandex.ru/</pageUrl> <fileName>{uid}-modified.png</fileName> </modified> <diff> <pixels>0</pixels> <fileName>{uid}-diff.png</fileName> </diff> </testCaseResult> 


11. "uid} -origin.png
рдЫрд╡рд┐

* "Uid} -diff.png
рдЫрд╡рд┐

рд░рд┐рдкреЛрд░реНрдЯ рдЬрдирд░реЗрд╢рди


рд╣рдореЗрдВ рдорд╛рд╡реЗрди рд░рд┐рдкреЛрд░реНрдЯ рдкреНрд▓рдЧрдЗрди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЬреЛ рд╕рднреА {{uid}} рдПрдХрддреНрд░ рдХрд░реЗрдЧрд╛ - testcase.xml-ki рдПрдХ рдореЗрдВ рдФрд░ рдЗрд╕рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдПрдХ html-рдкреГрд╖реНрда рдЙрддреНрдкрдиреНрди рдХрд░реЗрдЧрд╛ред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдорд╛рд░реЗ рдореЙрдбрд▓ рдореЗрдВ рд╕рднреА TestCaseResult рдХреЗ TestSuiteResult рдПрдЧреНрд░реАрдЧреЗрдЯрд░ рдСрдмреНрдЬреЗрдХреНрдЯ рдЬреЛрдбрд╝реЗрдВред рдореИрдВ рдорд╛рд╡реЗрди рдХреЗ рд▓рд┐рдП рдкреНрд▓рдЧрдЗрдиреНрд╕ рдмрдирд╛рдиреЗ рдХреЗ рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рдЧрд╣рд░реА рдЦреБрджрд╛рдИ рдирд╣реАрдВ рдХрд░реВрдВрдЧрд╛ - рдпрд╣ рдПрдХ рдЕрдиреНрдп рд▓реЗрдЦ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рд╖рдп рд╣реИред рдЗрд╕рдХреЗ рдмрдЬрд╛рдп, рдореИрдВ рдПрдХ рддреИрдпрд╛рд░ рдкреНрд▓рдЧ-рдЗрди рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд░рддрд╛ рд╣реВрдВ рдЬреЛ рд╣рдорд╛рд░реА рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рддрд╛ рд╣реИред

рддреЛ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ ScreenShotDifferReport Plugin рд╣реИ ред рдкреНрд▓рдЧрдЗрди рдХрд╛ рджрд┐рд▓ public void exec () рд╡рд┐рдзрд┐ рд╣реИред рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЙрд╕реЗ рдЪрд╛рд╣рд┐рдП:
  1. рд╕рднреА рдкрд░реАрдХреНрд╖рдг рдбреЗрдЯрд╛ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдПрдВред
     File[] testCasesFiles = listOfFiles(reportDirectory, ".*-testcase\\.xml"); 
  2. рдЙрдиреНрд╣реЗрдВ рдкрдврд╝реЗрдВ рдФрд░ рд╡рд╕реНрддреБрдУрдВ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░реЗрдВред
     List<TestCaseResult> testCases = convert(testCasesFile, new Converter<File, TestCaseResult>(){ public TestCaseResult convert (File file) { return JAXB.unmarshall(file, TestCaseResult.xml); } }); 
  3. рдбреЗрдЯрд╛ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ index.html рдЙрддреНрдкрдиреНрди рдХрд░реЗрдВред рдЖрдк рдлреНрд░реАрдорд╛рд░реНрдХрд░ рдФрд░ рдЗрд╕ рдЯреЗрдореНрдкрд▓реЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдЯреЗрдореНрдкрд▓реЗрдЯ рдЗрдВрдЬрди рдХреЗ рд░реВрдк рдореЗрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
     String source = processTemplate(TEMPLATE_NAME, testCases); 
  4. рдЗрд╕ рд░рд┐рдкреЛрд░реНрдЯ рдХреА рдЬрд╛рдирдХрд╛рд░реА рдПрдХ рдЧреНрд░реБрдкрд┐рдВрдЧ рдорд╛рд╡реЗрди рд░рд┐рдкреЛрд░реНрдЯ рдореЗрдВ рдЬреЛрдбрд╝реЗрдВред
     Sink sink = new Sink(); sink.setHtml(source); sink.close();(( 

рд░реЗрдбреА-рдореЗрдб рд░рд┐рдкреЛрд░реНрдЯ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ mvn clean install рдХрдорд╛рдВрдб рдЪрд▓рд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд╕рд░рд▓рддрд╛ рдХреЗ рд▓рд┐рдП, рдЖрдк github.com/yandex-qatools/tests-report-example рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЛ рдбрд┐рдлреНрд▓реЗрдХреНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕рдХреЗ рд▓рд┐рдП рдХрдорд╛рдВрдб рдЪрд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВред рд▓рдХреНрд╖реНрдп / рд╕рд╛рдЗрдЯ / рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рдкрд░реАрдХреНрд╖рдг-рд░рд┐рдкреЛрд░реНрдЯ-рдЙрджрд╛рд╣рд░рдг рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рдХрдорд╛рдВрдб рдЪрд▓рд╛рдиреЗ рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рдЖрдкрдХреЛ рдПрдХ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд░рд┐рдкреЛрд░реНрдЯ рджрд┐рдЦрд╛рдИ рджреЗрдЧреАред

рдкрд░рд┐рдгрд╛рдо рдХрд╛ рд╕рддреНрдпрд╛рдкрди


рдЕрдм рдЖрдкрдХреЛ рдкреВрд░реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреА рд╕реНрдерд╛рдкрдирд╛ рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЗ рдореВрд▓ рдореЗрдВ mvn clean install рдХрдорд╛рдВрдб рдЪрд▓рд╛рдПрдБред рдЗрд╕рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдмрд╛рдж, рд╣рдо рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рдХрд▓рд╛рдХреГрддрд┐рдпреЛрдВ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВрдЧреЗред рд╣рдо рдЕрдкрдиреЗ рдирдП рдмрдиреЗ рдкреНрд▓рдЧ-рдЗрди рдХреЛ рдСрдЯреЛрдЯреЗрд╕реНрдЯреНрд╕ рдХреА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд╕рд╛рде рдорд╛рдирдХ рдЕрдЪреВрдХ-рдкреНрд▓рдЧрдЗрди рдХреЗ рд╕рд╛рде рдЬреЛрдбрд╝рддреЗ рд╣реИрдВред

 <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-site-plugin</artifactId> <version>3.2</version> <configuration> <reportPlugins> <plugin> <groupId>ru.yandex.qatools.examples</groupId> <artifactId>custom-report-plugin</artifactId> <version>${project.version}</version> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-report-plugin</artifactId> <version>2.14.1</version> </plugin> </reportPlugins> </configuration> </plugin> 

рдФрд░ mvn clean site рдХрдорд╛рдВрдб рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░реЗрдВред

рджреЗрдЦрд╛! рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЛ рдкрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рд╕рд╛рдЗрдЯ рдЪрд░рдг рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдЬрд┐рд╕рдХреЗ рдврд╛рдВрдЪреЗ рдХреЗ рднреАрддрд░ рджреЛ рд░рд┐рдкреЛрд░реНрдЯ рдЙрддреНрдкрдиреНрди рдХреА рдЬрд╛рдПрдВрдЧреА: рд╕реНрдпреЛрд░рдлреЗрдпрд░ рд░рд┐рдкреЛрд░реНрдЯ рдФрд░ рдХрд╕реНрдЯрдо рд░рд┐рдкреЛрд░реНрдЯ ред

"рдЖрдк рджреЛ рд░рд┐рдкреЛрд░реНрдЯ рдХреНрдпреЛрдВ рдмрдирд╛рддреЗ рд╣реИрдВ?" рдЖрдк рдкреВрдЫрддреЗ рд╣реИрдВред рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ jUnit рдирд┐рдпрдо рддрдВрддреНрд░ рд╕рд╣реА рдирд╣реАрдВ рд╣реИред рдпрджрд┐ рдХреЛрдИ рдЕрдкрд╡рд╛рдж рдкрд░реАрдХреНрд╖рдг рдирд┐рд░реНрдорд╛рддрд╛ рдореЗрдВ рдпрд╛ рдкреИрд░рд╛рдореАрдЯрд░рд╛рдЗрдЬреЗрд╢рди рд╡рд┐рдзрд┐ рдореЗрдВ рдЕрдкрд╡рд╛рдж рдлреЗрдВрдХрддрд╛ рд╣реИ, рддреЛ рдкрддрд╡рд╛рд░ рдирд╣реАрдВ рдмрдирд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рд░рд┐рдкреЛрд░реНрдЯ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЗ рд▓рд┐рдП рдбреЗрдЯрд╛ рдПрдХрддреНрд░ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЬреЛ рдмрджрд▓реЗ рдореЗрдВ рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдкрд░реАрдХреНрд╖рдг рд░рд┐рдкреЛрд░реНрдЯ рдореЗрдВ рдирд╣реАрдВ рдЖрдПрдЧрд╛ред рдЖрдк RunListener рдпрд╛ Runner рдХреЗ рд╕рд╛рде рдбреЗрдЯрд╛ рд╕рдВрдЧреНрд░рд╣ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рд╕реБрдзрд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рдЕрдирд╛рд╡рд╢реНрдпрдХ рддрд░реНрдХ рдХреА рддрд░рд╣ рд▓рдЧрддрд╛ рд╣реИред рдЯреВрдЯреЗ рд╣реБрдП рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рднреА рдЬрд╛рдирдХрд╛рд░реА рд╕реНрдпреЛрд░рдлрд╝реЗрдпрд░ рд░рд┐рдкреЛрд░реНрдЯ рдореЗрдВ рд╣реИред

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


рдЗрд╕рд▓рд┐рдП, рд╣рдордиреЗ рд╕реАрдЦрд╛ рдХрд┐ рдХреИрд╕реЗ рдЬреНрдпреВрдирд┐рдЯ рдФрд░ рдорд╛рд╡реЗрди рдлреНрд░реЗрдорд╡рд░реНрдХ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╡реНрдпрд╛рдЦреНрдпрд╛рддреНрдордХ рд░рд┐рдкреЛрд░реНрдЯ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд┐рдпрд╛ рдЬрд╛рдПред

рдЖрдХрд░реНрд╖рдг рдЖрддреЗ рд╣реИрдВ

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

рд╡рд┐рдкрдХреНрд╖

  1. рддрдХрдиреАрдХ рдХрд╛ рдЕрдЪреНрдЫрд╛ рдЬреНрдЮрд╛рди рдЖрд╡рд╢реНрдпрдХ рд╣реИ (XSD, JAXB, jUnit Rules, Maven Reporting Plugin)ред рдЕрдЧрд░ рдХреБрдЫ рдЧрд▓рдд рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЖрдк рдмрд╣реБрдд рд╕рдордп рдЦреЛрдиреЗ рдХрд╛ рдЬреЛрдЦрд┐рдо рдЙрдард╛рддреЗ рд╣реИрдВред
  2. рдПрдХ рдЬрдЯрд┐рд▓ рд░рд┐рдкреЛрд░реНрдЯ (рд╕реНрдХреАрдорд╛ рд╕реЗ html рддрдХ) рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЗ рдкреВрд░реЗ рдЪрдХреНрд░ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдирд╛ рдХрд╛рдлреА рдХрдард┐рди рд╣реИ

рд╕рд┐рдлрд╛рд░рд┐рд╢реЗрдВ

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


рд▓реЗрдЦ рдореЗрдВ рдореИрдВрдиреЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рддрдХрдиреАрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХреА рд╣реИ:
1. рдПрдбреЗрдкреНрдЯрд░ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП jUnit , jUnit рдирд┐рдпрдо ред
2. xml рдореЗрдВ рдХрд┐рд╕реА рдореЙрдбрд▓ рдХреЛ рдХреНрд░рдорд╛рдВрдХрд┐рдд / рдбрд┐рд╕реЗрд░рд▓рд╛рдЗрдЬрд╝ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП JAXB ред
3. рддреИрдпрд╛рд░ рдбреЗрдЯрд╛ рдкрд░ рдПрдХ рд░рд┐рдкреЛрд░реНрдЯ рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдорд╛рд╡реЗрди рд░рд┐рдкреЛрд░реНрдЯрд┐рдВрдЧ рдкреНрд▓рдЧрдЗрдиреНрд╕ ред

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рд╕реНрд░реЛрдд рдХреЛрдб github рдкрд░ рдЙрдкрд▓рдмреНрдз рд╣реИред рдЬреЛрдмрд╛, рдЬреЛ рд░рд┐рдкреЛрд░реНрдЯ рдмрдирд╛ рд░рд╣реА рд╣реИ, рдЙрдкрд▓рдмреНрдз рд╣реИ ред

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


All Articles