Não Sou TDD: Teste Pragmático com Java

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