Limites de exploração

PexSettingsAttributeBase é a classe base abstrata para definir limites como atributos. Consulte Cascata de configurações para obter uma visão geral das configurações no IntelliTest.

Você pode modificar as configurações usando propriedades nomeadas deles e seus atributos derivados:

[PexClass(MaxRuns = 10)]
public partial class FooTest {...}
  • Limites de resolução de restrição
  • Limites de caminho de exploração
    • MaxBranches – o número máximo de branches que podem ser seguidos ao longo de um único caminho de execução.
    • MaxCalls – o número máximo de chamadas que podem ser feitas durante um único caminho de execução.
    • MaxStack – o tamanho máximo da pilha a qualquer momento durante um único caminho de execução, medido como o número de quadros de chamada ativa.
    • MaxConditions – o número máximo de condições sobre as entradas que podem ser verificadas durante um único caminho de execução.
  • Limites de Exploração
    • MaxRuns – o número máximo de execuções que serão tentadas durante uma exploração.
    • MaxRunsWithoutNewTests – o número máximo de execuções consecutivas sem um novo teste ser emitido.
    • MaxRunsWithUniquePaths – o número máximo de execuções com caminhos de execução exclusivos que serão tentadas durante uma exploração.
    • MaxExceptions – o número máximo de exceções que podem ser encontradas para uma combinação de todos os caminhos de execução descobertos.
  • Configurações de geração de código de conjunto de testes

MaxConstraintSolverTime

O número de segundos que o solver de restrição tem para calcular entradas que farão com que um caminho de execução novo e diferente seja seguido. Essa é uma opção do PexSettingsAttributeBase e seus tipos derivados.

Quanto mais o IntelliTest explora os caminhos de execução de um programa, mais complexos se tornam os sistemas de restrições que o IntelliTest cria do fluxo de controle e do fluxo de dados do programa. Dependendo de seu limite de tempo, você pode definir esse valor para permitir que o IntelliTest leve mais ou menos tempo descobrindo novos caminhos de execução.

Normalmente, o motivo para um tempo limite é que o IntelliTest está tentando encontrar uma solução para um sistema de restrição que não tem uma solução, mas não está ciente desse fato. Como esse é o caso mais comum para um tempo limite, talvez não faça sentido aumentar o limite.

MaxConstraintSolverMemory

O número de megabytes que o solver de restrição tem para calcular entradas que farão com que um caminho de execução novo e diferente seja seguido. Essa é uma opção do PexSettingsAttributeBase* e de seus tipos derivados.

Quanto mais o IntelliTest explora os caminhos de execução de um programa, mais complexos se tornam os sistemas de restrições que o IntelliTest cria do fluxo de controle e do fluxo de dados do programa. Dependendo da memória disponível do computador, você pode definir esse valor para permitir que o IntelliTest lide com sistemas de restrição mais complexos.

Normalmente, o motivo para um tempo limite é que o IntelliTest está tentando encontrar uma solução para um sistema de restrição que não tem uma solução, mas não está ciente desse fato. Como essa é a causa mais comum de uma situação de falta de memória, talvez não faça sentido aumentar o limite.

MaxBranches

O número máximo de branches que podem ser seguidos ao longo de um único caminho de execução.

A motivação por trás desse limite de exploração é limitar o comprimento de qualquer caminho de execução que o IntelliTest explore durante a geração de entrada. Em particular, ela impede que o IntelliTest deixe de responder se o programa entrar em um loop infinito.

Cada branch condicional e incondicional do código executado e monitorado é contada até esse limite, inclusive branches que não dependem das entradas do teste parametrizado.

Por exemplo, o código a seguir consome branches na ordem de 100:

for (int i=0; i<100; i++) { }

MaxCalls

O número máximo de chamadas que podem ser feitas durante um único caminho de execução.

A motivação por trás desse limite de exploração é limitar o comprimento de qualquer caminho de execução que o IntelliTest explore durante a geração de entrada. Em particular, ela impedirá que o IntelliTest deixar de responder se o programa chamar um método recursivamente um número infinito de vezes, o que poderia causar um excedente de pilha do qual o IntelliTest não pode se recuperar.

Cada chamada (direta, indireta, virtual, pulo) do código executado e monitorado é contada até esse limite.

MaxStack

O tamanho máximo da pilha a qualquer momento durante um único caminho de execução, medido pelo número de quadros de chamada ativa.

A motivação por trás desse limite de exploração é limitar o tamanho da pilha de qualquer caminho de execução que o IntelliTest explore durante a geração de entrada. Em particular, ela impedirá que o IntelliTest use todo o espaço de pilha disponível, o que causaria um excedente de pilha do qual o IntelliTest não pode se recuperar.

MaxConditions

O número máximo de condições sobre as entradas que podem ser verificadas durante um único caminho de execução.

A motivação por trás desse limite de exploração é limitar a complexidade de qualquer caminho de execução que o IntelliTest explore durante a geração de entrada. Cada branch condicional que depende das entradas do teste parametrizado é contada até esse limite.

Por exemplo, cada caminho no código a seguir consome n+1 condições:

