Vue d’ensemble de Microsoft IntelliTestOverview of Microsoft IntelliTest

IntelliTest vous permet de trouver les bogues rapidement et de réduire les coûts de maintenance des tests.IntelliTest enables you to find bugs early, and reduces test maintenance costs. Grâce à une approche automatisée et transparente des tests, IntelliTest peut générer une suite de tests candidats pour votre code .NET.Using an automated and transparent testing approach, IntelliTest can generate a candidate suite of tests for your .NET code. La génération des suites de tests peut aussi être guidée par des propriétés de justesse que vous spécifiez.Test suite generation can be further guided by correctness properties you specify. IntelliTest fait même évoluer automatiquement la suite de tests au fil de l’évolution du code testé.IntelliTest will even evolve the test suite automatically as the code under test evolves.

Tests de caractérisation IntelliTest vous permet de déterminer le comportement du code sous la forme d’une suite de tests unitaires traditionnels.Characterization tests IntelliTest enables you to determine the behavior of code in terms of a suite of traditional unit tests. Une suite de tests de ce type peut être utilisée comme une suite de régression, qui est le point de départ permettant de s’attaquer à la complexité associée à la refactorisation d’un code hérité ou mal connu.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.

Génération guidée de l’entrée des tests IntelliTest utilise une approche ouverte d’analyse du code et de résolution des contraintes pour générer automatiquement des valeurs d’entrée précises pour les tests, généralement sans nécessiter l’intervention de l’utilisateur.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. Pour les types d’objets complexes, il génère automatiquement des fabriques.For complex object types, it automatically generates factories. Vous pouvez guider la génération de l’entrée des tests en étendant et en configurant les fabriques selon vos besoins.You can guide test input generation by extending and configuring the factories to suit your requirements. Les propriétés de justesse spécifiées en tant qu’assertions dans le code seront également utilisées automatiquement pour guider la génération de l’entrée des tests.Correctness properties specified as assertions in code will also be used automatically to further guide test input generation.

Intégration à l’IDE IntelliTest est entièrement intégré dans l’IDE Visual Studio.IDE integration IntelliTest is fully integrated into the Visual Studio IDE. Toutes les informations collectées au cours de la génération de la suite de tests (comme les entrées générées automatiquement, la sortie provenant de votre code, les cas de test générés, et leur état de réussite ou d’échec) apparaissent dans l’IDE 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. Vous pouvez facilement itérer entre la correction de votre code et la réexécution d’IntelliTest sans quitter l’IDE Visual Studio.You can easily iterate between fixing your code and rerunning IntelliTest, without leaving the Visual Studio IDE. Les tests peuvent être enregistrés dans la solution sous forme de projet de test unitaire et seront automatiquement détectés par l’Explorateur de tests Visual Studio par la suite.The tests can be saved into the solution as a Unit Test Project, and will be automatically detected afterwards by Visual Studio Test Explorer.

Compléter les pratiques de test existantes Utilisez IntelliTest pour compléter les pratiques de test existantes que vous suivez peut-être déjà.Complement existing testing practices Use IntelliTest to complement any existing testing practices that you may already follow.

Si vous voulez tester :If you want to test:

  • Des algorithmes sur des données primitives ou des tableaux de données primitives :Algorithms over primitive data, or arrays of primitive data:
  • Des algorithmes sur des données complexes, comme un compilateur :Algorithms over complex data, such as compiler:
    • laissez d’abord IntelliTest générer une représentation abstraite des données puis passez-la à l’algorithmelet IntelliTest first generate an abstract representation of the data, and then feed it to the algorithm
    • laissez IntelliTest générer des instances en utilisant la création d’objets personnalisés et des invariants de données, puis appelez l’algorithmelet IntelliTest build instances using custom object creation and data invariants, and then invoke the algorithm
  • Des conteneurs de données :Data containers:
  • Une base de code existante :An existing code base:

Hello World dans IntelliTestThe Hello World of IntelliTest

IntelliTest recherche les entrées appropriées au programme testé, ce qui signifie que vous pouvez l’utiliser pour générer la célèbre chaîne Hello World!IntelliTest finds inputs relevant to the tested program, which means you can use it to generate the famous Hello World! .string. Ceci suppose que vous avez créé un projet de test C# basé sur MSTest et que vous avez ajouté une référence à Microsoft.Pex.Framework.this assumes that you have created a C# MSTest-based test project and added a reference to Microsoft.Pex.Framework. Si vous utilisez un autre framework de test, créez une bibliothèque de classes C# et reportez-vous à la documentation du framework de test pour savoir comment configurer le projet.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.

L’exemple suivant crée deux contraintes sur le paramètre nommé value pour permettre à IntelliTest de générer la chaîne nécessaire :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!");
    }
}

Une fois l’exemple compilé et exécuté, IntelliTest génère un ensemble de tests comme celui-ci :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!"

Lisez Générer des tests unitaires avec Intellitest pour comprendre l’emplacement auquel les tests générés sont enregistrés.Read Generate unit tests with Intellitest to understand where the generated tests are saved. Le code de test généré doit inclure un test comme celui-ci :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!");
}

