mutação de interface interface mutation: an approach for integration testing marcio e. delamaro...

24
Mutação de Interface Interface Mutation: An Approach for Integration Testing Marcio E. Delamaro José C. Maldonado Aditya P. Mathur

Upload: internet

Post on 17-Apr-2015

103 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Mutação de Interface Interface Mutation: An Approach for Integration Testing Marcio E. Delamaro José C. Maldonado Aditya P. Mathur

Mutação de Interface

Interface Mutation: An Approach for Integration Testing

Marcio E. Delamaro

José C. Maldonado

Aditya P. Mathur

Page 2: Mutação de Interface Interface Mutation: An Approach for Integration Testing Marcio E. Delamaro José C. Maldonado Aditya P. Mathur

Erros de Integração Ocorrem quando um valor incorreto é passado a

uma unidade.

Considere um programa P e um caso de teste t. Suponha que em P existem unidades F e G e

que F faz chamadas para G. Considere S1(G) a n-tupla de valores passados

para G e S0(G) a n-tupla de valores retornados de G.

Quando se executa P com o caso de teste t, um erro de integração é identificado na chamada de F para G quando:

Page 3: Mutação de Interface Interface Mutation: An Approach for Integration Testing Marcio E. Delamaro José C. Maldonado Aditya P. Mathur

Erros de Integração Tipo 1: entrando em G, S1(G) não têm os

valores esperados e estes valores causam uma falha antes de retornar de G.

Tipo 2: entrando em G, S1(G) não têm os valores esperados e estes valores levam a um S0(G) incorreto, que por sua vez causa uma falha depois de retornarem de G.

Tipo 3: entrando em G, S1(G) têm os valores esperados, mas valores incorretos em S0(G) são produzidos dentro de G e estes valores incorretos causam uma falha após retornarem de G.

Page 4: Mutação de Interface Interface Mutation: An Approach for Integration Testing Marcio E. Delamaro José C. Maldonado Aditya P. Mathur

Erros de IntegraçãoPor exemplo na linguagem C:

S1(G): A n-tupla de valores de entrada em uma chamada de função G é determinada por:

os valores dos parâmetros de entrada usados na chamada da função

as variáveis globais usadas em G S0(G): A n-tupla de valores de saída em uma

chamada de função G é determinada por: os valores dos parâmetros de saída usados

pela função as variáveis globais usadas em G os valores retornados por G

Page 5: Mutação de Interface Interface Mutation: An Approach for Integration Testing Marcio E. Delamaro José C. Maldonado Aditya P. Mathur

Erros de Integração

Page 6: Mutação de Interface Interface Mutation: An Approach for Integration Testing Marcio E. Delamaro José C. Maldonado Aditya P. Mathur

Mutação de Interface Para explicar Mutação de Interface foi

examinada a natureza dos dados trocados entre as unidades.

Em uma chamada de uma unidade F

para uma unidade G, foram identificados quatro modos em que dados podem ser trocados entre a unidade que chama e a unidade chamada:

Page 7: Mutação de Interface Interface Mutation: An Approach for Integration Testing Marcio E. Delamaro José C. Maldonado Aditya P. Mathur

Mutação de Interface Dados podem ser passados para G através de

parâmetros de entrada (passagem de parâmetros por valor)

Dados podem ser passados para G e/ou retornados para F através de parâmetros de entrada/saída (passagem de parâmetros por referência)

Dados podem ser passados para G e/ou retornados para F através de variáveis globais

Dados podem ser passados para F através de valores de retorno

Page 8: Mutação de Interface Interface Mutation: An Approach for Integration Testing Marcio E. Delamaro José C. Maldonado Aditya P. Mathur

Mutação de Interface O primeiro passo é perturbar o sistema

fazendo uma mudança sintática simples Este processo de perturbação

também conhecido como mutação e o programa perturbado como um mutante

Aplicação de Mutação de Interface somente nos pontos de interface

(ou conexões) entre as unidades

Page 9: Mutação de Interface Interface Mutation: An Approach for Integration Testing Marcio E. Delamaro José C. Maldonado Aditya P. Mathur

Mutação de Interface As variáveis ou expressões que influenciam

os quatro tipos de troca de dados são os candidatos para possíveis mutações.

A transformação é determinada por um operador de Mutação de Interface.

Depois dos mutantes gerados, os próximos passos na Mutação de Interface são os mesmos do teste de mutação tradicional:

executar os mutantes avaliar conjunto de testes adequado e decidir quais os mutantes equivalentes