[PexMethod]
void ParameterizedTest(int n)
{
     for (int i=0; i<n; i++) { // conditions are "0<n", "1<n", ..., "!(n<n)"
          ...
     }
     for (int i=0; i<100; i++) { // irrelevant for MaxConditions, since conditions do not depend on input
          ...
     }
}

MaxRuns

O número máximo de execuções que o IntelliTest tentará durante a exploração de um teste.

A motivação por trás desse limite de exploração é que qualquer código que contenha loops ou recursão pode ter um número infinito de caminhos de execução e, portanto, o IntelliTest precisa ser limitado durante a geração de entrada.

As duas configurações MaxRuns e MaxRunsWithUniquePaths são relacionadas da seguinte maneira:

  • O IntelliTest chamará um método de teste parametrizado até MaxRuns vezes com diferentes entradas de teste.
  • Se o código executado for determinístico, o IntelliTest seguirá um caminho de execução diferente cada vez. No entanto, em algumas condições o código executado pode seguir um caminho de execução que já usado antes, com entradas diferentes.
  • O IntelliTest conta quantos caminhos de execução exclusivos ele encontra, esse número é limitado pela opção MaxRunsWithUniquePaths.

MaxRunsWithoutNewTests

O número máximo de execuções consecutivas sem um novo teste ser emitido.

Embora o IntelliTest possa localizar muitas entradas de teste interessantes em um curto período, após alguns instantes ele não localizará mais nenhuma nova entrada de teste e não emitirá mais testes de unidade. Essa opção de configuração coloca um limite no número de tentativas consecutivas que o IntelliTest pode executar sem emitir um novo teste. Quando atingido, ele interromperá a exploração.

MaxRunsWithUniquePaths

O número máximo de caminhos exclusivos que o IntelliTest considerará durante uma exploração.

A motivação por trás desse limite de exploração é que qualquer código que contenha loops ou recursão pode ter um número infinito de caminhos de execução e, portanto, o IntelliTest deve ser limitado durante a geração de entrada.

As duas configurações MaxRuns e MaxRunsWithUniquePaths são relacionadas da seguinte maneira:

  • O IntelliTest chamará um método de teste parametrizado até MaxRuns vezes com diferentes entradas de teste.
  • Se o código executado for determinístico, o IntelliTest seguirá um caminho de execução diferente cada vez. No entanto, em algumas condições o código executado pode seguir um caminho de execução que já usado antes, com entradas diferentes.
  • O IntelliTest conta quantos caminhos de execução exclusivos ele encontra, esse número é limitado pela opção MaxRunsWithUniquePaths.

MaxExceptions

O número máximo de exceções que podem ser encontradas antes de a exploração ser interrompida.

A motivação por trás desse limite de exploração é parar a exploração do código que contém muitos bugs. Se o IntelliTest encontra muitos erros no código, exploração é interrompida.

TestExcludePathBoundsExceeded

Os caminhos de execução que excederam os limites de caminho configurados MaxCalls, MaxBranches, MaxStack e MaxConditions são ignorados.

A motivação por trás desse limite da exploração é lidar com testes (provavelmente) sem finalização. Quando o IntelliTest atinge um limite de exploração como MaxCalls, MaxBranches, MaxStack ou MaxConditions, ele assume que o teste não será um processo sem finalização e não causará um excedente de pilha posteriormente. Esses casos de teste podem causar problemas para outras estruturas de teste e esse atributo fornece uma maneira de impedir que o IntelliTest emita casos de teste para processos potencialmente sem finalização ou casos de teste que causarão um excedente de pilha.

TestEmissionFilter

Indica os tipos de testes que o IntelliTest deve emitir. Os valores possíveis são:

  • All – emitir testes para tudo, inclusive violações de suposição.
  • FailuresAndIncreasedBranchHits (padrão) – emitir testes para todas as falhas exclusivas e sempre que um caso de teste aumentar a cobertura conforme controlado por TestEmissionBranchHits.
  • FailuresAndUniquePaths – emitir testes para todas as falhas que IntelliTest encontrar e também para cada entrada de teste que produz um caminho de execução exclusivo.
  • Failures – Emitir testes apenas para falhas.

TestEmissionBranchHits

Dependendo da configuração TestEmissionFilter atual, o IntelliTest emite novos casos de teste ao abranger um branch no programa que não foi abrangido antes.

A configuração TestEmissionBranchHits determina se o IntelliTest deve apenas considerar se um branch foi abrangido em absoluto (TestEmissionBranchHits=1), se um teste o abrangeu uma ou duas vezes (TestEmissionBranchHits=2) e assim por diante.

TestEmissionBranchHits = 1 produzirá um conjunto de testes muito pequeno que abrangerá todos os branches que o IntelliTest puder atingir. Em particular, esse conjunto de testes também abrangerá todos os blocos básicos e instruções que ele atingiu.

O padrão para essa opção é TestEmissionBranchHits = 2, que gera um conjunto de testes mais expressivo que também é mais adequado para detectar erros de regressão futuros.

Recebeu comentários?

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