Impacto da Instrumentação em Testes Intermitentes
Esse estudo explora como a instrumentação afeta a confiabilidade dos testes de software.
― 7 min ler
Índice
Testes instáveis são um problema comum em testes de software. Acontece quando um teste dá resultados diferentes toda vez que é executado, mesmo quando o código testado não mudou. Isso pode criar confusão porque os desenvolvedores podem não saber se o código tem um bug ou se o teste em si é não confiável. Testes instáveis podem passar uma vez e falhar na próxima, levando a perda de tempo e esforço.
Vários fatores podem levar a testes instáveis. Alguns deles incluem como os testes são executados, qualquer aleatoriedade envolvida e se múltiplos testes estão rodando ao mesmo tempo. Outros problemas, como problemas de rede ou recursos compartilhados, também podem afetar a confiabilidade dos testes. Esses fatores podem ocorrer em diferentes plataformas de programação.
Instrumentação e Seus Efeitos
Instrumentação se refere a adicionar ferramentas ou recursos a um programa para coletar informações durante sua execução. Isso pode ajudar em tarefas como medir desempenho ou verificar a cobertura de código. No contexto de testes instáveis, queremos saber se essa instrumentação adicionada pode mudar como os testes se comportam.
Idealmente, ao usar ferramentas para monitoramento ou medição de cobertura, os resultados dos testes devem permanecer os mesmos, com ou sem a instrumentação. No entanto, isso nem sempre é verdade. Alguns estudos mostraram que a instrumentação pode mudar como um programa roda, o que pode levar a testes instáveis.
Por exemplo, um relatório do Google notou que a instrumentação poderia interferir nos resultados dos testes, fazendo com que parecessem instáveis. Outros estudos descobriram que o uso de certas ferramentas de monitoramento também pode levar a comportamentos inesperados em testes. No entanto, grande parte dessa pesquisa é baseada em experiências práticas na indústria, e não há muitas evidências claras detalhando como a instrumentação afeta a instabilidade em vários programas.
Objetivo da Pesquisa
O objetivo da nossa pesquisa era determinar se a instrumentação causa testes instáveis ou se tem pouco efeito sobre eles. Queríamos coletar evidências sistemáticas para responder a essa pergunta e descobrir como a instrumentação interage com testes instáveis.
Para explorar isso, focamos em três tipos de instrumentação comumente usados em programas Java:
- Monitoramento de Desempenho de Aplicações (APM)
- Ferramentas de Cobertura de Código
- Ferramentas de Profiling
Examinamos uma coleção de nove programas Java diferentes provenientes de conjuntos de dados existentes conhecidos por estudar a flakiness dos testes. Ao rodar esses programas com e sem instrumentação, buscamos identificar como a instrumentação afetou o resultado de cada teste.
Desenho do Estudo
No nosso estudo, repetimos os testes em cada programa vinte vezes para coletar dados precisos. Depois, comparamos os resultados das execuções sem instrumentação com aqueles com vários tipos de instrumentação.
Os programas específicos que escolhemos são projetos open-source populares encontrados no GitHub. Para alguns projetos maiores, não conseguimos incluí-los na nossa análise devido ao tempo que consumiam. Portanto, nosso estudo final incluiu nove programas, permitindo que focássemos profundamente no comportamento deles em diferentes condições.
Os tipos de instrumentação usados em nossos experimentos incluíram:
- Elastic APM: Usado para monitorar o desempenho da aplicação.
- OpenTelemetry: Uma ferramenta para coletar dados sobre o desempenho das aplicações.
- JaCoCo: Uma ferramenta de cobertura de código que mostra quais partes do código foram testadas.
- Cobertura de Código do IntelliJ: Outra ferramenta de medição do popular ambiente de desenvolvimento Java.
- Java Flight Recorder: Uma ferramenta de profiling que coleta informações de execução sobre aplicações Java.
Coleta de Dados
Para avaliar como a instrumentação afeta a flakiness dos testes, definimos duas métricas principais para analisar nossos resultados:
Contagem de Testes Instáveis: Essa métrica mede quantos testes mostraram resultados diferentes nas execuções repetidas. Se um teste produziu resultados diferentes em duas execuções, foi contado como instável.
Pontuação de Instabilidade: Essa pontuação reflete quanta variação existe entre os resultados das execuções dos testes. Por exemplo, se um certo teste falhou apenas uma vez em vinte execuções, isso ainda indicaria alguma instabilidade. Com a instrumentação, poderíamos medir se a frequência de resultados instáveis mudou.
Comparando os resultados das execuções sem instrumentação com aqueles que usaram várias ferramentas de instrumentação, buscamos ver se havia uma diferença notável.
Resultados do Estudo
Depois de rodar os testes, coletamos dados sobre os resultados para cada programa em cada configuração (com e sem instrumentação). Registramos detalhes sobre quantos testes passaram, falharam ou foram instáveis em cada execução.
No geral, nossas descobertas mostraram que a instrumentação não muda significativamente os resultados dos testes. A maior parte do tempo, o comportamento dos testes se manteve estável, independentemente de a instrumentação estar aplicada ou não.
No entanto, notamos que houve alguns casos específicos onde a instrumentação parecia causar comportamento instável em certos testes. Nesses casos, os testes falharam devido a problemas como dependências de rede e não diretamente por causa da instrumentação em si. Por exemplo, um teste falhou porque tentou usar um recurso de rede que não estava disponível.
Em contraste, para a maior parte dos programas que estudamos, não houve um aumento claro nos testes instáveis quando a instrumentação foi introduzida. Os resultados permaneceram em grande parte consistentes, indicando que a instrumentação não causa, em geral, falhas nos testes.
Discussão dos Resultados
Nossa pesquisa lança luz sobre a relação entre instrumentação e flakiness dos testes. Embora houvesse ocasiões em que a instrumentação influenciou os resultados dos testes, essas foram raras. Na maioria dos casos, a instrumentação não parecia introduzir ou aumentar o comportamento instável nos testes nos programas examinados.
Isso leva a mais perguntas sobre a interação entre instrumentação e técnicas existentes projetadas para detectar ou prevenir testes instáveis. Alguns métodos de detecção dependem da análise do código de teste sem executá-lo, o que pode levar a conclusões incorretas se a instrumentação estiver envolvida.
Métodos de detecção dinâmica, que executam testes, também podem enfrentar desafios com base na ordem em que a instrumentação é aplicada. No entanto, o efeito geral parece ser mínimo.
Limitações do Estudo
Embora nossa pesquisa forneça insights valiosos, existem algumas limitações a considerar. A seleção de programas pode não representar todos os possíveis cenários de flakiness dos testes, e o comportamento dos testes pode variar com base em fatores externos.
Realizamos cada experimento várias vezes para levar em conta a variabilidade, mas os resultados podem diferir se mais testes forem realizados em diferentes ambientes.
Conclusão e Direções Futuras
Em resumo, nosso estudo indica que a instrumentação tem pouco efeito na ocorrência de testes instáveis em software. Embora alguns casos mostrassem uma conexão, isso não foi uma questão disseminada nos programas examinados.
Pesquisas futuras podem expandir nossas descobertas incluindo uma gama mais ampla de ferramentas de instrumentação e examinando diferentes cenários de programação. Fazendo isso, poderíamos compreender melhor as nuances de como a instrumentação interage com testes de software e potencialmente desenvolver estratégias para minimizar testes instáveis em aplicações críticas.
Através de investigações contínuas, esperamos contribuir para melhores práticas de teste e melhorar a confiabilidade geral dos processos de teste de software.
Título: On the Effect of Instrumentation on Test Flakiness
Resumo: Test flakiness is a problem that affects testing and processes that rely on it. Several factors cause or influence the flakiness of test outcomes. Test execution order, randomness and concurrency are some of the more common and well-studied causes. Some studies mention code instrumentation as a factor that causes or affects test flakiness. However, evidence for this issue is scarce. In this study, we attempt to systematically collect evidence for the effects of instrumentation on test flakiness. We experiment with common types of instrumentation for Java programs - namely, application performance monitoring, coverage and profiling instrumentation. We then study the effects of instrumentation on a set of nine programs obtained from an existing dataset used to study test flakiness, consisting of popular GitHub projects written in Java. We observe cases where real-world instrumentation causes flakiness in a program. However, this effect is rare. We also discuss a related issue - how instrumentation may interfere with flakiness detection and prevention.
Autores: Shawn Rasheed, Jens Dietrich, Amjed Tahir
Última atualização: 2023-03-16 00:00:00
Idioma: English
Fonte URL: https://arxiv.org/abs/2303.09755
Fonte PDF: https://arxiv.org/pdf/2303.09755
Licença: https://creativecommons.org/licenses/by/4.0/
Alterações: Este resumo foi elaborado com a assistência da AI e pode conter imprecisões. Para obter informações exactas, consulte os documentos originais ligados aqui.
Obrigado ao arxiv pela utilização da sua interoperabilidade de acesso aberto.