Vorgehensweise: Generieren von Unittests mithilfe von IntelliTestHow to: Generate unit tests by using IntelliTest

IntelliTest untersucht Ihren .NET-Code, um Testdaten und eine Reihe von Komponententests zu erzeugen.IntelliTest explores your .NET code to generate test data and a suite of unit tests. Für jede Anweisung im Code wird eine Testeingabe generiert, die die betreffende Anweisung ausführt.For every statement in the code, a test input is generated that will execute that statement. Für jede bedingte Verzweigung im Code wird eine Fallanalyse ausgeführt.A case analysis is performed for every conditional branch in the code. Beispielsweise werden if-Anweisungen, Assertionen und alle Vorgänge analysiert, die Ausnahmen auslösen können.For example, if statements, assertions, and all operations that can throw exceptions are analyzed. Auf Basis dieser Analyse werden Testdaten für einen parametrisierten Einheitstest jeder Ihrer Methoden erzeugt, wobei Komponententests mit einer hohen Codeabdeckung erstellt werden.This analysis is used to generate test data for a parameterized unit test for each of your methods, creating unit tests with high code coverage.

Wenn Sie IntelliTest ausführen, erkennen Sie ohne weiteres, welche Tests zu einem Fehler führen, und können den erforderlichen Code hinzufügen, um die Fehler zu beseitigen.When you run IntelliTest, you can easily see which tests are failing and add any necessary code to fix them. Sie können wählen, welche der generierten Tests in einem Testprojekt gespeichert werden sollen, um eine Regressionsreihe zu erstellen.You can select which of the generated tests to save into a test project to provide a regression suite. Wenn Sie den Code ändern, führen Sie IntelliTest erneut aus, damit die generierten Tests mit den Codeänderungen synchronisiert werden.As you change your code, rerun IntelliTest to keep the generated tests in sync with your code changes.

Verfügbarkeit und ErweiterungenAvailability and extensions

Die Menübefehle IntelliTest erstellen und IntelliTest ausführen:The Create IntelliTest and Run IntelliTest menu commands:

  • Sind nur in der Enterprise Edition von Visual Studio verfügbarAre available only in the Enterprise Edition of Visual Studio.

  • Unterstützen nur C#-Code, der das .NET Framework als Ziel hatSupport only C# code that targets the .NET Framework.

  • Sind erweiterbar und unterstützen das Ausgeben von Tests im Format MSTest, MSTest V2, NUnit und xUnitAre extensible and support emitting tests in MSTest, MSTest V2, NUnit, and xUnit format.

  • Unterstützen keine x64-KonfigurationDo not support x64 configuration.

Untersuchen: Verwenden von IntelliTest zum Untersuchen Ihres Codes und Generieren von KomponententestsExplore: Use IntelliTest to explore your code and generate unit tests

Die Typen müssen öffentlich sein, um Komponententests zu generieren.To generate unit tests, your types must be public.

  1. Öffnen Sie Ihre Projektmappe in Visual Studio, und öffnen Sie dann die Klassendatei, die die zu testenden Methoden enthält.Open your solution in Visual Studio and then open the class file that has methods you want to test.

  2. Klicken Sie mit der rechten Maustaste auf eine Methode, und wählen Sie IntelliTest ausführen aus, um Komponententests für den Code in der Methode zu generieren.Right-click on a method and choose Run IntelliTest to generate unit tests for the code in your method.

    Klicken Sie mit der rechten Maustaste auf Ihre Methode, um Komponententests zu generieren.

    IntelliTest führt den Code mehrfach mit unterschiedlichen Eingaben aus.IntelliTest runs your code many times with different inputs. Zu jedem Durchlauf werden in der Tabelle die Testeingabedaten und die resultierende Ausgabe oder Ausnahme aufgeführt.Each run is represented in the table showing the input test data and the resulting output or exception.

    Das Fenster "Erkundungsergebnisse" wird mit Tests angezeigt

