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
- MaxConstraintSolverTime – o número de segundos que o solver de restrição tem para descobrir entradas que farão com que um caminho de execução novo e diferente seja seguido.
- MaxConstraintSolverMemory – o tamanho em megabytes que o solver de restrição pode usar para descobrir as entradas.
- 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
- TestExcludePathBoundsExceeded – quando true, os caminhos de execução que excederem qualquer um dos limites de caminho (MaxCalls, MaxBranches, MaxStack, MaxConditions) serão ignorados.
- TestEmissionFilter – indica sob quais circunstâncias o IntelliTest deverá emitir testes.
- TestEmissionBranchHits – controla quantos testes o IntelliTest emite.
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.