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

рдпреВрдирд┐рдЯ рдкрд░реАрдХреНрд╖рдг рд╣реЛрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЙрдЪреНрдЪ рд╕реНрддрд░ рдХреЗ рд╣реЛрддреЗ рд╣реИрдВред рдФрд░ рдЬрдм рдЙрдирдХреА рд╕рдВрдЦреНрдпрд╛ рдмрдврд╝рдиреЗ рд▓рдЧрддреА рд╣реИ, рддреЛ рд▓реЙрдиреНрдЪ рдХреЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рдирд╛ рдПрдХ рд╕рдорд╕реНрдпрд╛ рдмрди рдЬрд╛рддреА рд╣реИред рдореБрдЭреЗ рдИрдорд╛рдирджрд╛рд░реА рд╕реЗ рдмрддрд╛рдПрдВ, рдЖрдк рдореЗрдВ рд╕реЗ рдХрд┐рд╕рдиреЗ рдЕрдкрдиреА рд░рд┐рдкреЛрд░реНрдЯ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рд╕реЛрдЪрд╛ рдерд╛?
рд╡рд┐рд╕реНрддреГрдд рд▓реЙрдЧ, рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ, рдЕрдиреБрд░реЛрдз / рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдбрдВрдк рдФрд░ рдЕрдиреНрдп рдЕрддрд┐рд░рд┐рдХреНрдд рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд╕рд╛рде (рдЬреЛ, рд╡реИрд╕реЗ, рддреНрд░реБрдЯрд┐ рдХреЗ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХрд╛рд░рдгреЛрдВ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреА рд╕реБрд╡рд┐рдзрд╛ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ)ред рдореБрдЭреЗ рдпрдХреАрди рд╣реИ рдХрд┐ рдХреБрдЫ рд▓реЛрдЧ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рд╕рдлрд▓ рднреА рд╣реБрдП рд╣реИрдВред рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рд░рд┐рдкреЛрд░реНрдЯ рдмрдирд╛рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИ, рдФрд░ рдХрд┐рд╕реА рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХрд╛рд░реНрдп рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд▓рдЧ рд░рд┐рдкреЛрд░реНрдЯ рдмрдирд╛рдиреЗ рдореЗрдВ рд▓рдВрдмрд╛ рд╕рдордп рд▓рдЧрддрд╛ рд╣реИред рдЬрдм рддрдХ, рдЬрд╝рд╛рд╣рд┐рд░ рд╣реИ, рдЖрдк рдЧрд▓рддреА рд╕реЗ
jUnit рдФрд░
Maven рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЖрдк рдХреБрдЫ рдШрдВрдЯреЛрдВ рдореЗрдВ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкреНрд░рдХрд╛рд░ рдХреЗ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд░рд▓ рд░рд┐рдкреЛрд░реНрдЯ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рд╣рдореЗрдВ
xUnit рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдЕрдиреНрдп рдкрд░реАрдХреНрд╖рдг рд░рд┐рдкреЛрд░реНрдЯ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпреЛрдВ рд╣реИ?
рдЙрдЪреНрдЪ-рд╕реНрддрд░реАрдп рдкрд░реАрдХреНрд╖рдг рдЗрдХрд╛рдИ рдкрд░реАрдХреНрд╖рдгреЛрдВ рд╕реЗ рднрд┐рдиреНрди рд╣реЛрддреЗ рд╣реИрдВ рдФрд░ рдЗрдирдореЗрдВ рдХрдИ рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ рд╣реЛрддреА рд╣реИрдВ:
- рд╡реЗ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдЬрд┐рд╕рд╕реЗ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╕реНрдерд╛рдиреАрдп рдмрдирд╛рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╡реЗрдм рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдПрдХ рдкрд░реАрдХреНрд╖рдг рдПрдкреАрдЖрдИ рдХреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдмрджрд▓реЗ рдореЗрдВ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдмрджрд▓реЗ рдореЗрдВ ... рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ, рдЖрдк рд╕рдордЭрддреЗ рд╣реИрдВред
- рдЗрд╕ рддрд░рд╣ рдХреЗ рдкрд░реАрдХреНрд╖рдг рдмрд┐рдЪреМрд▓рд┐рдпреЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕рд┐рд╕реНрдЯрдо рдкрд░ рдХрд╛рд░реНрдп рдХрд░рддреЗ рд╣реИрдВред рдпрд╣ рдПрдХ рдмреНрд░рд╛рдЙрдЬрд╝рд░, http- рд╕рд░реНрд╡рд░, рдкреНрд░реЙрдХреНрд╕реА, рдерд░реНрдб-рдкрд╛рд░реНрдЯреА рд╕рд┐рд╕реНрдЯрдо рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЕрдкрдирд╛ рддрд░реНрдХ рднреА рд╣реИред
- рдЗрд╕ рддрд░рд╣ рдХреЗ рдкрд░реАрдХреНрд╖рдг рдЖрдорддреМрд░ рдкрд░ рдХрд╛рдлреА рд╣реЛрддреЗ рд╣реИрдВ рдФрд░ рдЕрдХреНрд╕рд░ рдЕрддрд┐рд░рд┐рдХреНрдд рд╡рд░реНрдЧреАрдХрд░рдг рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдкрдбрд╝рддрд╛ рд╣реИред рдпреЗ рдШрдЯрдХ, рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЗ рдХреНрд╖реЗрддреНрд░, рдорд╣рддреНрд╡рдкреВрд░реНрдгрддрд╛ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред
рдпреЗ рд╕рднреА рдХрд╛рд░рдХ рд╕рдорд╕реНрдпрд╛ рдХреЗ рд╕реНрдерд╛рдиреАрдпрдХрд░рдг рдХреА рджрд░ рдХреЛ рдХрд╛рдлреА рдзреАрдорд╛ рдХрд░ рджреЗрддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╡реЗрдм рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рд▓рд┐рдП рдкрд░реАрдХреНрд╖рдг рдореЗрдВ рддреНрд░реБрдЯрд┐ "рддрддреНрд╡ рдмрдЯрди рдкрд░ рдХреНрд▓рд┐рдХ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИ" рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ:
- рдкреГрд╖реНрда рдЯрд╛рдЗрдордЖрдЙрдЯ рджреНрд╡рд╛рд░рд╛ рд▓реЛрдб рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛;
- рдкреГрд╖реНрда рдкрд░ рдХреЛрдИ рдЦреЛрдЬ рдмрдЯрди рддрддреНрд╡ рдирд╣реАрдВ рд╣реИред
- рдЦреЛрдЬ рдмрдЯрди рддрддреНрд╡ рдореМрдЬреВрдж рд╣реИ, рд▓реЗрдХрд┐рди рдЙрд╕ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рдирд╛ рдЕрд╕рдВрднрд╡ рд╣реИ;
- рдПрдХ рдЙрд▓реНрдХрд╛рдкрд┐рдВрдб рдбреЗрдЯрд╛ рд╕реЗрдВрдЯрд░ рдкрд░ рдЧрд┐рд░ рдЧрдпрд╛ рдЬрд┐рд╕рдореЗрдВ рд╕реЗрд╡рд╛ рдШреВрдо рд░рд╣реА рд╣реИред
рдпрджрд┐ рдЖрдк рдЗрд╕ рдкрд░реАрдХреНрд╖рдг рдХреЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ, рдкреЗрдЬ рд╕реНрд░реЛрдд, рдПрдХ рдиреЗрдЯрд╡рд░реНрдХ рд▓реЙрдЧ рдФрд░ рдбреЗрдЯрд╛ рд╕реЗрдВрдЯрд░ рдХреЗ рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рдЕрдВрддрд░рд┐рдХреНрд╖ рдЧрддрд┐рд╡рд┐рдзрд┐ рдХрд╛ рд╕рд╛рд░рд╛рдВрд╢ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ, рддреЛ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕рдорд╕реНрдпрд╛ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рдирд╛ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реЛрдЧрд╛, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рд╣рдо рдХрдо рд╕рдордп рдмрд┐рддрд╛рдПрдВрдЧреЗред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЕрддрд┐рд░рд┐рдХреНрдд рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд╕рд╛рде рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд░рд┐рдкреЛрд░реНрдЯ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рдПрдХ рдмрд╛рд░ рдЯреЗрд╕реНрдЯ рдерд╛
рд╣рдорд╛рд░реЗ рдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдкрд░реАрдХреНрд╖рдг рд╡рд┐рд╖рдп рдХреЗ рд░реВрдк рдореЗрдВ, рд╣рдо рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рд╛рдзрд╛рд░рдг рдкрд░реАрдХреНрд╖рд╛ рд▓реЗрддреЗ рд╣реИрдВ:
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 рд╕реЗ рдмреЗрд╣рддрд░ рд╣реИред рдПрдХ рдорд╛рдирдХ рдкрд░реАрдХреНрд╖рдг рд░рд┐рдкреЛрд░реНрдЯ
рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрд╛рдИ рджреЗрдЧреА:

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

