De que se trata o artigo:

Testes de mutação têm a finalidade de atestar a qualidade dos casos de testes e consiste na geração de variações do programa original através de operadores de mutação. Neste sentido, este artigo apresenta diversos operadores de mutação, mostra o tipo de mutantes gerados por esses operadores e apresenta uma sugestão de utilização de cada operador.


Em que situação o tema é útil:

O critério de testes de mutação ajuda na criação de casos de testes mais eficientes que podem ser utilizados em partes críticas de sistemas.

Resumo DevMan:

Existem diversas técnicas e critérios para tornar a construção de casos de testes mais eficientes, ou seja, que tenham maior probabilidade de encontrar defeitos. Este artigo apoia a escolha de operadores de mutação que tragam benefícios para os casos de testes de um sistema evitando desperdícios de recursos tanto no momento da criação de mutantes quanto no momento de decisão de equivalência entre programas/métodos.

Autores: Victor Vidigal Ribeiro e Marco Antônio Pereira Araújo

A importante contribuição que os testes fornecem à qualidade do software é aceita tanto pelo meio acadêmico quanto pela indústria. Entretanto, sabe-se também que a criação de casos de testes sem nenhum tipo de critério é um desperdício de recursos.

Existem diversas técnicas e critérios para tornar a construção de casos de testes mais eficientes, ou seja, que tenham maior probabilidade de encontrar defeitos. Entretanto, a aplicação dessas técnicas não garante a eficácia nem a eficiência dos casos de testes criados e, com isto, não é possível afirmar que um determinado caso de teste é bom o suficiente para encontrar falhas.

Por exemplo, o critério de particionamento em classes de equivalência, juntamente com o critério de análise de valor limite, leva-nos a criar casos de testes onde o domínio de entrada (e de saída) é dividido em classes válidas e inválidas, e que valores que se encontram nas fronteiras de cada classe de equivalência devem ser utilizados na criação dos casos de testes. Mas a utilização desses critérios não garante que os casos de testes criados serão bons o suficiente para encontrar defeitos.

Com isto, uma técnica chamada de testes baseados em erros foi criada para tentar trazer mais qualidade aos casos de testes. Um dos critérios desta técnica é chamado de testes de mutação.

Os testes de mutação têm a finalidade de atestar a qualidade dos casos de testes e consiste na geração de variações do programa original através de operadores de mutação. Estes operadores de mutação realizam pequenas alterações no programa gerando variações desse programa: os mutantes. Diversos operadores podem ser aplicados dependendo do tipo de mutante que se deseja. Depois de gerado, os casos de testes são executados sobre os mutantes e verifica-se se as alterações inseridas através dos operadores de mutação foram detectadas. Caso essas operações tenham sido detectadas, pode-se dizer que os casos de testes são bons o suficiente para encontrar o tipo de erro (alterações) inserido pelos operadores de mutação. Caso contrário, os casos de testes devem ser melhorados, ou há uma equivalência entre o programa original e o mutante gerado.

Entretanto, uma das grandes críticas que é feita sobre o critério de testes de mutação é a grande quantidade de mutantes gerados, o que leva a um grande esforço computacional para execução de todos os casos de testes sobre os mutantes gerados, e também esforço humano para decidir sobre a equivalência entre programas.

Assim, a finalidade deste artigo é avaliar os operadores quanto a sua eficiência. Ou seja, dado um determinado operador e o mutante gerado por ele, que tipo de mutantes o operador pode gerar e como este operador pode ajudar na melhoria dos casos de teste. Com base neste conhecimento, seria possível decidir quais operadores utilizar e, com isso, economizar recursos.

Processo de criação dos testes de mutação

O processo que envolve os testes de mutação pode ser dividido em quatro fases distintas: geração de mutantes, execução dos testes sobre o programa, execução dos testes sobre os mutantes e análise dos mutantes vivos. A Figura 1 demonstra como esse processo ocorre.

Figura 1. Processo de execução dos testes de mutação

No primeiro passo, a geração de mutantes, pequenas alterações são inseridas no programa original através de operadores de mutação gerando os mutantes. Essas pequenas alterações baseiam-se na hipótese do programador competente para limitar o domínio de geração de mutantes. Além disto, baseia-se também no efeito de acoplamento, um conceito que diz que testes que distinguem todos os programas que diferem de um programa correto somente em erros simples são tão sensíveis que também distinguem implicitamente erros mais complexos.

A segunda etapa do processo é a execução dos testes sobre o programa original. Caso algum teste aponte um erro no programa, é preciso verificar manualmente qual é o defeito que está levando a esse erro e rodar os testes novamente. Essa etapa deve ser repetida até que o programa original passe nos testes.

A terceira etapa é a execução dos testes sobre os mutantes onde cada um dos mutantes gerados passa pelos mesmos testes que o programa original. Caso os mutantes não sejam aprovados nos testes, significa que aquele conjunto de testes é suficientemente bom para encontrar os tipos de defeitos inseridos pelos operadores de mutação escolhidos. Os mutantes que não passaram nos testes podem ser considerados mutantes mortos.

...

Quer ler esse conteúdo completo? Tenha acesso completo