Compartilhar via


Este artigo foi traduzido por máquina.

Execução de teste

Teste de difusão

James McCaffrey

Baixe o código de exemplo

image: James McCaffreyNa coluna deste mês, apresentarei uma técnica de teste de software eu chamo o teste de difusão. A idéia-chave de teste de difusão é às vezes, é possível gerar automaticamente os novos dados de caso de teste de casos de teste existentes que produz um resultado pass.

Embora o teste de difusão é uma técnica que não se aplica na maioria dos cenários de teste de software, quando o teste de difusão é aplicáveis, ele poderá melhorar consideravelmente a eficiência de seu esforço de teste. Talvez em parte porque é uma técnica de nicho, teste de difusão é uma das menos conhecidas de todos os principais técnicas, com base na minha experiência de teste.

Antes de eu apresentar exemplos de teste de difusão, deixe-me explicar a motivação por trás do método. Normalmente, um caso de teste consiste em uma ID de caso de teste, um conjunto de entradas de um ou mais e um resultado esperado. Por exemplo, o vetor {001, 2, 3, 5} poderia representar um caso de teste para uma função de soma, com ID = 001, entradas = 2 e 3 e um resultado esperado = 5. As entradas do caso de teste são enviadas para o sistema em teste, é produzido um resultado real e o resultado real é comparado com o resultado esperado para determinar um resultado de aprovação/reprovação do caso de teste.

Em muitas situações de teste de software, é difícil e demorado determinar a parte de um resultado esperado do caso de teste. Por exemplo, suponha que você está testando uma função matemática básica que calcula a média harmônica de duas entradas são taxas. É a média dos 30.0 quilômetros por hora (kph) e 60,0 kph não (30,0 + 60.0) / 2 = 45,0 kph, mas em vez disso, a média harmônica de 30,0 e 60.0, que é 1 / ((1/30,0 + 1/60,0) / 2) = 40.0 kph. Gerar centenas de resultados esperados para esta função seria entediante, levar muito tempo e ser sujeita a erros.

A dificuldade de determinar os resultados esperado do caso de teste é um conceito fundamental em testes de software e às vezes é conhecida como o problema da oracle de teste. Na verdade, uma do grails holy de teste de software é a pesquisa para obter técnicas que podem determinar automaticamente os casos de teste. Portanto, a motivação por trás do teste de difusão é que, se alguma forma, você pode gerar automaticamente novos dados de caso de teste, você evitar demorada parte do processo de teste e poder testar seu sistema mais detalhadamente.

Gerar automaticamente os dados de caso de teste com o teste de difusão é ótimo no princípio, mas como ele funciona? A melhor maneira de explicar o teste de difusão é por meio de um exemplo. Examine a Figura 1.

image: Diffusion Testing Demo

Figura 1 testes de demonstração de difusão

Aqui, estou testando uma função, Choose(n,k), que retorna o número de maneiras para selecionar itens de k em n itens em que ordem não importa. No meu exemplo simplificado, tenho três casos de teste existentes. O primeiro caso de teste possui entradas n = 8 e k = 3 e um resultado esperado de 56. Depois que meu equipamento de teste executado no primeiro caso de teste que gerou um resultado pass, eu usei a difusão de teste para gerar automaticamente um novo caso de teste com entradas n = 9, k = 3 e um resultado esperado 84. Claro! Observe que porque o caso de teste 002 gerou um resultado de falha, eu não gerar um novo caso de teste difuso.

Mas, como novos casos de teste são gerados a partir de um caso de teste existente? Para a função Choose(n,k), acontece que, matematicamente, Choose(n+1,k) = Choose(n,k) * (n + 1) / (n-k + 1). Em outras palavras, há uma relação conhecida entre novas entradas e valores de retorno do antigo. A função que usei para gerar um caso de teste difuso de um caso de teste existente é mostrada na a Figura 2. Todo o programa que gerou a saída mostrada na a Figura 1 está disponível em Code.msdn.microsoft.com/mag201103TestRun.

Figura 2 Gerando um novo caso de teste

seqüência de caracteres estática CreateDiffusedTestCase (string existingTestCase)

{

  / / Assume o formato de entrada é CaseID:N:K: esperado

  String [] tokens = existingTestCase.Split(':');



  string oldTestCase = tokens [0];

  int oldN = int.Parse(tokens[1]);

  int oldK = int.Parse(tokens[2]);

  oldExpected longo = longo.Parse(tokens[3]);



  string newTestCase = oldTestCase + "-difuso";

  int newN = oldN + 1;

  int newK = oldK;

  newExpected longo = (oldExpected * (oldN + 1)) / (oldN - oldK + 1);



  retornar newTestCase + ":"+ newN + ":"+ newK + ":"+ newExpected;

}