рдЖрдЗрдП рдПрдХ рд╕рд╛рде рд╕реЛрдЪрддреЗ рд╣реИрдВ рдХрд┐ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдкрд░ рдЬрд▓реНрджреА рдирд┐рд░реНрдгрдп рд▓реЗрдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдореЗрдВ рдХреМрди рд╕реЗ рдбреЗрдЯрд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
- рдореВрд▓ рдкреГрд╖реНрда рдФрд░ рдЙрдореНрдореАрджрд╡рд╛рд░ рдХрд╛ рд╕реНрдХреНрд░реАрдирд╢реЙрдЯред
- рдлрд╝рдВрдХреНрд╢рдирд▓ рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ (рдЖрдк, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд▓рд╛рд▓ рд░рдВрдЧ рдХреЗ рд╕рднреА рдЕрд▓рдЧ-рдЕрд▓рдЧ рдкрд┐рдХреНрд╕реЗрд▓ рдХреЛ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ)
- рдореВрд▓ рдкреГрд╖реНрда рдФрд░ рдЙрдореНрдореАрджрд╡рд╛рд░ рдХреЗ рд╕реНрд░реЛрддред
рдЗрд╕ рддрд░рд╣ рдХреЗ рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде, рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд┐рд╖реНрдХрд░реНрд╖ рдирд┐рдХрд╛рд▓рдирд╛ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реЛ рдЬрд╛рдПрдЧрд╛, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рд╕рд╕реНрддрд╛ред
рд░рд┐рдкреЛрд░реНрдЯ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди
рдПрдХ рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рдкрд░реАрдХреНрд╖рдг рд░рд┐рдкреЛрд░реНрдЯ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рддреАрди рдЪрд░рдгреЛрдВ рд╕реЗ рдЧреБрдЬрд░рдирд╛ рд╣реЛрдЧрд╛:
- рдореЙрдбрд▓ ред рдЗрд╕рдореЗрдВ рд░рд┐рдкреЛрд░реНрдЯ рдореЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╕рднреА рдЬрд╛рдирдХрд╛рд░реА рд╣реЛрдЧреАред
- рдПрдбрд╛рдкреНрдЯрд░ред рдЙрд╕реЗ рдкрд░реАрдХреНрд╖рдг рд╕реЗ рдореЙрдбрд▓ рддрдХ рд╕рднреА рдЖрд╡рд╢реНрдпрдХ рдЬрд╛рдирдХрд╛рд░реА рдПрдХрддреНрд░ рдХрд░рдиреА рд╣реЛрдЧреАред
- рд░рд┐рдкреЛрд░реНрдЯ рдЬрдирд░реЗрд╢рди рдПрдХрддреНрд░рд┐рдд рдЖрдВрдХрдбрд╝реЛрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рд╣рдо рдЯреЗрдореНрдкрд▓реЗрдЯреНрд╕ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдПрдХ рд░рд┐рдкреЛрд░реНрдЯ рддреИрдпрд╛рд░ рдХрд░рддреЗ рд╣реИрдВред
рддреЛ, рдХреНрд░рдо рдореЗрдВред
рдЖрджрд░реНрд╢
рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо
рдЬрд╛рд╡рд╛ 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 @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; public String getMessage() { return message; } public void setMessage(String value) { this.message = value; } public String getDescription() { return description; } public void setDescription(String value) { this.description = value; } public ScreenShotData getOrigin() { return origin; } public void setOrigin(ScreenShotData value) { this.origin = value; } public ScreenShotData getModified() { return modified; } public void setModified(ScreenShotData value) { this.modified = value; } public DiffData getDiff() { return diff; } public void setDiff(DiffData value) { this.diff = value; } public String getUid() { return uid; } public void setUid(String value) { this.uid = value; } public String getTitle() { return title; } public void setTitle(String value) { this.title = value; } public Status getStatus() { return 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)
- рдЗрд╕реЗ TestCaseResult рдореЙрдбрд▓ рдХреЗ рдкреНрд░рд╛рд░рдВрдн рдФрд░ рд╕рднреА рдЖрд╡рд╢реНрдпрдХ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдореЗрдВ рдЬреЛрдбрд╝реЗрдВред protected void succeeded(org.junit.runner.Description description)
- рдЗрд╕рдореЗрдВ рд╣рдордиреЗ рдЕрдкрдиреЗ рдЯреЗрд╕реНрдЯ рдХреА рд╕реНрдерд┐рддрд┐ рдареАрдХ рд╣реИред 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)
- рдпрд╣рд╛рдВ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╕рд╢рд░реНрдд рддрд░реНрдХ рд╣реЛрдВрдЧреЗред рдЕрдЧрд░ e instanceOf AssertionViolatedException
, рддрдм рдкрд░реАрдХреНрд╖рдг (FAIL) рдореЗрдВ рдХреЛрдИ рддреНрд░реБрдЯрд┐ рд╣реБрдИ, рдХрд┐рд╕реА рдЕрдиреНрдп рдорд╛рдорд▓реЗ рдореЗрдВ рдкрд░реАрдХреНрд╖рдг рдЯреВрдЯ рдЧрдпрд╛ рд╣реИ (ERROR)ред protected void finished(org.junit.runner.Description description)
- рдпрд╣рд╛рдБ рд╣рдо xml рдореЗрдВ TestCaseResult рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдХреНрд░рдордмрджреНрдз рдХрд░рддреЗ рд╣реИрдВред
рдЙрдкрд░реЛрдХреНрдд рд╕рднреА рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╣рдорд╛рд░реЗ рд╕реНрдЯреАрдпрд░рд┐рдВрдЧ рд╡реНрд╣реАрд▓ рдХреЛ рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ рд▓реЗрдиреЗ рдФрд░ рд╕рд╣реЗрдЬрдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬреЛ рдХрд┐ рддрд░реАрдХреЛрдВ рдореЗрдВ рд╡рд░реНрдгрд┐рдд рд╣реИ:
public BufferedImage takeOriginScreenShot(String url)
- url рджреНрд╡рд╛рд░рд╛ рдореВрд▓ рдкреГрд╖реНрда рдХрд╛ рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ рд▓реЗрдВ, рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ рдХреЛ рдлрд╝рд╛рдЗрд▓ рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рд╕рд╣реЗрдЬреЗрдВ, рдбреЗрдЯрд╛ рд╕реЗ рд▓рд┐рдВрдХ рдХрд░реЗрдВ рдФрд░ BufferedImage рдкрд░ рд╡рд╛рдкрд╕ рд▓реМрдЯреЗрдВред public BufferedImage takeModifiedScreenShot(String url)
- рдПрдХ рд╣реА рд╕рдВрдЪрд╛рд▓рди, рдХреЗрд╡рд▓ рдЙрдореНрдореАрджрд╡рд╛рд░ рдкреГрд╖реНрда рдХреЗ рд▓рд┐рдПред public DiffData diff(BufferedImage original, BufferedImage modified)
- рд╣рдо рджреЛ рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ рдХрд╛ рдЕрдВрддрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ, рдлрд╛рдЗрд▓ рд╕рд┐рд╕реНрдЯрдо рдХреЛ рд╕рд╣реЗрдЬрддреЗ рд╣реИрдВ, рдбреЗрдЯрд╛ рд╕реЗ рд▓рд┐рдВрдХ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЕрдВрддрд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд╕рд╛рде рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рд╡рд╛рдкрд╕ рдХрд░рддреЗ рд╣реИрдВред
рд╣рдо рд╕рднреА рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ
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 ()
рд╡рд┐рдзрд┐ рд╣реИред рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЙрд╕реЗ рдЪрд╛рд╣рд┐рдП:
- рд╕рднреА рдкрд░реАрдХреНрд╖рдг рдбреЗрдЯрд╛ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдПрдВред
File[] testCasesFiles = listOfFiles(reportDirectory, ".*-testcase\\.xml");
- рдЙрдиреНрд╣реЗрдВ рдкрдврд╝реЗрдВ рдФрд░ рд╡рд╕реНрддреБрдУрдВ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░реЗрдВред
List<TestCaseResult> testCases = convert(testCasesFile, new Converter<File, TestCaseResult>(){ public TestCaseResult convert (File file) { return JAXB.unmarshall(file, TestCaseResult.xml); } });
- рдбреЗрдЯрд╛ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ index.html рдЙрддреНрдкрдиреНрди рдХрд░реЗрдВред рдЖрдк рдлреНрд░реАрдорд╛рд░реНрдХрд░ рдФрд░ рдЗрд╕ рдЯреЗрдореНрдкрд▓реЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдЯреЗрдореНрдкрд▓реЗрдЯ рдЗрдВрдЬрди рдХреЗ рд░реВрдк рдореЗрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
String source = processTemplate(TEMPLATE_NAME, testCases);
- рдЗрд╕ рд░рд┐рдкреЛрд░реНрдЯ рдХреА рдЬрд╛рдирдХрд╛рд░реА рдПрдХ рдЧреНрд░реБрдкрд┐рдВрдЧ рдорд╛рд╡реЗрди рд░рд┐рдкреЛрд░реНрдЯ рдореЗрдВ рдЬреЛрдбрд╝реЗрдВред
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 рдХреЗ рд╕рд╛рде рдбреЗрдЯрд╛ рд╕рдВрдЧреНрд░рд╣ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рд╕реБрдзрд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рдЕрдирд╛рд╡рд╢реНрдпрдХ рддрд░реНрдХ рдХреА рддрд░рд╣ рд▓рдЧрддрд╛ рд╣реИред рдЯреВрдЯреЗ рд╣реБрдП рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рднреА рдЬрд╛рдирдХрд╛рд░реА рд╕реНрдпреЛрд░рдлрд╝реЗрдпрд░ рд░рд┐рдкреЛрд░реНрдЯ рдореЗрдВ рд╣реИред
рдкрд░рд┐рдгрд╛рдо
рдЗрд╕рд▓рд┐рдП, рд╣рдордиреЗ рд╕реАрдЦрд╛ рдХрд┐ рдХреИрд╕реЗ рдЬреНрдпреВрдирд┐рдЯ рдФрд░ рдорд╛рд╡реЗрди рдлреНрд░реЗрдорд╡рд░реНрдХ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╡реНрдпрд╛рдЦреНрдпрд╛рддреНрдордХ рд░рд┐рдкреЛрд░реНрдЯ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд┐рдпрд╛ рдЬрд╛рдПред
рдЖрдХрд░реНрд╖рдг рдЖрддреЗ рд╣реИрдВ
- рд╣рдореЗрдВ рдореБрдлреНрдд рдХреЗ рд▓рд┐рдП рдореБрдлреНрдд (рд╕рдорд╛рдирд╛рдВрддрд░ рд▓реЙрдиреНрдЪ, рдорд╛рдирдХреАрдХрд░рдг, рд╢реНрд░реЗрдгрд┐рдпрд╛рдВ) рдЪрд▓рд╛рдиреЗ рдФрд░ рдкрд░реАрдХреНрд╖рдг рдХреЗ рдЖрдпреЛрдЬрди рдХреЗ рд▓рд┐рдП рдЬрдиреАрдЯ рдлреНрд░реЗрдорд╡рд░реНрдХ рдХреА рд╕рднреА рд╕реБрд╡рд┐рдзрд╛рдПрдБ рдорд┐рд▓рддреА рд╣реИрдВред
- рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдбреЗрдЯрд╛ рдФрд░ рдкреНрд░рд╕реНрддреБрддрд┐ рд╕рд╛рдЭрд╛ рдХрд░реЗрдВред рдЖрдк рдПрдбрд╛рдкреНрдЯрд░ рдХреЛ рдХрд┐рд╕реА рдЕрдиреНрдп рднрд╛рд╖рд╛ рдореЗрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЕрдЬрдЧрд░ рдореЗрдВ) рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рджреГрд╢реНрдп рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрд╕реА рдкреНрд▓рдЧрдЗрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред рдпрд╛ рдПрдХ рд╣реА рдбреЗрдЯрд╛ рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ-рдЕрд▓рдЧ рдкреНрд▓рдЧрдЗрдиреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред
- рдорд╛рд╡реЗрди рд╡реИрдЧрди рдкреНрд▓рдЧрд┐рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА (ssh, https, ftp, webdav, рдЖрджрд┐) рдХреЛ рд░рд┐рдкреЛрд░реНрдЯ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдореЗрдВ рдирд┐: рд╢реБрд▓реНрдХ рд░рд┐рдкреЛрд░реНрдЯрд┐рдВрдЧ рддрд░реНрдХ рдорд┐рд▓рддрд╛ рд╣реИред
- рд╣рдо рдПрдХ "рдЖрдВрд╢рд┐рдХ рд░рд┐рдкреЛрд░реНрдЯ" рдЙрддреНрдкрдиреНрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рдкрд░реАрдХреНрд╖рдг рдирд┐рд╖реНрдкрд╛рджрди рдФрд░ рд░рд┐рдкреЛрд░реНрдЯрд┐рдВрдЧ рдХреЗ рдкреНрд░рд╡рд╛рд╣ рдХреЛ рдЕрд▓рдЧ рдХрд░рдХреЗ рд╣рд╛рд╕рд┐рд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдПрдХ рдереНрд░реЗрдб рдкрд░реАрдХреНрд╖рдг рдХрд░рддрд╛ рд╣реИ (рдЬреЛ рдбреЗрдЯрд╛ рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИ), рдФрд░ рджреВрд╕рд░рд╛ рд╕рдордп-рд╕рдордп рдкрд░ рдПрдХ рд░рд┐рдкреЛрд░реНрдЯ рдмрдирд╛рддрд╛ рд╣реИред
рд╡рд┐рдкрдХреНрд╖
- рддрдХрдиреАрдХ рдХрд╛ рдЕрдЪреНрдЫрд╛ рдЬреНрдЮрд╛рди рдЖрд╡рд╢реНрдпрдХ рд╣реИ (XSD, JAXB, jUnit Rules, Maven Reporting Plugin)ред рдЕрдЧрд░ рдХреБрдЫ рдЧрд▓рдд рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЖрдк рдмрд╣реБрдд рд╕рдордп рдЦреЛрдиреЗ рдХрд╛ рдЬреЛрдЦрд┐рдо рдЙрдард╛рддреЗ рд╣реИрдВред
- рдПрдХ рдЬрдЯрд┐рд▓ рд░рд┐рдкреЛрд░реНрдЯ (рд╕реНрдХреАрдорд╛ рд╕реЗ html рддрдХ) рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЗ рдкреВрд░реЗ рдЪрдХреНрд░ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдирд╛ рдХрд╛рдлреА рдХрдард┐рди рд╣реИ
рд╕рд┐рдлрд╛рд░рд┐рд╢реЗрдВ
- рдРрд╕реА рдкреНрд░рдгрд╛рд▓рд┐рдпреЛрдВ рдХрд╛ рд╡рд┐рдХрд╛рд╕ рд╕рдордп рд▓реЗрдиреЗ рд╡рд╛рд▓рд╛ рд╣реИред рд╣рдореЗрдВ рд▓рдЧрднрдЧ 50 рд▓реАрдЯрд░ рдХреЙрдлреА, рджреЛ рдмреИрдЧ рдХреБрдХреАрдЬ рдФрд░ 793 рдХреНрд▓рд┐рдХреНрд╕ рдмрд┐рд▓реНрдб рдмрдЯрди рдкрд░ рдкрд╣рд▓реЗ рдПрдХ рдХреЛ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЦрд╛рддрд╛ рдкреНрд░реМрджреНрдпреЛрдЧрд┐рдХреА рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдФрд░ рд░реЗрдХ рд╕рдВрдЧреНрд░рд╣ рдореЗрдВ рд▓реЗ рдЧрдпрд╛ред рдЕрдм рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХрд╛рд░реНрдп рдХреЗ рд▓рд┐рдП рдПрдХ рд░рд┐рдкреЛрд░реНрдЯ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдореЗрдВ рд▓рдЧрднрдЧ рджреЛ рджрд┐рди рд▓рдЧрддреЗ рд╣реИрдВред рдЗрд╕ рд░рд┐рдкреЛрд░реНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдЬреАрддрдиреЗ рдХрд╛ рд╕рдордп рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░реЗрдВред рдпрд╣ рдмрдбрд╝рд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
- рдЗрд╕ рддрд░рд╣ рдХреА рд░рд┐рдкреЛрд░реНрдЯ рдХреА рд╕рдореАрдХреНрд╖рд╛ рдореЗрдВ рдкреВрд░реА рдЯреАрдо рдХреЗ рднрд╛рдЧ рд▓реЗрдиреЗ рдкрд░ рд╕рдмрд╕реЗ рдмрдбрд╝рд╛ рдкреНрд░рднрд╛рд╡ рдкреНрд░рд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИред
рд▓реЗрдЦ рдореЗрдВ рдореИрдВрдиреЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рддрдХрдиреАрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХреА рд╣реИ:
1. рдПрдбреЗрдкреНрдЯрд░ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП
jUnit ,
jUnit рдирд┐рдпрдо ред
2. xml рдореЗрдВ рдХрд┐рд╕реА рдореЙрдбрд▓ рдХреЛ рдХреНрд░рдорд╛рдВрдХрд┐рдд /
рдбрд┐рд╕реЗрд░рд▓рд╛рдЗрдЬрд╝ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП
JAXB ред
3. рддреИрдпрд╛рд░ рдбреЗрдЯрд╛ рдкрд░ рдПрдХ рд░рд┐рдкреЛрд░реНрдЯ рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП
рдорд╛рд╡реЗрди рд░рд┐рдкреЛрд░реНрдЯрд┐рдВрдЧ рдкреНрд▓рдЧрдЗрдиреНрд╕ ред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рд╕реНрд░реЛрдд рдХреЛрдб
github рдкрд░ рдЙрдкрд▓рдмреНрдз рд╣реИред рдЬреЛрдмрд╛, рдЬреЛ рд░рд┐рдкреЛрд░реНрдЯ рдмрдирд╛ рд░рд╣реА рд╣реИ, рдЙрдкрд▓рдмреНрдз
рд╣реИ ред