frente
Li várias coisas antes de fazer essa pergunta, incluindo muitas questões relevantes aqui no SE:
- (Software Engineering SE) Escrevendo testes para código cujo objetivo não entendo
- (Software Engineering SE) A equipe de novatos em testes de unidade precisa fazer o teste de unidade
- (Software Engineering SE) Práticas recomendadas para atualizar o código herdado com testes automatizados
- (Software Engineering SE) Como testar sistemas de grandes legados?
- (Postagem no blog) Como simular seu ambiente de teste de unidade
No entanto, não posso deixar de sentir que a coceira ainda não foi arranhada depois de ler para obter ajuda.
TL; DR
Como escrevo testes de unidade para código legado que não consigo executar, simular, ler ou entender facilmente? Quais testes de regressão são úteis para um componente que provavelmente funciona como planejado?
A figura inteira
Eu sou uma estagiária de verão de novo quando estou entrando na faculdade. Minha tarefa envolve estes requisitos:
- Para um produto específico, avalie se nossa equipe de software pode atualizar sua versão IDE e JUnit sem perder a compatibilidade com seus projetos existentes.
- Desenvolva testes de unidade para algum componente no código Java existente (em grande parte não é Java). Queremos convencer a equipe de software de que o teste de unidade e o TDD são ferramentas inestimáveis que eles deveriam usar. (No momento, há 0% de cobertura de código.)
- De alguma forma, termine os dias de codificação de cowboys para um sistema crítico.
Após obter uma cópia do código-fonte, tentei compilá-lo e executá-lo, para entender o que esse produto faz e como ele funciona. Não pude. Perguntei aos meus supervisores como eu faço e recebi uma nova máquina autônoma capaz de construí-la, incluindo os scripts de construção que realmente funcionam. Isso também não funcionou porque, como deveriam, o código de produção é executado apenas no sistema incorporado para o qual foi projetado. No entanto, eles têm um simulador para esse fim, então eles obtiveram o simulador e o colocaram nesta máquina para mim. O simulador também não funcionou. Em vez disso, finalmente recebi uma impressão de uma GUI para uma tela específica. Eles também não têm comentários de código em nenhum lugar no Java LOC de mais de 700.000, tornando ainda mais difícil de entender. Além disso, houve problemas ao avaliar se seus projetos eram ou não compatíveis com os IDEs mais novos. Particularmente, o código deles não foi carregado corretamente na versão IDE que eles usam.
Meu inventário está assim:
- NetBeans 8, 9, 10, 11
- JUnit 4, 5
- Seu código-fonte para um produto específico (inclui mais de 700.000 Java LOC)
- Praticamente nenhum comentário de código (ocasionalmente uma assinatura)
- Nenhum teste existente
- Uma foto física de uma janela da GUI
- Um documento de design de software (109 p.) Que não discute o componente na imagem
Eu pelo menos tenho o suficiente para escrever teoricamente testes que podem ser executados. Então, eu tentei um teste básico de unidade nesse componente. No entanto, não consegui inicializar os objetos que ele possuía como dependências, incluindo modelos, gerenciadores e conexões com o banco de dados. Como não tenho muita experiência em JUnit além dos testes básicos de unidade, siga-me na próxima seção.
O que aprendi com minha leitura
- Zombando: Se eu escrever um teste de unidade, provavelmente precisará ter variáveis simuladas para dependências de produção nas quais não consigo inicializar facilmente
setUp
. - Todos aqui liberalmente sugerem o livro "Trabalhando efetivamente com o código legado", de Michael Feathers.
- Provavelmente, os testes de regressão são um bom ponto de partida. Acho que não tenho armas suficientes para tentar o teste de integração, e os testes de regressão proporcionariam gratificação mais instantânea à nossa equipe de software. No entanto, não tenho acesso aos bugs conhecidos deles; mas eu poderia perguntar.
E agora uma tentativa de articular a incerteza que ainda tenho como questão. Essencialmente, não entendo como parte da escrita desses testes. Supondo que não receba nenhuma orientação adicional de meus supervisores (provavelmente), é da minha responsabilidade não apenas aprender o que esse componente faz, mas decidir quais testes são realmente úteis como testes de regressão.
Como profissionais que trabalharam com projetos como esse por mais tempo do que eu, você pode oferecer alguma orientação sobre como escrever testes de unidade nesse tipo de situação?
How do I write unit tests for legacy code that I can't build, run, simulate, read about, or otherwise understand?
Você não pode. Você precisa pelo menos saber qual é a saída esperada para uma determinada entrada.