Olá.
Já publiquei
um artigo sobre minha experiência na automação de testes de regressão visual.
Desde então, o projeto foi significativamente aprimorado - a estrutura mudou, ficou muito mais fácil configurá-lo e começar a escrever autotestes, o relatório foi significativamente aprimorado.
VisualRegressionFramework é uma solução bastante simples para pequenos projetos. Cerca de 50 autotestes (páginas + elementos) foram escritos para o projeto em que estou trabalhando.
Eu executo testes após alterações no layout. Quaisquer alterações são visíveis imediatamente, ou seja, problemas como "
alteraram o layout do elemento em uma página, mas tudo quebrou na outra página " há muito tempo que foi resolvido.
Tecnologias utilizadas - Java, TestNG, Maven, Selenium Webdriver, aShot (biblioteca para comparação de imagens).
Recursos:
- Compare capturas de tela de páginas
- Comparação de capturas de tela da página + ignorando elementos especificados (conteúdo dinâmico etc.)
- Compare capturas de tela de itens
- Pontos de interrupção - você pode comparar capturas de tela de páginas ou elementos com larguras diferentes. Por padrão, são usados 3 pontos de interrupção - 1920px, 768px, 360px
- Gerar automaticamente as capturas de tela esperadas
- Você pode escrever testes como autotestes funcionais comuns, não há restrições - isso é importante porque às vezes pode ser necessário executar algumas ações complexas antes de fazer uma captura de tela.
Relatório
O relatório fica assim:

A barra lateral esquerda contém uma lista de testes, um log com erros, o navegador no qual os autotestes foram executados.
Você também pode alternar entre pontos de interrupção e ampliar qualquer imagem clicando nela.
Estrutura de estrutura
src / config / visual.properties - aqui estão todas as configurações necessárias
- pontos de interrupção - pontos de interrupção, a largura do site em que uma captura de tela será feita
- allowableDiffSize - discrepância permitida entre a captura de tela esperada e a atual em pixels
- caminhos para pastas com screenshots
- caminhos para o modelo do relatório, para o próprio relatório e para o arquivo com o log de erros
report / REPORT.html - relatório
screenshots- actual - capturas de tela reais criadas durante o teste
- esperado - capturas de tela esperadas, se não houver capturas de tela esperadas, elas serão criadas automaticamente na primeira vez que você executar o teste
- diff - imagem na qual as áreas incompatíveis são destacadas em vermelho
- gif - gifs criados a partir de imagens reais, esperadas e diferentes
src / main / framework - classes de
estrutura - gerador de relatórios, capturas de tela, gifs, etc.
src / main / app é apenas um exemplo de arquitetura de objeto de página, não é necessário usá-lo, pode ser excluído.
src / test / resources / testng.xml - aqui você precisa adicionar novas classes de teste, entre A_BeforeAllTests e A_AfterAllTests
src / test / java- A_BaseTest - a classe de teste base da qual todas as novas classes de teste devem herdar
- A_BeforeAllTests - inicialização de configurações e navegador antes dos testes
- A_AfterAllTests - geração de relatório após testes
- A_ErrorsLogListener - erros de log
- StaticGuestTest - exemplo de classe de teste
As classes são executadas em uma ordem específica:- primeiro, a inicialização das configurações e do navegador - classe A_BeforeAllTests
- depois teste autotestes
- e, no final, um relatório é gerado - classe A_AfterAllTests
Como trabalhar com a estrutura
Exemplo de teste@Test public void indexPage() { app.open(); app.preparePageForScreenshot(); Comparer.comparePages("index_page"); }
No exemplo acima, a página simplesmente se abre e, em seguida, a página é preparada para uma captura de tela, após a qual as capturas de tela esperadas e atuais da página são comparadas. As capturas de tela são criadas e comparadas em todos os pontos de interrupção.
Por que precisamos da função preparePageForScreenshot () :
Por padrão, a página simplesmente rola para baixo e, em seguida, sob js +, ocorre um segundo atraso. Isso é necessário para que todas as imagens, estilos etc. possam ser carregados.
Também nesta função, você pode ocultar elementos desnecessários, por exemplo, um bloco dinâmico com publicidade. No meu projeto, oculto o rodapé, o cabeçalho e a barra lateral, pois são iguais em todas as páginas. Sem esses elementos, os testes funcionam mais rapidamente e a verificação de um relatório é mais fácil.
PáginasCompare as capturas de tela da página em todos os pontos de interrupção:
Comparer.comparePages("test_name");
Compare as capturas de tela da página em todos os pontos de interrupção + oculte elementos:
Comparer.comparePages("test_name", new String[]{"css_locator_1", "css_locator_2"});
Compare as capturas de tela da página apenas no ponto de interrupção especificado:
Comparer.comparePagesWithBreakpoint("test_name", "1920");
Compare capturas de tela da página apenas no ponto de interrupção especificado + oculte elementos:
Comparer.comparePagesWithBreakpoint("test_name", "1920", new String[]{"css_locator_1", "css_locator_2"});
ItensCompare capturas de tela do elemento especificado em todos os pontos de interrupção:
Comparer.compareElements("test_name", "css_locator");
Compare capturas de tela do elemento especificado apenas no ponto de interrupção especificado:
Comparer.compareElementsWithBreakpoint("test_name", "1920", "css_locator");
Link para o repositório do projetoQuestões atuais
- Uma área preta pode ser adicionada ao final da captura de tela. Eu encontrei isso por algum tempo. O problema desapareceu quando comecei a esconder o rodapé. Esta é uma questão de biblioteca da aShot - https://github.com/pazone/ashot/issues/169
- O autoteste pode não ser aprovado devido a uma diferença de vários pixels. O problema é resolvido aumentando o valor de TestConfig.allowableDiffSize .