Estamos construindo um clone do Google Photos, e testar é uma dificuldade absurda!
Como testamos se nosso aplicativo Java gera os processos ImageMagick corretos ou se as miniaturas resultantes têm o tamanho correto e são de fato miniaturas, e não apenas fotos aleatórias de gatos? Como testamos diferentes versões de ImageMagick e sistemas operacionais?
O que está no Vídeo
00:00 Introdução
Começamos o vídeo com uma visão geral do que torna tão complicado testar nosso clone do Google Photos. Como no último episódio, começamos a extrair miniaturas de imagens, mas agora precisamos de uma maneira de testar isso. Como isso é feito por meio de um processo externo de ImageMagick, estamos em uma jornada.
01:05 Configurando JUnit e Escrevendo os Primeiros Métodos de Teste
Em primeiro lugar, configuraremos o JUnit 5. Como não estamos usando um framework como Spring Boot, serve como um ótimo exercício adicionar o conjunto mínimo de bibliotecas e configuração que nos leva a executar com JUnit. Além disso, escreveremos alguns esqueletos de métodos de teste, enquanto pensamos em como abordaríamos o teste de nosso código existente e cuidando da nomenclatura de métodos de teste, etc.
04:19 Implementando Detecção da Versão ImageMagick
No último episódio, notamos que executar nosso aplicativo Java em diferentes sistemas leva a resultados inesperados ou erros simples. Isso ocorre porque diferentes versões do ImageMagick oferecem um conjunto diferente de APIs que precisamos chamar. Portanto, precisamos ajustar nosso código para detectar a versão instalada do ImageMagick e também adicionar um método de teste que verifica se o ImageMagick está realmente instalado, antes de executar quaisquer testes.
10:32 Análise de Trade-Offs
Como é evidente ao detectar versões do ImageMagick, o verdadeiro problema é que, para alcançar 100% de cobertura de teste com uma variedade de sistemas operacionais e versões instaladas do ImageMagick, você precisaria de uma configuração de CI/CD bastante elaborada, que não está no escopo deste projeto. Então, estamos discutindo os prós e contras de nossa abordagem.
12:00 Implementando @EnabledIfImageMagickIsInstalled
No entanto, o que podemos fazer é garantir que o resto de nossa suíte de testes só seja executado se o ImageMagick estiver instalado. Assim, escreveremos uma anotação personalizada do JUnit 5 chamada EnabledIfImageMagickIsInstalled
que você pode adicionar a quaisquer métodos de teste ou até mesmo a classes inteiras para habilitar esse comportamento. Se o ImageMagick não estiver instalado, os testes simplesmente não serão executados em vez de exibir uma mensagem de erro feia.
16:05 Testando Criação de Miniatura Com Sucesso
O maior problema a enfrentar é: Como podemos afirmar corretamente que as miniaturas foram criadas corretamente? Aprofundaremos esta questão testando o código de saída do ImageMagick, estimando os tamanhos dos arquivos e também carregando a imagem, e verificando se ela possui a quantidade correta de pixels. Tudo isso com a ajuda do AssertJ e suas SoftAssertions para combinar facilmente múltiplas afirmações em uma.
23:59 Ainda Funciona Apenas No Meu Computador
Mesmo após testarmos todo o nosso fluxo de trabalho, ainda precisamos garantir que chamemos uma API diferente do ImageMagick para versões diferentes. Podemos rapidamente adicionar esse comportamento para dar suporte tanto a IM6 quanto a IM7, e pronto.
25:53 Implantação
Hora de implantar o aplicativo no meu NAS. E desta vez, tudo funciona conforme o esperado!
26:20 Reflexões Finais Sobre Os Testes
Neste episódio, fizemos uma quantidade razoável de testes. Vamos resumir todos os desafios e estratégias de teste pragmáticas que aprendemos.
27:31 O Que Vem Depois
Vamos encerrar o episódio analisando o que vem a seguir: problemas de multithreading!
Até o próximo episódio.
Source:
https://dzone.com/articles/i-dont-tdd-pragmatic-testing-with-java