Um Komponententests für alle öffentlichen Methoden in einer Klasse zu generieren, klicken Sie einfach mit der rechten Maustaste auf die Klasse statt auf eine bestimmte Methode, und wählen Sie dann IntelliTest ausführen aus.To generate unit tests for all the public methods in a class, simply right-click in the class rather than a specific method, and then choose Run IntelliTest. Verwenden Sie die Dropdownliste im Fenster Durchsuchungsergebnisse, um die Komponententests und die Eingabedaten für jede Methode der Klasse anzuzeigen.Use the drop-down list in the Exploration Results window to display the unit tests and the input data for each method in the class.

Wählen Sie die anzuzeigenden Testergebnisse aus der Liste aus

Prüfen Sie bei bestandenen Tests, ob die gemeldeten Ergebnisse in der Ergebnisspalte den Erwartungen an den Code entsprechen.For tests that pass, check that the reported results in the result column match your expectations for your code. Korrigieren Sie bei nicht bestandenen Tests den Code entsprechend.For tests that fail, fix your code as appropriate. Führen Sie dann IntelliTest noch einmal aus, um die Korrekturen zu überprüfen.Then rerun IntelliTest to validate the fixes.

Beibehalten: Speichern der Komponententests als RegressionssammlungPersist: Save the unit tests as a regression suite

  1. Wählen Sie die Datenzeilen aus, die Sie mit dem parametrisierten Komponententest in einem Testprojekt speichern möchten.Select the data rows that you want to save with the parameterized unit test into a test project.

    Wählen Sie „Tests“ aus, klicken Sie mit der rechten Maustaste, und wählen Sie „Speichern“ aus.

    Sie können das Testprojekt und den erstellten parametrisierten Komponententest anzeigen. Die einzelnen Komponententests, die jeweils einer Zeile entsprechen, werden in der G.CS-Datei im Testprojekt gespeichert, und ein parametrisierter Komponententest wird in der entsprechenden CS-Datei gespeichert.You can view the test project and the parameterized unit test that has been created - the individual unit tests, corresponding to each of the rows, are saved in the .g.cs file in the test project, and a parameterized unit test is saved in its corresponding .cs file. Sie können die Komponententests wie bei manuell erstellten Komponententests im Test-Explorer ausführen und die Ergebnisse anzeigen.You can run the unit tests and view the results from Test Explorer just as you would for any unit tests that you created manually.

    Öffnen Sie eine Klassendatei in der Testmethode zum Anzeigen des Komponententests

    Dem Testprojekt werden auch alle erforderlichen Verweise hinzugefügt.Any necessary references are also added to the test project.

    Wenn sich der Methodencode ändert, führen Sie IntelliTest erneut aus, damit die Komponententests mit den Änderungen synchron bleiben.If the method code changes, rerun IntelliTest to keep the unit tests in sync with the changes.

Hilfe: Verwenden von IntelliTest für die CodeuntersuchungAssist: Use IntelliTest to focus code exploration

  1. Wenn Ihr Code komplizierter ist, hilft Ihnen IntelliTest bei der Untersuchung des Codes.If you have more complex code, IntelliTest assists you with focusing exploration of your code. Ein Beispiel: Sie verwenden eine Methode, die eine Schnittstelle als Parameter hat, und diese Schnittstelle wird von mehreren Klassen implementiert. Dann ermittelt IntelliTest diese Klassen und gibt eine Warnung aus.For example, if you have a method that has an interface as a parameter, and there is more than one class that implements that interface, IntelliTest discovers those classes and reports a warning.

    Rufen Sie die Warnungen auf, um zu entscheiden, was zu tun ist.View the warnings to decide what you want to do.

    Warnungen anzeigen

  2. Nachdem Sie den Code untersucht haben und wissen, was Sie testen möchten, können Sie die Warnung beheben, indem Sie die Klassen wählen, mit denen die Schnittstelle getestet werden soll.After you investigate the code and understand what you want to test, you can fix the warning to choose which classes to use to test the interface.

    Fix (Beheben)Klicken Sie mit der rechten Maustaste auf die Warnung, und wählen „Beheben“ aus.

    Diese Wahlmöglichkeit wird der Datei PexAssemblyInfo.cs hinzugefügt.This choice is added into the PexAssemblyInfo.cs file.

    [assembly: PexUseType(typeof(Camera))]

  3. Jetzt können Sie IntelliTest erneut ausführen, um einen parametrisierten Komponententest und Testdaten zu generieren, wobei nur die korrigierte Klasse verwendet wird.Now you can rerun IntelliTest to generate a parameterized unit test and test data just using the class that you fixed.

    IntelliTest zum Generieren der Testdaten erneut ausführen

