Share via


Límites de exploración

PexSettingsAttributeBase es la clase base abstracta para establecer límites como atributos. Vea Settings Waterfall (Cascada de configuración) para obtener información general de la configuración de IntelliTest.

Puede modificar la configuración mediante propiedades con nombre de esta y sus atributos derivados:

[PexClass(MaxRuns = 10)]
public partial class FooTest {...}
  • Límites de solución de restricciones
  • Límites de la ruta de exploración
    • MaxBranches: el número máximo de ramas que se pueden tomar a lo largo de una sola ruta de ejecución.
    • MaxCalls: el número máximo de llamadas que pueden realizarse durante una sola ruta de ejecución.
    • MaxStack: el tamaño máximo de la pila en cualquier momento durante una sola ruta de ejecución, medido como el número de marcos de llamada activos.
    • MaxConditions: el número máximo de condiciones en las entradas que se pueden comprobar durante una sola ruta de acceso de ejecución.
  • Límites de exploración
    • MaxRuns: el número máximo de ejecuciones que se intentarán durante una exploración.
    • MaxRunsWithoutNewTests: el número máximo de ejecuciones consecutivas sin que se emita una nueva prueba.
    • MaxRunsWithUniquePaths: el número máximo de ejecuciones con rutas de ejecución únicas que se intentarán durante una exploración.
    • MaxExceptions: el número máximo de excepciones que pueden detectarse para una combinación de todas las rutas de ejecución detectadas.
  • Configuración de la generación de código para el conjunto de pruebas

MaxConstraintSolverTime

El número de segundos que el solucionador de restricciones tiene para calcular entradas que provocarán una nueva y diferente ruta de ejecución que se va a tomar. Esta es una opción de PexSettingsAttributeBase y de sus tipos derivados.

Cuanto mayor es la profundidad con la que IntelliTest explora las rutas de ejecución de un programa, más complejos se convierten los sistemas de restricciones que IntelliTest crea del flujo de control y el flujo de datos del programa. Dependiendo de la limitación temporal, puede establecer este valor para permitir que IntelliTest tarde más o menos tiempo en detectar nuevas rutas de ejecución.

Normalmente, la razón del tiempo de espera es que IntelliTest está intentando buscar una solución para un sistema de restricciones que no tiene solución, pero no es consciente de este hecho. Como este es el caso más común de tiempo de espera, puede que no tenga sentido aumentar el límite.

MaxConstraintSolverMemory

El número de megabytes que el solucionador de restricciones tiene para calcular entradas que provocarán una nueva y diferente ruta de ejecución que se va a tomar. Esta es una opción de PexSettingsAttributeBase* y de sus tipos derivados.

Cuanto mayor es la profundidad con la que IntelliTest explora las rutas de ejecución de un programa, más complejos se convierten los sistemas de restricciones que IntelliTest crea del flujo de control y el flujo de datos del programa. Dependiendo de la memoria disponible de su equipo, puede establecer este valor para permitir que IntelliTest trate sistemas de restricciones más complejos.

Normalmente, la razón del tiempo de espera es que IntelliTest está intentando buscar una solución para un sistema de restricciones que no tiene solución, pero no es consciente de este hecho. Como este es el caso más común de una situación de memoria insuficiente, puede que no tenga sentido aumentar el límite.

MaxBranches

El número máximo de ramas que se pueden tomar a lo largo de una sola ruta de ejecución.

La motivación para este límite de exploración es limitar la longitud de cualquier ruta de ejecución que IntelliTest explora durante la generación de entradas. En concreto, evita que IntelliTest deje de responder si el programa entra en un bucle infinito.

Cada rama condicional e incondicional del código supervisado y ejecutado se cuenta para calcular este límite, incluidas las ramas que no dependen de las entradas de la prueba parametrizada.

Por ejemplo, el código siguiente consume ramas del orden de 100:

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

MaxCalls

El número máximo de llamadas que pueden realizarse durante una sola ruta de ejecución.

La motivación para este límite de exploración es limitar la longitud de cualquier ruta de ejecución que IntelliTest explora durante la generación de entradas. En concreto, evita que IntelliTest deje de responder si el programa llama a un método recursivamente un número infinito de veces, lo que provocaría un desbordamiento de pila del que IntelliTest no puede recuperarse.

Cada llamada (directa, indirecta, virtual, salto) del código supervisado y ejecutado se cuenta para calcular este límite.

MaxStack

El tamaño máximo de la pila en cualquier momento durante una sola ruta de ejecución, medido por el número de marcos de llamada activos.

La motivación para este límite de exploración es limitar el tamaño de la pila de cualquier ruta de ejecución que IntelliTest explora durante la generación de entradas. En concreto, evita que IntelliTest use todo el espacio de la pila disponible, lo que provocaría un desbordamiento de pila del que IntelliTest no puede recuperarse.

MaxConditions

Número máximo de condiciones sobre las entradas que se pueden comprobar durante una única ruta de acceso de ejecución.

La motivación para este límite de exploración es limitar la complejidad de cualquier ruta de ejecución que IntelliTest explora durante la generación de entradas. Cada rama condicional que depende de las entradas de la prueba parametrizada se cuenta para calcular este límite.

