Generieren von Komponententests für Fuzz-Testing mithilfe von IntelliTest

IntelliTest untersucht Ihren .NET-Code, um Testdaten und eine Reihe von Komponententests zu erzeugen. Für jede Anweisung im Code wird eine Testeingabe generiert, die die betreffende Anweisung ausführt. Für jede bedingte Verzweigung im Code wird eine Fallanalyse ausgeführt. Beispielsweise werden if-Anweisungen, Assertionen und alle Vorgänge analysiert, die Ausnahmen auslösen können. Auf Basis dieser Analyse werden Testdaten für einen parametrisierten Einheitstest jeder Ihrer Methoden erzeugt, wobei Komponententests mit einer hohen Codeabdeckung erstellt werden. Stellen Sie sich dies als intelligentes Fuzz-Testing vor, bei dem die Eingaben und Testfälle auf die Komponenten begrenzt werden, die all Ihre Logikbranches und Überprüfungen auf Ausnahmen ausführen.

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. Sie können wählen, welche der generierten Tests in einem Testprojekt gespeichert werden sollen, um eine Regressionsreihe zu erstellen. Wenn Sie den Code ändern, führen Sie IntelliTest erneut aus, damit die generierten Tests mit den Codeänderungen synchronisiert werden.

Verfügbarkeit und Erweiterungen

Die Menübefehle IntelliTest erstellen und IntelliTest ausführen:

  • Sind nur in der Enterprise Edition von Visual Studio verfügbar

  • Unterstützen nur C#-Code, der das .NET Framework als Ziel hat

    Hinweis

    Für .NET 6-Unterstützung mit IntelliTest können Sie die Preview-Version von Visual Studio Enterprise installieren und die Ankündigung anzeigen.

  • Sind erweiterbar und unterstützen das Ausgeben von Tests im Format MSTest, MSTest V2, NUnit und xUnit

  • Unterstützen keine x64-Konfiguration

Untersuchen: Verwenden Sie IntelliTest, um Ihren Code zu untersuchen und Komponententests zu generieren.

Die Typen müssen öffentlich sein, um Komponententests zu generieren.

  1. Öffnen Sie Ihre Projektmappe in Visual Studio, und öffnen Sie dann die Klassendatei, die die zu testenden Methoden enthält.

  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.

    Screenshot of right click on method to generate unit tests.

    Screenshot of right click on method to generate unit tests.

    IntelliTest führt den Code mehrfach mit unterschiedlichen Eingaben aus. Zu jedem Durchlauf werden in der Tabelle die Testeingabedaten und die resultierende Ausgabe oder Ausnahme aufgeführt.

    Screenshot of Exploration Results window.

    Screenshot of Exploration Results window.

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. Verwenden Sie die Dropdownliste im Fenster Durchsuchungsergebnisse, um die Komponententests und die Eingabedaten für jede Methode der Klasse anzuzeigen.

Screenshot of test results to view from list.

Screenshot of test results to view from list.

Prüfen Sie bei bestandenen Tests, ob die gemeldeten Ergebnisse in der Ergebnisspalte den Erwartungen an den Code entsprechen. Korrigieren Sie bei nicht bestandenen Tests den Code entsprechend. Führen Sie dann IntelliTest noch einmal aus, um die Korrekturen zu überprüfen.

Beibehalten: Speichern Sie die Komponententests als Regressionsreihe.

  1. Wählen Sie die Datenzeilen aus, die Sie mit dem parametrisierten Komponententest in einem Testprojekt speichern möchten.

    Screenshot of Save test results.

    Screenshot of Save test results.

    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. Sie können die Komponententests wie bei manuell erstellten Komponententests im Test-Explorer ausführen und die Ergebnisse anzeigen.

    Screenshot of saved tests in Solution Explorer.

    Screenshot of saved tests in Solution Explorer.

    Dem Testprojekt werden auch alle erforderlichen Verweise hinzugefügt.

    Wenn sich der Methodencode ändert, führen Sie IntelliTest erneut aus, damit die Komponententests mit den Änderungen synchron bleiben.