C’est aussi simple que cela !It's that easy!

LimitationsLimitations

Cette section décrit les limitations d’IntelliTest :This section describes the limitations of IntelliTest:

Non déterminismeNondeterminism

IntelliTest suppose que le programme analysé est déterministe.IntelliTest assumes that the analyzed program is deterministic. Si ce n’est pas le cas, IntelliTest boucle jusqu’à atteindre une limite d’exploration.If it is not, IntelliTest will cycle until it reaches an exploration bound.

IntelliTest considère qu’un programme est non déterministe s’il s’appuie sur des entrées qu’IntelliTest ne peut pas contrôler.IntelliTest considers a program to be non-determistic if it relies on inputs that IntelliTest cannot control.

IntelliTest contrôle les entrées fournies aux tests unitaires paramétrables et obtenues à partir de PexChoose.IntelliTest controls inputs provided to parameterized unit tests and obtained from the PexChoose. En ce sens, les résultats des appels à du code non managé ou non instrumenté sont également considérés comme des « entrées » du programme instrumenté, mais IntelliTest ne peut pas les contrôler.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 le flux de contrôle du programme dépend de valeurs spécifiques provenant de ces sources externes, IntelliTest ne peut pas « diriger » le programme vers des zones précédemment non couvertes.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.

De plus, le programme est considéré comme non déterministe si les valeurs provenant de sources externes changent durant la réexécution du programme.In addition, the program is considered to be non-determistic if the values from external sources change when rerunning the program. Dans ce type de situation, IntelliTest perd le contrôle sur l’exécution du programme, et sa recherche devient inefficace.In such cases IntelliTest loses control over the execution of the program and its search becomes inefficient.

Il est parfois difficile de détecter quand cela se produit.Sometimes it is not obvious when this happens. Prenons les exemples suivants :Consider the following examples:

  • Le résultat de la méthode GetHashCode() est fourni par du code non managé et n’est pas prévisible.The result of the GetHashCode() method is provided by unmanaged code, and is not predictable.
  • La classe System.Random utilise l’heure du système en vigueur pour fournir des valeurs véritablement aléatoires.The System.Random class uses the current system time to deliver truly random values.
  • La classe System.DateTime fournit l’heure actuelle, qui n’est pas sous le contrôle d’IntelliTest.The System.DateTime class provides the current time, which is not under the control of IntelliTest.

ConcurrenceConcurrency

IntelliTest ne gère pas les programmes multithreads.IntelliTest does not handle multithreaded programs.

Code natifNative code

IntelliTest ne comprend pas le code natif, comme les instructions x86 appelées via P/Invoke.IntelliTest does not understand native code, such as x86 instructions called through P/Invoke. Il ne sait pas comment traduire ces appels en contraintes qui peuvent être passées au solveur de contrainte.It does not know how to translate such calls into constraints that can be passed to the constraint solver. Même pour du code .NET, il peut analyser uniquement le code qu’il instrumente.Even for .NET code, it can only analyze code it instruments. IntelliTest ne peut pas instrumenter certaines parties de mscorlib, notamment la bibliothèque de réflexion.IntelliTest cannot instrument certain parts of mscorlib, including the reflection library. DynamicMethod ne peut pas être instrumenté.DynamicMethod cannot be instrumented.

La solution de contournement suggérée est d’avoir un mode de test où de telles méthodes se trouvent dans des types dans un assembly dynamique.The suggested workaround is to have a test mode where such methods are located in types in a dynamic assembly. Cependant, même si certaines méthodes sont non instrumentées, IntelliTest tente de couvrir autant de code instrumenté que possible.However, even if some methods are uninstrumented, IntelliTest will try to cover as much of the instrumented code as possible.

PlateformePlatform

IntelliTest est pris en charge seulement sur .NET Framework X86 32 bits.IntelliTest is supported only on the X86, 32-bit .NETframework.

LangueLanguage

En principe, IntelliTest peut analyser les programmes .NET arbitraires, écrits dans n’importe quel langage .NET.In principle, IntelliTest can analyze arbitrary .NET programs, written in any .NET language. Cependant, dans Visual Studio, il prend en charge seulement C#.However, in Visual Studio it supports only C#.

Raisonnement symboliqueSymbolic reasoning

IntelliTest utilise un solveur de contrainte automatique pour déterminer les valeurs d’entrée appropriées pour le test et pour le programme testé.IntelliTest uses an automatic constraint solver to determine which values are relevant for the test and the program under test. Les capacités du solveur de contrainte sont et seront toujours néanmoins limitées.However, the abilities of the constraint solver are, and always will be, limited.

Arborescences des appels de procédure incorrectesIncorrect stack traces

Comme IntelliTest intercepte et « lève à nouveau » les exceptions dans chaque méthode instrumentée, les numéros de ligne dans les traces de pile ne seront pas correctes.Because IntelliTest catches and "rethrows" exceptions in each instrumented method, the line numbers in stack traces will not be correct. Il s’agit d’une limitation liée à la conception de l’instruction « rethrow ».This is a limitation by design of the "rethrow" instruction.

Informations supplémentairesFurther reading