Alguns exemplos adicionais podem ajudar a tornar essa idéia mais clara.Suponha que você está testando as funções que calculam o cosseno e seno trigonométrica.Você deve se lembrar dessa 2t sin = 2 * sin t * cos t.Portanto, se você tiver os casos de teste levar a resultados de passagem para o seno e cosseno de alguma entrada, você poderia usar difusão de testes para derivar um novo caso de teste para a função de seno.

Teste de difusão não é mágico.Suponha que você está testando uma função que aceite uma identificação de produto de algum tipo, procura um banco de dados SQL e retorna true se o produto está em estoque e false se o produto não estiver no estoque.Porque não há nenhuma relação entre entradas diferentes e os resultados, não pôde ser usado neste cenário de teste de difusão.Neste aspecto, o teste de difusão é semelhante a outras formas de como a condição de limite de teste e teste emparelhadas: é uma técnica que é aplicável apenas em determinadas situações.

Deixe-me apresentar outro exemplo de teste de difusão.Suponha que você escreveu uma função, Gauss(z), que aceita um valor de z normal padrão e que retorna a área sob a distribuição normal padrão (curva em forma de sino) partindo do infinito negativo a z.Por exemplo, Gauss(-1.645) = 0.0500, Gauss(1.645) = 0.9500 e Gauss(0) = 0.5000.Uma maneira de usar a difusão de testes são observar a propriedade monotônico da Gauss e que para qualquer valor de z no intervalo negativo infinito para 2. 5, o resultado da Gauss (z + 0,1) deve ser maior que Gauss(z).Outra maneira de usar o teste de difusão é observar a propriedade simétrica da Gauss e que para qualquer z valor que é menor que 0,0, Gauss(-z) = 1. 0 - Gauss(z).

Os exemplos que apresentei ilustram os três mais comuns — mas não significa a única — cenários em que o teste de difusão é aplicável.O primeiro cenário é onde você está testando uma função matemática que pode ser definida como uma relação de recorrência.O segundo cenário é onde você está testando uma função que tem alguma relação monotônico.E o terceiro cenário em que você está testando uma função que tem alguma relação simétrica.Um formulário relacionado de testes, mas que não seja de difusão de testes, é quando estiver testando uma função em que alternar a ordem de valores de entrada não altera o valor de retorno, como com Sum(x,y).

Funções matemáticas são o tipo mais comum de componente em teste pode se beneficiar do teste de difusão, porque tais funções com mais freqüência são recorrentes, monotônico ou simétrica — mas você deve estar alerta para outras situações, muito.Funções matemáticas que envolvem as relações de recorrência são especialmente bem apropriadas para a difusão de teste porque você geralmente pode gerar vários novos casos de teste de um caso de teste existente.Na demonstração no Figura 1, 001 do caso de teste com n = 8, k = 3 e esperado = 56 gerado difuso um novo caso de teste com n = 9, k = 3 e esperado = 84.Este novo caso de teste pode ser usado para gerar outro caso de teste com n = 10, k = 3 e esperado = 120 e se esse caso de teste passado, ele poderia ser usado para gerar ainda outro novo caso de teste e assim por diante.

Antes de concluir, deixe-me a minha soapbox de salto e abordar um peeve de Animal de estimação meu relacionadas a diferentes técnicas de teste de software e os princípios de nomeação.Eu rotulados a técnica descrita nesta coluna, como a difusão de teste porque difuso de casos de teste existentes ou dispersão, para criar novos casos.Eu tão bem ter chamado a técnica testando adaptável ou testes de geração automática ou qualquer uma das inúmeras outras coisas.Não é o rótulo que é importante, mas em vez disso, a técnica representada pelo rótulo que contagens de.

Em muitos campos de estudo, incluindo testes de software, especialistas autodeclarados aplicam alguns etiqueta a uma técnica de senso comum em implicitamente tentarem convencer pessoas novas para o campo que o próprio rótulo executa alguma forma relativamente importantes.Isso normalmente é motivado pelo desejo de vender o treinamento diretamente ou indiretamente vender serviços de consultoria, oferecendo uma palestra em uma conferência na nova etiqueta maravilhoso.Os infratores notáveis são os termos "teste exploratório" e "aulas de contexto do teste", mas existem muitos outros.Portanto, levar o termo "difusão testes" para o que é — simplesmente um rótulo para descrever uma técnica de teste de software, mas uma que pode ser uma adição útil para o seu Kit de ferramentas técnico.

Recuperação de desastres** James McCaffrey **trabalha para a Volt Information Sciences Inc., onde gerencia o treinamento técnico para engenheiros de software, trabalhando com a Microsoft Redmond, Wash campus. Ele é trabalhou em vários produtos da Microsoft, incluindo o Internet Explorer e o MSN Busca.Recuperação de desastres.McCaffrey é autor de ".NET Test Automation Recipes"(Apress, 2006) e pode ser contatado pelojammc@microsoft.com.

Graças aos seguintes especialistas técnicos para revisão deste artigo: Rollison de Bj e Página de Alan