what is mutation testing
Este tutorial explica o que é teste de mutação, como realizá-lo e os tipos de teste de mutação com exemplos:
O que é teste de mutação?
O teste de mutação é uma técnica de teste baseada em falha em que variações de um programa de software são submetidas ao conjunto de dados de teste. Isso é feito para determinar a eficácia do conjunto de testes no isolamento dos desvios.
Parece um pouco complicado, não é?
O que você aprenderá:
Teste de mutação
O Teste de Mutação (MT) vai longe, desde os anos 70, onde foi proposto pela primeira vez como um projeto escolar. Ele foi cancelado por consumir muitos recursos. No entanto, à medida que os humanos continuaram a desenvolver computadores mais avançados, ele lentamente fez um retorno e agora é uma das técnicas de teste mais populares.
Definição de teste de mutação
MT também é conhecido como teste baseado em falha, mutação de programa, teste baseado em erro, ou análise de mutação .
Como o nome sugere, o teste de mutação é um tipo de teste de software baseado em mudanças ou mutações. Mudanças minúsculas são introduzidas no código-fonte para verificar se os casos de teste definidos podem detectar erros no código.
O caso ideal é que nenhum dos casos de teste seja aprovado. Se o teste for bem-sucedido, isso significa que há um erro no código. Dizemos que o mutante (a versão modificada de nosso código) viveu. Se o teste falhar, não há erro no código e o mutante foi eliminado. Nosso objetivo é matar todos os mutantes.
O teste de mutação também ajuda a testar a qualidade dos casos de teste definidos ou das suítes de teste com o objetivo de escrever casos de teste mais eficazes. Quanto mais mutantes pudermos matar, maior será a qualidade de nossos testes.
Conceitos de teste de mutação
Antes de discutirmos os testes de mutação, vamos explorar alguns conceitos que encontraremos.
# 1) Mutantes: É simplesmente a versão modificada do código-fonte. É o código que contém mudanças minuciosas. Quando os dados de teste são executados no mutante, o ideal é que eles nos forneçam resultados diferentes do código-fonte original. Mutantes também são chamados programas mutantes .
Existem diferentes tipos de mutantes. São os seguintes:
- Mutantes sobreviventes: Como mencionamos, esses são os mutantes que ainda estão vivos após a execução de dados de teste por meio das variantes original e mutada do código-fonte. Eles devem ser mortos. Eles também são conhecidos como mutantes vivos.
- Mutantes Mortos: Estes são mutantes que são mortos após o teste de mutação. Obtemos isso quando obtemos resultados diferentes das versões original e mutada do código-fonte.
- Mutantes equivalentes: Eles estão intimamente relacionados a mutantes vivos, no sentido de que eles estão 'vivos' mesmo depois de executar dados de teste por meio deles. O que os diferencia dos outros é que eles têm o mesmo significado que o código-fonte original, embora possam ter sintaxe diferente.
# 2) Mutadores / operadores de mutação: Isso é o que torna as mutações possíveis, elas estão no 'assento do motorista'. Eles basicamente definem o tipo de alteração ou mudança a ser feita no código-fonte para ter uma versão mutante. Eles podem ser referidos como falhas ou regras de mutação .
# 3) Pontuação de mutação: Esta é uma pontuação baseada no número de mutantes.
É calculado usando a fórmula abaixo:
Observe que, mutantes equivalentes não são considerados no cálculo da pontuação de mutação. A pontuação de mutação também é conhecida como adequação de mutação . Nosso objetivo deve ser atingir um alto índice de mutação.
Como fazer testes de mutação
Passo 1: Vamos escrever nosso teste de unidade Jasmine.
Suíte de Teste (Jasmine)
describe('User', function() { it('should compare the two numbers from user input', function(){ expect(20).toBeGreaterThan(5); }) });
Passo 2: Escreva o código original.
Código original (Javascript)
const user_info = () => { mother_age = parseInt(prompt('Enter mother's age')) daughter_age = parseInt(prompt('Enter daughter's age')) if (mother_age > daughter_age) { alert(`Daughter's age is ${daughter_age}. Mother's age is ${mother_age}. Welcome to the Mother-Daughter program`) } else { alert(`Daughter's age: ${daughter_age}, is more than mother's age: ${mother_age}. Please enter correct ages`) } } user_info();
Etapa 3: Em seguida, executaremos o teste por meio do código original para garantir que não tenhamos falhado nos testes desde o início. Devemos ter alguma saída que comunique que realmente escrevemos um teste com zero falhas.
Por exemplo:
terminou em 0,019s 1 especificação, 0 falhas, randomizado com semente 31435
Resultado do código original:
Daughter's age is 5. Mother's age is 20. Welcome to the Mother-Daughter program
Passo 4: Apresente o mutante. Neste caso, mudamos o Maior que operador (mother_age> daughter_age) para um menos do que operador (mother_age Código mutante (Javascript) Etapa 5: Em seguida, executamos o teste por meio do código mutante. Aqui estão os resultados do teste: terminou em 0,017s 1 especificação, 0 falhas, randomizado com semente 89555 Resultado do código mutante: Etapa # 6: Compare os resultados da versão original e da versão mutante. Nesse caso, eles são diferentes, mesmo se o mesmo conjunto de testes foi usado. Portanto, matamos nosso mutante. Nosso conjunto de testes está pronto para uso. Existem vários tipos de mutações. Eles são explicados a seguir. Aqui, introduzimos uma mutação alterando o parâmetro e / ou os valores constantes, geralmente em +/- 1. Exemplo: código original (Javascript) Se o código acima era para multiplicar os números pares onde eu<4 , então a mutação de valor significaria alterar a inicialização para deixe i = 1 . Exemplo: código mutante (Javascript) Aqui, excluímos ou duplicamos uma instrução em um bloco de código. Também podemos reorganizar as instruções em um bloco de código. Em um bloco if-else, por exemplo, poderíamos deletar a parte do else ou até mesmo o bloco if-else inteiro. Exemplo: código original (Javascript) Exemplo: código mutante (Javascript) O alvo aqui é o código que toma decisões, por exemplo, comparações de valores. Nós podemos mudar > para< como em nosso exemplo de programa Mãe-Filha. Outros operadores que podemos trocar incluem o seguinte: As vantagens do teste de mutação (MT) incluem: As desvantagens do teste de mutação (MT) incluem: Ferramentas são úteis para acelerar o processo de geração de mutantes. Aqui estão algumas ferramentas que podemos usar no MT: Stryker, Jumble, PIT e Insure ++. Vamos aprender com um exemplo: Digamos que existe um site de hospital que permite o registro de novos usuários. Lê a data de nascimento ou idade do paciente. Se for maior que 14, designa um clínico geral como seu médico principal. Para isso, invoca a função de 'médico geral' que encontra o médico disponível. Agora, pode haver outra funcionalidade. Talvez, pacientes com menos de 13 anos sejam designados a um pediatra e assim por diante. Mas vamos considerar apenas o caso de maiores de 14 anos. Esta é a aparência do código: 1) Idade de leitura Observe que as linhas de código acima não são específicas para nenhuma linguagem de programação e não serão executadas. É apenas hipotético. Como testador, se meu conjunto de dados for 14, 15, 0, 13 - alguns números aleatórios. O objetivo é verificar se o conjunto de dados dos 4 valores (14, 15, 0 e 3) é adequado para identificar todos os possíveis problemas com este código. Leia também => Dicas para projetar dados de teste antes de executar seus casos de teste Como o teste de mutação consegue isso? Em primeiro lugar, você cria variações mutantes do programa. Um mutante nada mais é que um programa escrito como um desvio. Ele contém uma falha auto-propagada. Exemplos são: Essas substituições também são chamadas ‘Mutation Operators’. Deixe-me mostrar alguns exemplos: Mutante # 1: operador relacionalsubstituição 1) Idade de leitura Mutante # 2: 1) Idade de leitura Mutante # 3: 1) Idade de leitura Mutante # 4: 1) Idade de leitura Mutante # 5: Remoção de declaração 1) Idade de leitura Mutante # 6: Inserção de valor absoluto 1) Idade de leitura Mutante nº 7: sintaxe incorreta 1) Idade de leitura Mutante # 8: faz a mesma coisa que o teste original 1) Idade de leitura Uma vez, todos os mutantes são criados. Eles são submetidos ao conjunto de dados de teste. Nosso conjunto é 14, 15, 0 e 13. Qual desses mutantes nosso conjunto de dados encontrará? Descubra na tabela abaixo: (Clique na imagem para ampliá-la) Como você pode ver, nosso valor de dados 14 encontra falhas quando é executado contra o Mutante 2, 3 e 4. Ou, 14 mata os mutantes 2, 3 e 4. Mas, é ineficaz contra o, 1, 6 e 8. Se seu conjunto de dados mata todos os mutantes, ele é eficaz. Caso contrário, inclua mais ou melhores dados de teste. Não é necessário que cada valor no conjunto de dados mate todos os mutantes. Mas juntos, eles deveriam matar todos.Por exemplo:14 mata 2, 3 e 4. 15 mata 1, 2 e 4. E assim por diante. Que tal 5, 7 e 8? Mutante # 5 - é a instância do programa que falhará independentemente de qualquer valor de dados fornecido. Isso ocorre porque ele não fará nenhuma programação para valores válidos e inválidos. Mutante # 7 - será um erro de compilação. Ou, no caso de uma linguagem de script, um erro que impedirá a execução. Mutante # 8 - é a mesma coisa que o programa principal. Como você pode ver, os mutantes acima não são úteis. Portanto, os mutantes a evitar são: Você está pensando, se isso exigir tanto esforço, o que acontecerá quando eu tiver que testar grandes amostras de código? O teste de mutação depende de duas coisas: Então, ele se concentra na menor unidade de código e coloca sua fé na habilidade do programador para escalar os testes de mutação para programas maiores. Este tutorial cobriu a definição, os tipos e as etapas do teste de mutação para realizar esse teste em detalhes com exemplos. Esperamos que você tenha gostado de ler e aprender sobre esta técnica de teste interessante - Teste de Mutação. Sobre o autor: Este artigo foi escrito pelo membro da equipe STH Swati S. Por favor, compartilhe seus comentários, perguntas e pensamentos abaixo. const user_info = () =>{ mother_age = parseInt(prompt('Enter mother's age')) daughter_age = parseInt(prompt('Enter daughter's age')) if (mother_age
Daughter's age: 5, is more than mother's age: 20. Please enter correct ages
Tipos de teste de mutação
# 1) Mutação de valor
let arr = [2,3,4,5] for(let i=0; i
let arr = [2,3,4,5] for(let i=1; i
# 2) Mutação de declaração
let arr = [2,3,4,5] for(let i=0; i
let arr = [2,3,4,5] for(let i=0; i
# 3) Mutação de decisão
Operador original Operador mutante 1 <= > = dois > = == 3 === == 4 e ou 5 || &&
Ferramentas de teste de mutação
Mais sobre testes de mutação
dois) Se idade> 14
3) Médico = Médico Geral ()
4) Fim se
2) Se envelhecer com<’
3) Médico = Médico Geral ()
4) Terminar se
2) Se idade = 14 ‘Mudando o> com =’
3) Médico = Médico Geral ()
4) Terminar se
2) Se idade> = 14 ‘Alterar o> com> =’
3) Médico = Médico Geral ()
4) Terminar se
2) Se envelhecer com<=’
3) Médico = Médico Geral ()
4) Terminar se
2) Se idade = 14
3) 'remover a declaração de atribuição do médico'
4) Terminar se
2) Se a idade for> 14
3) Médico = Sr.X (inserção de valor absoluto - digamos que X seja um pediatra)
4) Terminar se
2) Se idade %% 14 (sintaxe incorreta)
3) Médico = Médico Geral ()
4) Terminar se
2) Se idade> 14 e idade> 14 'significa a mesma coisa que idade> 14'
3) Médico = Médico Geral ()
4) Terminar se
Pontos a serem observados
quem é responsável pelo valor de negócios fornecido por uma equipe scrum?
Conclusão
Leitura recomendada