Page 10: Mutação de Interface Interface Mutation: An Approach for Integration Testing Marcio E. Delamaro José C. Maldonado Aditya P. Mathur

Mutação de InterfaceExemplo:

Considere um operador de Mutação de Interface OP(v) que perturba uma variável v.

O testador pode escolher por exemplo a conexão S1-S3 para testar, neste caso OP é aplicado sobre variáveis desta conexão.

Page 11: Mutação de Interface Interface Mutation: An Approach for Integration Testing Marcio E. Delamaro José C. Maldonado Aditya P. Mathur

Mutação de Interface Introduzindo erros tipo 1 e 2: Para introduzir estes erros, OP pode mudar a

entrada da unidade S3. Esta entrada pode ser usada dentro de S3 e causar um retorno incorreto para a unidade S1.

OP pode ser aplicado de duas maneiras: primeiro, na passagem de parâmetros por valor, OP

pode ser aplicado na chamada da unidade S3 que ocorre dentro de S1;

segundo, na passagem de parâmetros por referência, OP pode ser aplicado nas referências que serão retornadas, dentro de S3.

Page 12: Mutação de Interface Interface Mutation: An Approach for Integration Testing Marcio E. Delamaro José C. Maldonado Aditya P. Mathur

Mutação de Interface Se o primeiro caso for usado,

OP é aplicado no arg linha 5: máximo 1 mutante. 1 caso de teste é necessário. dois dos três usos do parâmetro

x linhas 14,16 e 18 não testados. Se o segundo caso for usado:

um mutante para cada uso do parâmetro x

um caso de teste é requerido para distinguir cada um dos 3 mutantes.

cada referência para x seja testada pelo menos uma vez.

Page 13: Mutação de Interface Interface Mutation: An Approach for Integration Testing Marcio E. Delamaro José C. Maldonado Aditya P. Mathur

Mutação de InterfaceTeste de Interface versus Testes de Unidade

É importante notar que um operador de Mutação de Interface é focado no teste de interação entre duas unidades e não no teste de uma unidade.

Por exemplo: suponha que conexões S3–S4 vão ser testadas e o operador OP produz um mutante dentro da unidade S4.

Estes mutantes podem ser distinguidos por casos de testes que exercitem chamadas para S4 feitas de dentro de S2, de forma que a conexão que desejo não seja testada.

Este exemplo aponta para uma sutil diferença entre teste de unidade como uma mutação tradicional em relação à Mutação de Interface.

Page 14: Mutação de Interface Interface Mutation: An Approach for Integration Testing Marcio E. Delamaro José C. Maldonado Aditya P. Mathur

Mutação de InterfaceTeste de Interface versus Testes de Unidade

Quando o operador de Mutação de Interface é aplicado dentro de uma função chamada

Precisamos alterar a condição de Alcançabilidade para:

Condição de Alcançabilidade para Mutação de Interface: o caso de teste executa um caminho que alcança o ponto onde a mutação foi inserida (em relação à conexão A-B).

Page 15: Mutação de Interface Interface Mutation: An Approach for Integration Testing Marcio E. Delamaro José C. Maldonado Aditya P. Mathur

Operadores de MI para a Linguagem C Uma unidade em C

função que implementa algum serviço através de uma interface

Para uma função F, esta interface é definida por parâmetros formais, variáveis globais que

ele acessa, e o código que ela implementa. A conexão entre unidades são definidas por

chamada de funções. Operadores de Mutação de Interface

e operadores de Mutação tradicional A idéia em ambos é produzir sutis diferenças

entre o estado do programa original e do mutante.

Page 16: Mutação de Interface Interface Mutation: An Approach for Integration Testing Marcio E. Delamaro José C. Maldonado Aditya P. Mathur

Operadores de MI para a Linguagem C A função F que possui duas chamadas para a função

G:

Page 17: Mutação de Interface Interface Mutation: An Approach for Integration Testing Marcio E. Delamaro José C. Maldonado Aditya P. Mathur

Operadores de MI para a Linguagem C G’ é a função criada pela aplicação de um

operador de Mutação de Interface dentro da função G.

Existem dois mutantes diferentes para considerar quando a conexão F-G for testada.

O primeiro é criado trocando a primeira chamada de G por G’ e o segundo é criado trocando a segunda chamada de G por G’

Dois grupos de Operadores de MI são definidos considerando a conexão F-G

operadores do primeiro grupo são aplicados dentro do corpo da função G

Operadores do segundo são aplicados na chamada para G dentro de F

