Classes auxiliares estáticas

O IntelliTest fornece um conjunto de classes auxiliares estáticas que pode ser usado ao criar testes de unidade parametrizados:

  • PexAssume: usado para definir suposições sobre entradas e é útil para filtrar entradas indesejáveis
  • PexAssert: uma classe de declaração simples para usar se a estrutura de teste não fornecer uma
  • PexChoose: um fluxo de entradas de teste adicionais que gerencia o IntelliTest
  • PexObserve: registra valores concretos e, opcionalmente, os valida no código gerado

Algumas classes permitem que você interaja com o mecanismo de raciocínio do IntelliTest em um nível inferior:

  • PexSymbolicValue: utilitários para inspecionar ou modificar restrições simbólicas em variáveis

PexAssume

Uma classe estática usada para expressar suposições, tais como pré-condições, nos testes de unidade parametrizados. Os métodos dessa classe podem ser usados para filtrar as entradas de teste indesejáveis.

Se a condição assumida não valer para alguma entrada de teste, uma PexAssumeFailedException é lançada. Isso fará com que o teste seja ignorado silenciosamente.

Exemplo

O teste parametrizado a seguir não considerará j=0:

public void TestSomething(int i, int j) {
     PexAssume.AreNotEqual(j, 0);
     int k = i/j;
     ...
}

Comentários

O código acima é quase equivalente a:

     if (j==0)
          return;

exceto que um PexAssume com fala resulta não resulta em nenhum caso de teste. No caso de uma instrução if, o IntelliTest gera um caso de teste separado para abranger o branch then da instrução if.

O PexAssume também contém classes aninhadas especializadas para suposições na cadeia de caracteres, matrizes e coleções.

PexAssert

Uma classe estática usada para expressar declarações, tais como pós-condições, nos testes de unidade parametrizados.

Se a condição declarada não valer para algumas entradas de teste, um PexAssertFailedException é gerado, o que faz com que o teste falhe.

Exemplo

O exemplo a seguir declara que o valor absoluto de um inteiro é positivo:

public void TestSomething(int i) {
     int j = Maths.Abs(i);
     PexAssert.IsTrue(j >= 0);
     ...
}

PexChoose

Uma classe estática que fornece valores de entrada auxiliares para um teste, o que pode ser usado para implementar Simulações Parametrizadas.

A classe PexChoose não ajuda a determinar se um teste passa ou falha para valores de entrada específicos. O PexChoose simplesmente fornece valores de entrada, que também são conhecidos como opções. Ainda depende do usuário restringir os valores de entrada e escrever declarações que definem quando um teste é aprovado ou falha.

Modos de operação

A classe PexChoose pode operar em dois modos:

  • Enquanto o IntelliTest está executando uma análise simbólica do teste e do código testado durante a geração de entrada, o seletor retorna valores arbitrários e o IntelliTest controla como cada valor é usado no teste e no código testado. O IntelliTest gerará valores relevantes para disparar caminhos de execução diferentes no teste e no código testado.

  • O código gerado para casos de teste específicos define o provedor de escolha de uma maneira de forma que a nova execução de tal caso de teste fará escolhas específicas para disparar um caminho de execução específico.

Usage

  • Basta chamar PexChoose.Value para gerar um novo valor:
public int Foo() {
    return PexChoose.Value<int>("foo");
}

PexObserve

Uma classe estática para registrar valores nomeados.

Quando o IntelliTest explora o código, o PexObserve é usado para registrar os valores calculados usando suas representações de cadeia de caracteres formatada. Os valores são associados a nomes exclusivos.

PexObserve.Value<string>("result", result);

Exemplo

// product code
public static class MathEx {
     public static int Square(int value) { return value * value; }
}

// fixture
[TestClass]
public partial class MathExTests {
     [PexMethod]
     public int SquareTest(int a) {
        int result = MathEx.Square(a);
        // storing result
        return result;
     }
}

PexSymbolicValue

Uma classe estática usada para ignorar restrições em parâmetros e imprimir as informações simbólicas associadas aos valores.

Usage

Normalmente, o IntelliTest tenta abranger todos os caminhos de execução do código durante a execução. No entanto, especialmente ao computar condições de declaração e suposição, ele não deve explorar todos os casos possíveis.

Exemplo

Este exemplo mostra a implementação do método PexAssume.Arrays.ElementsAreNotNull. No método, você ignora as restrições no comprimento do valor da matriz para evitar que o IntelliTest tente gerar tamanhos diferentes de matriz. As restrições são ignoradas somente aqui. Se o código testado tiver um comportamento diferente de comprimentos de matriz diferente, o IntelliTest não poderá gerar matrizes de tamanhos diferentes das restrições no código testado.

public static void AreElementsNotNull<T>(T[] value)
    where T : class
{
    PexAssume.NotNull(value);
    // the followings prevents the exploration of all array lengths
    int len = PexSymbolicValue.Ignore<int>(value.Length);

    // building up a boolean value as follows prevents exploration
    // of all combinations of non-null (instead, there are just two cases)
    bool anyNull = false;
    for (int i = 0; i < len; ++i)
        anyNull |= value[i] == null;

    // was any element null?
    if (anyNull)
        PexAssume.Fail("some element of array is a null reference");
}

Recebeu comentários?

Poste suas ideias e solicitações de recursos na Comunidade de Desenvolvedores.