Por ejemplo, cada ruta del siguiente código consume n+1 condiciones:

[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

Número máximo de ejecuciones que IntelliTest intentará durante la exploración de una prueba.

La motivación para este límite de exploración es que cualquier código que contiene bucles o recursividad pueda tener un número infinito de rutas de ejecución y, por lo tanto, IntelliTest necesita limitarse durante la generación de entradas.

Las dos opciones MaxRuns y MaxRunsWithUniquePaths se relacionan de la manera siguiente:

  • IntelliTest llamará a un método de prueba parametrizado hasta MaxRuns veces con diferentes entradas de prueba.
  • Si el código de prueba es determinista, IntelliTest tomará una ruta de ejecución diferente cada vez. En cambio, en determinadas condiciones el código ejecutado puede seguir una ruta de ejecución que ya haya tomado antes, con entradas diferentes.
  • IntelliTest cuenta el número de rutas de ejecución únicas que detecta; este número está limitado mediante la opción MaxRunsWithUniquePaths.

MaxRunsWithoutNewTests

El número máximo de ejecuciones consecutivas sin que se emita una nueva prueba.

Aunque a menudo IntelliTest puede detectar muchas entradas de pruebas interesantes en un breve período, después de un tiempo no detectará ninguna entrada de prueba nueva y no emitirá más pruebas unitarias. Esta opción de configuración coloca un límite en el número de intentos consecutivos que IntelliTest puede realizar sin emitir una prueba nueva. Cuando se alcanza, detendrá la exploración.

MaxRunsWithUniquePaths

El número máximo de rutas únicas que IntelliTest considerará durante una exploración.

La motivación para este límite de exploración es que cualquier código que contiene bucles o recursividad pueda tener un número infinito de rutas de ejecución y, por lo tanto, IntelliTest debe limitarse durante la generación de entradas.

Las dos opciones MaxRuns y MaxRunsWithUniquePaths se relacionan de la manera siguiente:

  • IntelliTest llamará a un método de prueba parametrizado hasta MaxRuns veces con diferentes entradas de prueba.
  • Si el código de prueba es determinista, IntelliTest tomará una ruta de ejecución diferente cada vez. En cambio, en determinadas condiciones el código ejecutado puede seguir una ruta de ejecución que ya haya tomado antes, con entradas diferentes.
  • IntelliTest cuenta el número de rutas de ejecución únicas que detecta; este número está limitado mediante la opción MaxRunsWithUniquePaths.

MaxExceptions

El número máximo de excepciones que pueden encontrarse antes de que se detenga la exploración.

La motivación para este límite de exploración es detener la exploración del código que contiene muchos errores. Si IntelliTest detecta demasiados errores en el código, se detiene la exploración.

TestExcludePathBoundsExceeded

Las rutas de ejecución que exceden los límites de ruta que se han configurado MaxCalls, MaxBranches, MaxStack y MaxConditions se ignoran.

La motivación para este límite de exploración es tratar (muy probablemente) con pruebas de no terminación. Cuando IntelliTest alcanza un límite de exploración como MaxCalls, MaxBranches, MaxStack o MaxConditions, presupone que la prueba no será un proceso de no terminación y que no provocará un desbordamiento de pila después. Dichos casos de prueba pueden presentar problemas en otros marcos de prueba, y este atributo proporciona una manera de evitar que IntelliTest emita casos de prueba para los procesos de no terminación potenciales o los casos de prueba que provocarán un desbordamiento de pila.

TestEmissionFilter

Indica los tipos de pruebas que debe emitir IntelliTest. Los valores posibles son:

  • All: emite pruebas para todo, incluidas las infracciones de hipótesis.
  • FailuresAndIncreasedBranchHits (el valor predeterminado): emite pruebas para todos los errores únicos, y cada vez que un caso de prueba aumenta la cobertura que se controla mediante TestEmissionBranchHits.
  • FailuresAndUniquePaths: emite pruebas para todos los errores que IntelliTest detecta, y también para cada entrada de prueba que provoca una ruta de ejecución única.
  • Failures: emite pruebas solo para los errores.

TestEmissionBranchHits

Dependiendo de la opción TestEmissionFilter actual, IntelliTest emite nuevos casos de prueba cuando cubren una rama del programa que no se ha cubierto antes.

La opción TestEmissionBranchHits determina si IntelliTest solo debe considerar si una rama se ha cubierto por completo (TestEmissionBranchHits=1), si una prueba la ha cubierto una o dos veces (TestEmissionBranchHits=2), y así sucesivamente.

TestEmissionBranchHits=1 producirá un conjunto de pruebas muy pequeño que cubrirá todas las ramas que IntelliTest puede alcanzar. En concreto, este conjunto de pruebas también cubrirá todos los bloques básicos y las instrucciones que ha alcanzado.

El valor predeterminado de esta opción es TestEmissionBranchHits=2, que genera un conjunto de pruebas más expresivo que también es más adecuado para detectar futuros errores de regresiones.

¿Tiene comentarios?

Publique sus ideas y solicitudes de características en Comunidad de desarrolladores.