Información general de Microsoft IntelliTestOverview of Microsoft IntelliTest

IntelliTest le permite detectar errores pronto, y reduce los costos de mantenimiento de pruebas.IntelliTest enables you to find bugs early, and reduces test maintenance costs. Con un enfoque de pruebas transparente y automatizado, IntelliTest puede generar un conjunto candidato de pruebas para su código de .NET.Using an automated and transparent testing approach, IntelliTest can generate a candidate suite of tests for your .NET code. La generación del conjunto de pruebas puede guiarse además mediante las propiedades de corrección que especifique.Test suite generation can be further guided by correctness properties you specify. IntelliTest evolucionará incluso el conjunto de pruebas automáticamente a medida que el código sometido a prueba evolucione.IntelliTest will even evolve the test suite automatically as the code under test evolves.

Pruebas de caracterización IntelliTest le permite determinar el comportamiento del código en términos de un conjunto de pruebas unitarias tradicionales.Characterization tests IntelliTest enables you to determine the behavior of code in terms of a suite of traditional unit tests. Dicho conjunto de pruebas puede usarse como un conjunto de regresión que forma la base para tratar la complejidad asociada con la refactorización de código desconocido o heredado.Such a test suite can be used as a regression suite, forming the basis for tackling the complexity associated with refactoring legacy or unfamiliar code.

Generación de entradas de prueba guiada IntelliTest usa un análisis de código abierto y un enfoque de solución de restricciones para generar automáticamente valores de entrada de pruebas precisos; normalmente sin necesidad de la intervención del usuario.Guided test input generation IntelliTest uses an open code analysis and constraint solving approach to automatically generate precise test input values; usually without the need for any user intervention. Para los tipos de objeto complejos, genera fábricas automáticamente.For complex object types, it automatically generates factories. Puede guiar la generación de entradas de prueba ampliando y configurando las fábricas para que se adapten a sus requisitos.You can guide test input generation by extending and configuring the factories to suit your requirements. Las propiedades de corrección que se especifican como aserciones en el código también se usarán automáticamente para guiar más la generación de entradas de prueba.Correctness properties specified as assertions in code will also be used automatically to further guide test input generation.

Integración en el IDE IntelliTest está totalmente integrado en el IDE de Visual Studio.IDE integration IntelliTest is fully integrated into the Visual Studio IDE. Toda la información recopilada durante la generación del conjunto de pruebas (como las entradas generadas automáticamente, el resultado del código, los casos de pruebas generados y su estado de superación o error) aparece en el IDE de Visual Studio.All of the information gathered during test suite generation (such as the automatically generated inputs, the output from your code, the generated test cases, and their pass or fail status) appears within the Visual Studio IDE. Puede iterar fácilmente entre corregir su código y volver a ejecutar IntelliTest, sin salir del IDE de Visual Studio.You can easily iterate between fixing your code and rerunning IntelliTest, without leaving the Visual Studio IDE. Las pruebas pueden guardarse en la solución como un proyecto de prueba unitaria, y se detectarán automáticamente después mediante el Explorador de pruebas de Visual Studio.The tests can be saved into the solution as a Unit Test Project, and will be automatically detected afterwards by Visual Studio Test Explorer.

Complementar las prácticas de pruebas existentes Use IntelliTest para complementar cualquier práctica de prueba existente que ya siga.Complement existing testing practices Use IntelliTest to complement any existing testing practices that you may already follow.

Si quiere probar:If you want to test:

  • Algoritmos en datos primitivos o matrices de datos primitivos:Algorithms over primitive data, or arrays of primitive data:
  • Algoritmos en datos complejos, como el compilador:Algorithms over complex data, such as compiler:
    • permita que IntelliTest genere primero una representación abstracta de los datos y, después, la introduzca en el algoritmolet IntelliTest first generate an abstract representation of the data, and then feed it to the algorithm
    • permita que IntelliTest cree instancias mediante la creación de objetos personalizados e invariantes de datos y, después, invoque el algoritmolet IntelliTest build instances using custom object creation and data invariants, and then invoke the algorithm
  • Contenedores de datos:Data containers:
  • Una base de código existente:An existing code base:

