Artigo Software Testing: A Research Travelogue - Resumo em PT-BR
Tags: softwaredevelopment, tests, productivity, testing
Published: 2024-02-12 16:12:03

Estou animada para compartilhar um resumo do artigo "**_Software Testing: A Research Travelogue_**". Quero passar o meu conhecimento que adquiri (e anotações que fiz) durante minha vida acadêmica de um jeito fácil de entender; neste caso foi para minha matéria de Teste de Software no mestrado como aluna especial em Sistemas de Informação na USP. Neste resumo, coloquei as informações mais importantes do artigo para ajudar a todos interessados em Teste de Software, seja estudante, profissional ou apenas curioso. Espero que este resumo seja útil, dando uma visão geral do progresso da pesquisa em Teste de Software e mostrando as maiores contribuições e desafios desde os anos 2000. Vamos lá! 🚀

O Teste de Software é uma estratégia amplamente estudada para avaliar e melhorar a qualidade do software. O artigo tem como objetivo apresentar as pesquisas bem-sucedidas e desafios da área desde os anos 2000, contemplando o estado da arte e possíveis direções futuras.

Em 2000, a Conferência Internacional de Engenharia de Software realizou sua primeira trilha "Futuro da Engenharia de Software", apresentando alguns _roadmaps_ para a área. Um deles era o "_Testing: A Roadmap_", de autoria de **Mary Jean Harrold**. A partir desse conceito, surgiu este diário de bordo do Teste de Software pelos autores, prestando homenagem à cientista e orientadora de PhD deles. 👸🏻

![Nuvem de palavras gerada a partir das respostas à pesquisa informal dos autores.](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/1034c0uhvzl2bm1xl9la.png)

O Teste de Software continua sendo um dos tópicos mais pesquisados na Engenharia de Software. Mary Jean Harrold afirma em sua trilha que:

> "A qualidade do software se tornará o critério de sucesso dominante na indústria de software."

Foi realizada uma pesquisa com mais de 50 pesquisadores da área de Teste de Software, com as seguintes perguntas:

1. Quais são as contribuições mais significativas para os testes desde os anos 2000, sejam suas ou de outros pesquisadores?
2. Quais são os maiores desafios e oportunidades em aberto para futuras pesquisas nesta área?

30 deles responderam à pesquisa com comentários onde as seguintes palavras foram as 5 mais citadas:

1. Empírico
2. Prático
3. Regressão
4. Ferramentas
5. Simbólico

As pesquisas dos contribuintes foram identificadas e classificadas como **contribuições de pesquisa** e **contribuição prática**, sendo que a última foi impulsionada mais pelo esforço industrial do que pelas atividades de pesquisa.

## Contribuições de Pesquisa

Existem 9 contribuições principais, que podem ser classificadas em 4 categorias principais:

### 1. Geração de entrada de teste automatizado

As técnicas automatizadas de geração de entrada de teste tentam gerar um conjunto de valores de entrada para um programa ou componente de programa, geralmente com o objetivo de atingir alguma meta de cobertura ou alcançar um estado particular (como a falha de uma asserção).

- **Execução Simbólica**: Executa um programa usando entradas simbólicas em vez de concretas. Em qualquer ponto da computação, o estado do programa consiste em um estado simbólico expresso em função das entradas, e as condições nas entradas que fazem com que a execução chegue a esse ponto são tipicamente expressas como um conjunto de restrições em forma conjuntiva chamada condição de caminho (PC).
- **Baseado em Busca**: Empresas como Microsoft e IBM usam técnicas de SBST. Essa técnica visa problemas de otimização, como encontrar o menor conjunto de casos de teste que cobrem todas as ramificações de um programa, tudo baseado em técnicas de otimização baseadas em meta-heurísticas.
- **Testes Aleatórios**: Nos RTs, pesquisas vão além da geração de entrada aleatória simples, investigando abordagens mais sofisticadas e, até certo ponto, baseadas em princípios que possam melhorar a eficácia dessa técnica tradicional. Uma abordagem de RT é o teste aleatório adaptativo, que é uma classe de técnicas de teste projetadas para melhorar a eficácia de detecção de falhas do teste aleatório.

### 2. Estratégias de teste

Estas incluem testes combinatórios, testes baseados em modelos e mineração e aprendizado a partir dos dados de campo. Entre eles, temos:

- **Testes Combinatórios**: Na prática, testar todas as configurações de um sistema, que pode ter um número enorme de configurações diferentes, é, na maioria das vezes, impossível devido ao tamanho do espaço de configuração. Os testadores devem, portanto, encontrar maneiras de amostrar esses espaços e realizar testes eficazes ao mesmo tempo que contêm o custo envolvido. O teste de interação combinatória (CIT) oferece estratégias para fazer isso.
- **Teste Baseado em Modelo**: O teste baseado em modelo (MBT) envolve a derivação de conjuntos de testes a partir de uma ampla variedade de modelos de sistemas de software.
- **Mineração e Aprendizagem com Dados de Campo**: Atualmente, é cada vez mais comum coletar um amplo espectro de informações dinâmicas do software após ele ter sido implantado, enquanto ele é executado nas plataformas do usuário, e usar esse campo (ou telemetria) para apoiar as atividades de teste e melhorar sua eficácia.

### 3. Teste de regressão

Para realizar testes de regressão, os engenheiros geralmente começam reutilizando T, mas reutilizar todo T (a abordagem de reteste-tudo) pode ser excessivamente caro. Técnicas de seleção de teste de regressão (RTS) são muito incentivadas na pesquisa para diminuir o custo de execução de suítes de teste de regressão.

### 4. Estudos empíricos e suporte para eles

As técnicas de teste são tipicamente heurísticas e seu desempenho pode diferir amplamente em diferentes cargas de trabalho e cenários de teste. Para entender e avaliar essas técnicas, métodos empíricos são, portanto, essenciais. A disponibilidade crescente de objetos de experimentação tem contribuído para este progresso.

## Contribuições Práticas

Duas grandes contribuições nesse contexto são a definição de novos _frameworks_ para execução de testes, que melhoram e difundem drasticamente a arte do teste de software (como por exemplo o JUnit), e a ampla adoção de práticas inovadoras que promovem ciclos mais curtos no processo de teste, como a integração contínua (CI). Este conceito está ligado ao teste automatizado de _frameworks_ de execução, em que um conjunto de testes de regressão deve ser executado automaticamente no código para ajudar a garantir que a base de código permaneça estável.

### Referências

Orso, Alessandro, and Gregg Rothermel. "_Software testing: a research travelogue _(2000–2014)." _Future of Software Engineering Proceedings_. 2014. 117-132. [Link do artigo](https://sites.cc.gatech.edu/fac/Alex.Orso/papers/orso.rothermel.ICSE2014-FOSE.pdf).