Page 18: Mutação de Interface Interface Mutation: An Approach for Integration Testing Marcio E. Delamaro José C. Maldonado Aditya P. Mathur

Operadores de MI para a Linguagem C Grupo I – Operadores Aplicados dentro da

Função Chamada. Estes operadores causam mudanças nos valores

de entrado e/ou saída de funções. Para a aplicação destes operadores é necessário

identificar o lugar de onde a função foi chamada. Mecanismo que habilite ou desabilite a mutação

dependendo ou não de onde G é chamada de F (PROTEUM/IM)

Quando a conexão A-B irá ser testada: P(B): Conjunto que inclui os parâmetros

formais de B. G(B): Conj. Variáveis globais acessadas por B. L(B): Conj. Variáveis declaradas em B (locais). E(B): Conj. Variáveis globais não acessadas em

B. C(B): Conj. Constantes usadas em B.

Page 19: Mutação de Interface Interface Mutation: An Approach for Integration Testing Marcio E. Delamaro José C. Maldonado Aditya P. Mathur

Operadores de MI para a Linguagem C Grupo I

Operadores de Substituição Direta de Variáveis

Operadores de Substituição Indireta

Operadores de Variáveis de Incremento e Decre-mento

Inserção de Operadores Unários

Operadores de Retorno Operadores de Cobertura

Page 20: Mutação de Interface Interface Mutation: An Approach for Integration Testing Marcio E. Delamaro José C. Maldonado Aditya P. Mathur

Operadores de MI para a Linguagem C Grupo II – Operadores Aplicados dentro

da Função que está fazendo a Chamanda.

Dado uma conexão A-B são aplicados na instrução onde A chama B e sobre estes argumentos da chamada

Quando um argumento é uma expressão são aplicados sobre a expressão inteira

não sobre os objetos da expressãocomo variáveis ou constantes

Page 21: Mutação de Interface Interface Mutation: An Approach for Integration Testing Marcio E. Delamaro José C. Maldonado Aditya P. Mathur

Operadores de MI para a Linguagem C Grupo I

Substituição de Argumentos Troca de Argumentos Eliminação de Argumentos Inserção de Operadores

Unários Exclusão de Chamada de

Função

Page 22: Mutação de Interface Interface Mutation: An Approach for Integration Testing Marcio E. Delamaro José C. Maldonado Aditya P. Mathur

Operadores de MI para a Linguagem C Comentários sobre Operadores de MI

O mais importante é tornar o uso de teste de mutação possível de se aplicar e eficaz

A aplicação de um conjunto inteiro de operadores pode criar um largo número de mutantes

resultando em tempo impossível para se executar e avaliár

É necessário permitir o testador ajustar o conjunto de operadores para uma

aplicação especifica de acordo com os requisitos e custo

Uma maneira de customizar a aplicação destes operadores é aplicar ‘restrições de mutação’:

Aleatoriamente, selecionar uma pequena porcentagem do conjunto de muntantes.

Aplicar somente um conjunto restrito de operadores

Page 23: Mutação de Interface Interface Mutation: An Approach for Integration Testing Marcio E. Delamaro José C. Maldonado Aditya P. Mathur

Operadores de MI para a Linguagem C

Comentários sobre Operadores de MI Estas restrições, reduzem significativamente o

número de mutantes sem perda na eficácia da detecção de erros.

A decisão de gerar um conjunto reduzido de mutantes ou aplicar todos os operadores e gerar todos os mutantes sempre depende dos requisitos de teste e do quão critica é a aplicação

Os operadores do Grupo II tendem a gerar menos mutantes que os do Grupo I.

Isso porque a complexidade para os operadores do Grupo II é proporcional ao número de parâmetros da unidade chamada.

A complexidade para os ops. do Grupo I é proporcional ao nro. de variáveis (locais ou globais) acessadas na unidade chamada vezes o número de acessos para estas variáveis.

Page 24: Mutação de Interface Interface Mutation: An Approach for Integration Testing Marcio E. Delamaro José C. Maldonado Aditya P. Mathur

Operadores de MI para a Linguagem C Comentários sobre Operadores de MI

Provavelmente o problema de equivalência de mutantes é mais fácil sobre os gerados pelos operadores do Grupo II.

Assim estes operadores são bons candidatos para gerar um conjunto inicial de mutantes para o inicio da avaliação do conjunto de testes.

Apesar disso, operadores do Grupo I tem mais diversas características que operadores do Grupo II

permitindo testar as interfaces de maneira mais completa, mas precisando de um maior custo.