Información general de Microsoft IntelliTest
IntelliTest le permite detectar errores pronto, y reduce los costos de mantenimiento de pruebas. Con un enfoque de pruebas transparente y automatizado, IntelliTest puede generar un conjunto candidato de pruebas para su código de .NET. La generación del conjunto de pruebas puede guiarse además mediante las propiedades de corrección que especifique. IntelliTest evolucionará incluso el conjunto de pruebas automáticamente a medida que el código sometido a prueba evolucione.
Nota
IntelliTest solo está disponible en la edición Enterprise. Se admite para código de C# que tenga como destino .NET Framework. Para la compatibilidad de .NET 6 con IntelliTest, instale la versión preliminar de Visual Studio Enterprise y vea el anuncio .
Pruebas de caracterización IntelliTest le permite determinar el comportamiento del código en términos de un conjunto de pruebas unitarias tradicionales. 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.
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. Para los tipos de objeto complejos, genera fábricas automáticamente. Puede guiar la generación de entradas de prueba ampliando y configurando las fábricas para que se adapten a sus requisitos. Las propiedades de corrección especificadas como aserciones en el código se utilizan automáticamente para guiar la generación de entradas de prueba.
Integración en el IDE IntelliTest está totalmente integrado en el IDE de Visual Studio. 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. Puede iterar fácilmente entre corregir su código y volver a ejecutar IntelliTest, sin salir del IDE de Visual Studio. Las pruebas pueden guardarse en la solución como un proyecto de pruebas unitarias, y se detectan de forma automática posteriormente mediante el Explorador de pruebas de Visual Studio.
Complementar las prácticas de pruebas existentes Use IntelliTest para complementar cualquier práctica de prueba existente que ya siga.
Si quiere probar:
- Algoritmos en datos primitivos o matrices de datos primitivos:
- escriba pruebas unitarias parametrizadas
- Algoritmos en datos complejos, como el compilador:
- permita que IntelliTest genere primero una representación abstracta de los datos y, después, la introduzca en el algoritmo
- permita que IntelliTest cree instancias mediante la creación de objetos personalizados e invariantes de datos y, después, invoque el algoritmo
- Contenedores de datos:
- escriba pruebas unitarias parametrizadas
- permita que IntelliTest cree instancias mediante la creación de objetos personalizados e invariantes de datos y, después, invoque un método del contenedor y vuelva a comprobar después los elementos invariantes
- escriba pruebas unitarias parametrizadas que llaman a diferentes métodos de la implementación, dependiendo de los valores de parámetro
- Una base de código existente:
- use el Asistente de IntelliTest para Visual Studio para comenzar a generar un conjunto de pruebas unitarias parametrizadas (PUT)
Hello World de IntelliTest
IntelliTest detecta entradas relevantes al programa que se prueba, lo que significa que puede usarlo para generar la famosa cadena ¡Hola mundo! Presupone que ha creado un proyecto de prueba basado en MSTest de C# y que ha agregado una referencia a Microsoft.Pex.Framework. Si va a usar otro marco de pruebas, cree una biblioteca de clases de C# y consulte la documentación del marco de pruebas para obtener información sobre cómo configurar el proyecto.
En el ejemplo siguiente se crean dos restricciones en el parámetro llamado value para que IntelliTest genere la cadena necesaria:
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:
- ""
- "\0\0\0\0\0"
- "Hello"
- "\0\0\0\0\0\0"
- "Hello\0"
- "Hello\0\0"
- "Hello\0World!"
- "Hello World!"
Nota
Para problemas de compilación, pruebe a reemplazar las referencias de Microsoft.VisualStudio.TestPlatform.TestFramework y Microsoft.VisualStudio.TestPlatform.TestFramework.Extensions por una referencia a Microsoft.VisualStudio.QualityTools.UnitTestFramework.
Lea Generar pruebas unitarias con IntelliTest para saber dónde se guardan las pruebas generadas. El código de prueba generado debe incluir una prueba como la siguiente:
[TestMethod]
[PexGeneratedBy(typeof(global::HelloWorldTest))]
[PexRaisedException(typeof(Exception))]
public void HelloWorldThrowsException167()
{
this.HelloWorld("Hello World!");
}
Es así de fácil.
Recursos adicionales:
- Lea esta información general de MSDN Magazine.
Atributos importantes
- PexClass marca un tipo que contiene PUT
- PexMethod marca PUT
- PexAssumeNotNull marca un parámetro que no es NULL
using Microsoft.Pex.Framework;
[..., PexClass(typeof(Foo))]
public partial class FooTest {
[PexMethod]
public void Bar([PexAssumeNotNull]Foo target, int i) {
target.Bar(i);
}
}
- PexAssemblyUnderTest enlaza un proyecto de prueba a un proyecto
- PexInstrumentAssembly especifica un ensamblado que se va a instrumentar
[assembly: PexAssemblyUnderTest("MyAssembly")] // also instruments "MyAssembly"
[assembly: PexInstrumentAssembly("Lib")]
clases del asistente estáticas importantes
- PexAssume evalúa hipótesis (filtrado de entradas)
- PexAssert evalúa aserciones
- PexChoose genera opciones nuevas (entradas adicionales)
- PexObserve registra valores en vivo para las pruebas generadas
[PexMethod]
void StaticHelpers(Foo target) {
PexAssume.IsNotNull(target);
int i = PexChoose.Value<int>("i");
string result = target.Bar(i);
PexObserve.ValueForViewing<string>("result", result);
PexAssert.IsNotNull(result);
}
Limitaciones
En esta sección se describen las limitaciones de IntelliTest:
- Indeterminismo
- Simultaneidad
- Código .NET nativo
- Plataforma
- Idioma
- Razonamiento simbólico
- Seguimientos de la pila
Indeterminismo
IntelliTest presupone que el programa analizado es determinista. Si no lo es, IntelliTest lo recorre hasta alcanzar un límite de exploración.
IntelliTest considera que un programa no es determinista si se basa en entradas que IntelliTest no puede controlar.
IntelliTest controla entradas que se proporcionan para las pruebas unitarias parametrizadas y se obtienen de PexChoose. En ese sentido, los resultados de las llamadas a código no instrumentado o no administrado también se consideran "entradas" al programa instrumentado, pero IntelliTest no puede controlarlas. Si el flujo de control del programa depende de 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.
Además, el programa se considera indeterminista si los valores de los orígenes externos cambian al volver a ejecutar el programa. En dichos casos, IntelliTest pierde el control de la ejecución del programa y su búsqueda pasa a ser ineficaz.
A veces no es evidente cuando esto sucede. Considere los siguientes ejemplos:
- El resultado del método GetHashCode() se proporciona mediante código no administrado y no es predecible.
- La clase System.Random usa la hora del sistema actual para proporcionar valores aleatorios reales.
- La clase System.DateTime proporciona la hora actual, que no está bajo el control de IntelliTest.
Simultaneidad
IntelliTest no controla los programas multiproceso.
Código nativo
IntelliTest no entiende el código nativo, como las instrucciones x86 que se llaman mediante P/Invoke. No sabe cómo traducir dichas llamadas en restricciones que se pueden pasar al solucionador de restricciones. Incluso para el código .NET, puede analizar solo código que instrumenta. IntelliTest no puede instrumentar determinadas partes de mscorlib, incluida la biblioteca de reflexión. DynamicMethod no se puede instrumentar.
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. Sin embargo, incluso si algunos métodos no están instrumentados, IntelliTest intenta abarcar el código instrumentado todo lo posible.
Plataforma
IntelliTest solo se admite en .NETframework de 32 bits basado en X86.
Lenguaje
En principio, IntelliTest puede analizar los programas de .NET arbitrarios, escritos en cualquier lenguaje de .NET. En cambio, en Visual Studio solo admite C#.
Razonamiento simbólico
IntelliTest usa un solucionador de restricciones automático para determinar los valores que son relevantes para la prueba y el programa sometido a prueba. En cambio, las capacidades del solucionador de restricciones están, y siempre estarán, limitadas.
Seguimientos de pila incorrectos
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. Esta es una limitación en el diseño de la instrucción "Rethrow".