Hello World de IntelliTestThe Hello World of IntelliTest

IntelliTest detecta entradas relevantes al programa que se prueba, lo que significa que puede usarlo para generar la famosa cadena Hello World (Hola a todos)IntelliTest finds inputs relevant to the tested program, which means you can use it to generate the famous Hello World! .string. Presupone que ha creado un proyecto de prueba basado en MSTest de C# y que ha agregado una referencia a Microsoft.Pex.Framework.this assumes that you have created a C# MSTest-based test project and added a reference to Microsoft.Pex.Framework. Si está usando un marco de prueba diferente, cree una biblioteca de clases de C# y vea la documentación del marco de prueba para obtener información sobre cómo configurar el proyecto.If you are using a different test framework, create a C# class library and refer to the test framework documentation on how to set up the project.

En el ejemplo siguiente se crean dos restricciones en el parámetro denominado value, de manera que IntelliTest generará la cadena requerida:The following example creates two constraints on the parameter named value so that IntelliTest will generate the required string:

using System;
using Microsoft.Pex.Framework;
using Microsoft.VisualStudio.TestTools.UnitTesting;

[TestClass]
public partial class HelloWorldTest {
    [PexMethod]
    public void HelloWorld([PexAssumeNotNull]string value) {
        if (value.StartsWith("Hello")
            && value.EndsWith("World!")
            && value.Contains(" "))
            throw new Exception("found it!");
    }
}