Angeben: Verwenden von IntelliTest zum Überprüfen der Richtigkeit der im Code festgelegten EigenschaftenSpecify: Use IntelliTest to validate correctness properties that you specify in code

Geben Sie die allgemeine Beziehung zwischen Eingaben und Ausgaben an, die von den generierten Komponententests überprüft werden soll.Specify the general relationship between inputs and outputs that you want the generated unit tests to validate. Diese Spezifikation ist in einer Methode gekapselt, die wie eine Testmethode aussieht, aber universell quantifiziert ist.This specification is encapsulated in a method that looks like a test method but is universally quantified. Dies ist die parametrisierte Komponententestmethode, und alle Assertionen, die Sie vornehmen, müssen für alle möglichen Eingabewerte gelten, die IntelliTest generieren kann.This is the parameterized unit test method, and any assertions you make must hold for all possible input values that IntelliTest can generate.

Fragen und AntwortenQ & A

Frage: Kann IntelliTest für nicht verwalteten Code verwendet werden?Q: Can you use IntelliTest for unmanaged code?

Antwort: Nein, IntelliTest funktioniert nur mit verwaltetem Code.A: No, IntelliTest only works with managed code.

Frage: Wann gilt ein generierter Test als bestanden oder nicht bestanden?Q: When does a generated test pass or fail?

Antwort: Er gilt wie jeder andere Komponententest als bestanden, wenn keine Ausnahmen auftreten.A: It passes like any other unit test if no exceptions occur. Er gilt als nicht bestanden, wenn eine Assertion fehlschlägt oder wenn der getestete Code eine nicht behandelte Ausnahme auslöst.It fails if any assertion fails, or if the code under test throws an unhandled exception.

Wenn Sie einen Test haben, der bestanden wird, wenn bestimmte Ausnahmen ausgelöst werden, können Sie je nach Ihren Anforderungen auf Ebene der Testmethode, der Testklasse oder der Assembly eines der folgenden Attribute festlegen:If you have a test that can pass if certain exceptions are thrown, you can set one of the following attributes based on your requirements at the test method, test class or assembly level:

  • PexAllowedExceptionAttributePexAllowedExceptionAttribute

  • PexAllowedExceptionFromTypeAttributePexAllowedExceptionFromTypeAttribute

  • PexAllowedExceptionFromTypeUnderTestAttributePexAllowedExceptionFromTypeUnderTestAttribute

  • PexAllowedExceptionFromAssemblyAttributePexAllowedExceptionFromAssemblyAttribute

Frage: Kann ich dem parametrisierten Komponententest Annahmen hinzufügen?Q: Can I add assumptions to the parameterized unit test?

Antwort: Ja. Geben Sie mit Annahmen an, welche Testdaten für den Komponententest einer bestimmten Methode nicht benötigt werden.A: Yes, use assumptions to specify which test data is not required for the unit test for a specific method. Verwenden Sie die Klasse PexAssume , um Annahmen hinzuzufügen.Use the PexAssume class to add assumptions. Sie können z. B. die Annahme hinzufügen, dass die Variable lengths ungleich null ist:For example, you can add an assumption that the lengths variable is not null like this:

