mutação de interface interface mutation: an approach for integration testing marcio e. delamaro...
Post on 17-Apr-2015
103 Views
Preview:
TRANSCRIPT
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:
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.
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
Erros de Integração
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:
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
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
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
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.
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.
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.
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.
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).
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.
Operadores de MI para a Linguagem C A função F que possui duas chamadas para a função
G:
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
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.
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
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
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
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
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.
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.
top related