Una vez que se haya compilado y ejecutado, IntelliTest genera un conjunto de pruebas de la manera siguiente:Once compiled and executed, IntelliTest generates a set of tests such as the following set:

  1. """"
  2. "\0\0\0\0\0""\0\0\0\0\0"
  3. "Hello""Hello"
  4. "\0\0\0\0\0\0""\0\0\0\0\0\0"
  5. "Hello\0""Hello\0"
  6. "Hello\0\0""Hello\0\0"
  7. "Hello\0World!""Hello\0World!"
  8. "Hello World!""Hello World!"

Lea Generar pruebas unitarias con IntelliTest para saber dónde se guardan las pruebas generadas.Read Generate unit tests with Intellitest to understand where the generated tests are saved. El código de prueba generado debe incluir una prueba como la siguiente:The generated test code should include a test such as the following code:

[TestMethod]
[PexGeneratedBy(typeof(global::HelloWorldTest))]
[PexRaisedException(typeof(Exception))]
public void HelloWorldThrowsException167()
{
    this.HelloWorld("Hello World!");
}

Es así de fácil.It's that easy!

LimitacionesLimitations

En esta sección se describen las limitaciones de IntelliTest:This section describes the limitations of IntelliTest:

IndeterminismoNondeterminism

IntelliTest presupone que el programa analizado es determinista.IntelliTest assumes that the analyzed program is deterministic. Si no lo es, IntelliTest lo recorrerá hasta que alcance un límite de exploración.If it is not, IntelliTest will cycle until it reaches an exploration bound.

IntelliTest considera que un programa no es determinista si se basa en entradas que IntelliTest no puede controlar.IntelliTest considers a program to be non-determistic if it relies on inputs that IntelliTest cannot control.

IntelliTest controla entradas que se proporcionan para las pruebas unitarias parametrizadas y se obtienen de PexChoose.IntelliTest controls inputs provided to parameterized unit tests and obtained from the PexChoose. En ese sentido, los resultados de las llamadas a código no instrumentado o no administrado también se consideran como "entradas" en el programa instrumentado, pero IntelliTest no puede controlarlas.In that sense, results of calls to unmanaged or uninstrumented code are also considered as "inputs" to the instrumented program, but IntelliTest cannot control them. Si el flujo de control del programa depende de los valores específicos que provienen de estos orígenes externos, IntelliTest no puede "guiar" al programa hacia las áreas que no se han cubierto anteriormente.If the control flow of the program depends on specific values coming from these external sources, IntelliTest cannot "steer" the program towards previously uncovered areas.

Además, el programa se considera indeterminista si los valores de los orígenes externos cambian al volver a ejecutar el programa.In addition, the program is considered to be non-determistic if the values from external sources change when rerunning the program. En dichos casos, IntelliTest pierde el control de la ejecución del programa y su búsqueda pasa a ser ineficaz.In such cases IntelliTest loses control over the execution of the program and its search becomes inefficient.

A veces no es evidente cuando esto sucede.Sometimes it is not obvious when this happens. Considere los siguientes ejemplos:Consider the following examples:

  • El resultado del método GetHashCode() se proporciona mediante código no administrado y no es predecible.The result of the GetHashCode() method is provided by unmanaged code, and is not predictable.
  • La clase System.Random usa la hora del sistema actual para proporcionar valores aleatorios reales.The System.Random class uses the current system time to deliver truly random values.
  • La clase System.DateTime proporciona la hora actual, que no está bajo el control de IntelliTest.The System.DateTime class provides the current time, which is not under the control of IntelliTest.

simultaneidadConcurrency

IntelliTest no controla los programas multiproceso.IntelliTest does not handle multithreaded programs.

Código nativoNative code

IntelliTest no entiende el código nativo, como las instrucciones x86 que se llaman mediante P/Invoke.IntelliTest does not understand native code, such as x86 instructions called through P/Invoke. No sabe cómo traducir dichas llamadas en restricciones que se pueden pasar al solucionador de restricciones.It does not know how to translate such calls into constraints that can be passed to the constraint solver. Incluso para el código .NET, puede analizar solo código que instrumenta.Even for .NET code, it can only analyze code it instruments. IntelliTest no puede instrumentar determinadas partes de mscorlib, incluida la biblioteca de reflexión.IntelliTest cannot instrument certain parts of mscorlib, including the reflection library. DynamicMethod no se puede instrumentar.DynamicMethod cannot be instrumented.

La solución alternativa que se sugiere es tener un modo de prueba donde dichos métodos se encuentren en tipos de un ensamblado dinámico.The suggested workaround is to have a test mode where such methods are located in types in a dynamic assembly. En cambio, incluso si algunos métodos no están instrumentados, IntelliTest intentará cubrir el código instrumentado todo lo posible.However, even if some methods are uninstrumented, IntelliTest will try to cover as much of the instrumented code as possible.

PlataformaPlatform

IntelliTest solo se admite en .NETframework de 32 bits basado en X86.IntelliTest is supported only on the X86, 32-bit .NETframework.

LenguajeLanguage

En principio, IntelliTest puede analizar los programas de .NET arbitrarios, escritos en cualquier lenguaje de .NET.In principle, IntelliTest can analyze arbitrary .NET programs, written in any .NET language. En cambio, en Visual Studio solo admite C#.However, in Visual Studio it supports only C#.

Razonamiento simbólicoSymbolic reasoning

IntelliTest usa un solucionador de restricciones automático para determinar los valores que son relevantes para la prueba y el programa sometido a prueba.IntelliTest uses an automatic constraint solver to determine which values are relevant for the test and the program under test. En cambio, las capacidades del solucionador de restricciones están, y siempre estarán, limitadas.However, the abilities of the constraint solver are, and always will be, limited.

Seguimientos de pila incorrectosIncorrect stack traces

Como IntelliTest detecta y "vuelve a generar" excepciones en cada método instrumentado, los números de línea en los seguimientos de la pila no serán correctos.Because IntelliTest catches and "rethrows" exceptions in each instrumented method, the line numbers in stack traces will not be correct. Esta es una limitación en el diseño de la instrucción "Rethrow".This is a limitation by design of the "rethrow" instruction.

Información adicionalFurther reading