PexAssume.IsNotNull(lengths);

Wenn Sie eine Annahme hinzufügen und IntelliTest erneut ausführen, werden die nicht mehr relevanten Testdaten entfernt.If you add an assumption and rerun IntelliTest, the test data that is no longer relevant will be removed.

Frage: Kann ich dem parametrisierten Komponententest Assertionen hinzufügen?Q: Can I add assertions to the parameterized unit test?

Antwort: Ja. IntelliTest prüft beim Ausführen der Komponententests, dass die Assertion in Ihrer Anweisung wirklich richtig ist.A: Yes, IntelliTest will check that what you are asserting in your statement is in fact correct when it runs the unit tests. Verwenden Sie die Klasse PexAssert oder die Assertions-API aus dem Testframework, um Assertionen hinzufügen.Use the PexAssert class or the assertion API that comes with the test framework to add assertions. Sie können z. B. die Assertion hinzufügen, dass zwei Variablen gleich sind.For example, you can add an assertion that two variables are equal.

PexAssert.AreEqual(a, b);

Wenn Sie eine Assertion hinzufügen und IntelliTest erneut ausführen, wird geprüft, ob die Assertion gültig ist; falls nicht, schlägt der Test fehl.If you add an assertion and rerun IntelliTest, it will check that your assertion is valid and the test fails if it's not.

Frage: Kann ich parametrisierte Komponententests generieren, ohne zuerst IntelliTest auszuführen?Q: Can I generate parameterized unit tests without running IntelliTest first?

Antwort: Ja, klicken Sie mit der rechten Maustaste auf die Klasse oder Methode, und wählen Sie dann IntelliTest erstellen aus.A: Yes, right-click in the class or method, then choose Create IntelliTest.

Klicken Sie mit der rechten Maustaste auf „Editor“, und wählen Sie „IntelliTest erstellen“ aus.

Übernehmen Sie das Standardformat, um Ihre Tests zu generieren, oder ändern Sie die Benennung von Projekten und Tests.Accept the default format to generate your tests, or change how your project and tests are named. Sie können ein neues Testprojekt erstellen oder die Tests in einem vorhandenen Projekt speichern.You can create a new test project or save your tests to an existing project.

Erstellen von IntelliTest mit MSTest-Standardeinstellungen

Frage: Kann ich andere Komponententestframeworks mit IntelliTest verwenden?Q: Can I use other unit test frameworks with IntelliTest?

Antwort: Ja, führen Sie diese Schritte aus, um andere Frameworks zu finden und zu installieren.A: Yes, follow these steps to find and install other frameworks. Testframeworkerweiterungen, beispielsweise NUnit Test Generator, sind auch im Visual Studio Marketplace verfügbar.Test framework extensions are also available in Visual Studio Marketplace, for example, NUnit Test Generator.

Wenn Sie Visual Studio neu gestartet und Ihre Projektmappe geöffnet haben, klicken Sie mit der rechten Maustaste auf die Klasse oder Methode, und wählen Sie dann IntelliTest erstellenaus.After you restart Visual Studio and reopen your solution, right-click in the class or method, then choose Create IntelliTest. Wählen Sie hier das installierte Framework aus:Select your installed framework here:

Auswählen eines anderen Komponententest-Frameworks für IntelliTest

Führen Sie dann IntelliTest aus, um einzelne Komponententests in den zugehörigen G.CS-Dateien zu generieren.Then run IntelliTest to generate individual unit tests in their corresponding .g.cs files.

Frage: Kann ich mehr darüber erfahren, wie die Tests generiert werden?Q: Can I learn more about how the tests are generated?

Antwort: Ja, einen allgemeinen Überblick finden Sie in diesem Blogbeitrag.A: Yes, to get a high-level overview, read this blog post.