Hilfe: Verwenden Sie IntelliTest für die Codeuntersuchung.

  1. Wenn Ihr Code komplizierter ist, hilft Ihnen IntelliTest bei der Untersuchung des Codes. 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.

    Rufen Sie die Warnungen auf, um zu entscheiden, was zu tun ist.

    Screenshot of View warnings.

    Screenshot of View warnings.

  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.

    Screenshot of Fix warning.

    Screenshot of Fix warning.

    Diese Wahlmöglichkeit wird der Datei PexAssemblyInfo.cs hinzugefügt.

    [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.

    Screenshot of Rerun IntelliTest after fix.

    Screenshot of Rerun IntelliTest after fix.

Angeben: Verwenden Sie IntelliTest, um Eigenschaften für die Richtigkeit zu überprüfen, die Sie im Code angeben.

Geben Sie die allgemeine Beziehung zwischen Eingaben und Ausgaben an, die von den generierten Komponententests überprüft werden soll. Diese Spezifikation ist in einer Methode gekapselt, die wie eine Testmethode aussieht, aber universell quantifiziert ist. Dies ist die parametrisierte Komponententestmethode, und alle Assertionen, die Sie vornehmen, müssen für alle möglichen Eingabewerte gelten, die IntelliTest generieren kann.

Q&A

F: Kann IntelliTest für nicht verwalteten Code verwendet werden?

A: Nein, IntelliTest funktioniert nur mit verwaltetem Code.

F: Wann gilt ein generierter Test als bestanden oder nicht bestanden?

A: Er gilt wie jeder andere Komponententest als bestanden, wenn keine Ausnahmen auftreten. Er gilt als nicht bestanden, wenn eine Assertion fehlschlägt oder wenn der getestete Code eine nicht behandelte Ausnahme auslöst.

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:

  • PexAllowedExceptionAttribute

  • PexAllowedExceptionFromTypeAttribute

  • PexAllowedExceptionFromTypeUnderTestAttribute

  • PexAllowedExceptionFromAssemblyAttribute

F: Kann ich dem parametrisierten Komponententest Annahmen hinzufügen?

A: Ja. Geben Sie mit Annahmen an, welche Testdaten für den Komponententest einer bestimmten Methode nicht benötigt werden. Verwenden Sie die Klasse PexAssume , um Annahmen hinzuzufügen. Sie können z. B. die Annahme hinzufügen, dass die Variable lengths ungleich null ist:

PexAssume.IsNotNull(lengths);

Wenn Sie eine Annahme hinzufügen und IntelliTest erneut ausführen, werden die nicht mehr relevanten Testdaten entfernt.

F: Kann ich dem parametrisierten Komponententest Assertionen hinzufügen?

A: Ja. IntelliTest prüft beim Ausführen der Komponententests, dass die Assertion in Ihrer Anweisung wirklich richtig ist. Verwenden Sie die Klasse PexAssert oder die Assertions-API aus dem Testframework, um Assertionen hinzufügen. Sie können z. B. die Assertion hinzufügen, dass zwei Variablen gleich sind.

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.

F: Kann ich parametrisierte Komponententests generieren, ohne zuerst IntelliTest auszuführen?

A: Ja, klicken Sie mit der rechten Maustaste auf die Klasse oder Methode, und wählen Sie dann IntelliTest erstellenaus.

Screenshot of Create IntelliTest.

Screenshot of Create IntelliTest.

Übernehmen Sie das Standardformat, um Ihre Tests zu generieren, oder ändern Sie die Benennung von Projekten und Tests. Sie können ein neues Testprojekt erstellen oder die Tests in einem vorhandenen Projekt speichern.

Screenshot of Create IntelliTest with MSTest default.

Screenshot of Create IntelliTest with MSTest default.

F: Kann ich andere Komponententestframeworks mit IntelliTest verwenden?

A: Ja, führen Sie diese Schritte aus, um andere Frameworks zu finden und zu installieren. Testframeworkerweiterungen, beispielsweise NUnit Test Generator, sind auch im Visual Studio Marketplace verfügbar.

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. Wählen Sie hier das installierte Framework aus:

Screenshot of Select other unit test framework for IntelliTest.

Screenshot of Select other unit test framework for IntelliTest.

Führen Sie dann IntelliTest aus, um einzelne Komponententests in den zugehörigen G.CS-Dateien zu generieren.

F: Kann ich mehr darüber erfahren, wie die Tests generiert werden?

A: Ja, einen allgemeinen Überblick finden Sie in diesem Blogbeitrag.