Freigeben über


Übersicht über Microsoft IntelliTest

IntelliTest ermöglicht Es Ihnen, Fehler frühzeitig zu finden und die Testwartungskosten zu reduzieren. Mit einem automatisierten und transparenten Testansatz kann IntelliTest eine Kandidatensuite mit Tests für Ihren .NET-Code generieren. Die Testsuite-Generierung kann weiter durch von Ihnen angegebene Korrektheitseigenschaften gesteuert werden. IntelliTest wird die Testsuite sogar automatisch weiterentwickeln, da sich der code unter Test weiterentwickelt.

Hinweis

IntelliTest ist in Visual Studio 2026 veraltet. In Visual Studio 2022 wird IntelliTest nur für .NET Framework unterstützt und ist auf Visual Studio Enterprise beschränkt. Die Unterstützung für .NET 6 war nur auf eine Vorschauversion beschränkt.

Hinweis

In Visual Studio 2022 wird IntelliTest nur für .NET Framework unterstützt und ist auf Visual Studio Enterprise beschränkt. Die Unterstützung für .NET 6 war nur auf eine Vorschauversion beschränkt.

Charakterisierungstests IntelliTest ermöglicht Es Ihnen, das Verhalten von Code in Bezug auf eine Reihe herkömmlicher Komponententests zu bestimmen. Eine solche Testsuite kann als Regressionssuite verwendet werden und bildet die Grundlage für die Bewältigung der Komplexität im Zusammenhang mit der Umgestaltung von Legacy- oder unbekanntem Code.

Geführte Testeingabegenerierung IntelliTest verwendet einen Ansatz für offene Codeanalyse und Einschränkungslösung, um automatisch präzise Testeingabewerte zu generieren; in der Regel ohne Benutzereingriff. Bei komplexen Objekttypen generiert sie automatisch Fabriken. Sie können die Testeingabegenerierung leiten, indem Sie die Fabriken entsprechend Ihren Anforderungen erweitern und konfigurieren. Korrektheitseigenschaften, die als Assertionen im Code angegeben werden, werden automatisch verwendet, um die Eingabegenerierung weiter zu testen.

IDE-Integration IntelliTest ist vollständig in die Visual Studio-IDE integriert. Alle Informationen, die während der Generierung der Testsuite gesammelt werden (z. B. die automatisch generierten Eingaben, die Ausgabe aus Ihrem Code, die generierten Testfälle und deren Bestanden- oder Fehlerstatus) werden in der Visual Studio-IDE angezeigt. Ohne die Visual Studio IDE zu verlassen, können Sie ganz einfach zwischen dem Beheben von Problemen im Code und dem erneuten Ausführen von IntelliTest wechseln. Die Tests können als Komponententestprojekt in der Projektmappe gespeichert werden und werden anschließend automatisch vom Visual Studio Test Explorer erkannt.

Ergänzen vorhandener Testpraktiken Verwenden Sie IntelliTest, um vorhandene Testpraktiken zu ergänzen, die Sie möglicherweise bereits befolgen.

Wenn Sie Folgendes testen möchten:

  • Algorithmen über primitive Daten oder Arrays von primitiven Datentypen:
  • Algorithmen über komplexe Daten, z. B. Compiler:
    • Lassen Sie IntelliTest zunächst eine abstrakte Repräsentation der Daten erzeugen und dann in den Algorithmus eingespeist werden.
    • Erlauben Sie IntelliTest, Instanzen mithilfe benutzerdefinierter Objekterstellung und Dateninvarianten zu erstellen, und rufen Sie dann den Algorithmus auf.
  • Datencontainer:
    • Schreiben parametrisierter Komponententests
    • IntelliTest kann Instanzen mithilfe von benutzerdefinierten Objekterstellungen und Dateninvarianten erstellen, dann eine Methode des Containers aufrufen und danach die Invarianten erneut überprüfen.
    • Schreiben parametrisierter Komponententests , die unterschiedliche Methoden der Implementierung aufrufen, abhängig von den Parameterwerten
  • Eine vorhandene Codebasis:

Das "Hello World" von IntelliTest.

IntelliTest findet Eingaben, die für das getestete Programm relevant sind, was bedeutet, dass Sie es verwenden können, um die berühmte Hello World! -Zeichenfolge zu generieren. Dabei wird davon ausgegangen, dass Sie ein C#MSTest-basiertes Testprojekt erstellt und einen Verweis auf Microsoft.Pex.Framework hinzugefügt haben. Wenn Sie ein anderes Testframework verwenden, erstellen Sie eine C#-Klassenbibliothek, und lesen Sie die Testframeworkdokumentation zum Einrichten des Projekts.

Im folgenden Beispiel werden zwei Einschränkungen für den Parameter Wert erstellt, sodass IntelliTest die erforderliche Zeichenfolge generiert.

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!");
    }
}

Nach der Kompilierung und Ausführung generiert IntelliTest eine Reihe von Tests, z. B. den folgenden Satz:

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

Hinweis

Ersetzen Sie bei Build-Problemen die Verweise auf Microsoft.VisualStudio.TestPlatform.TestFramework und Microsoft.VisualStudio.TestPlatform.TestFramework.Extensions durch einen Verweis auf Microsoft.VisualStudio.QualityTools.UnitTestFramework.

Lesen Sie "Komponententests generieren" mit IntelliTest , um zu verstehen, wo die generierten Tests gespeichert werden. Der generierte Testcode sollte einen Test enthalten, z. B. den folgenden Code:

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

Das ist einfach!

Zusätzliche Ressourcen:

Wichtige Attribute

using Microsoft.Pex.Framework;

[..., PexClass(typeof(Foo))]
public partial class FooTest {
    [PexMethod]
    public void Bar([PexAssumeNotNull]Foo target, int i) {
        target.Bar(i);
    }
}
[assembly: PexAssemblyUnderTest("MyAssembly")] // also instruments "MyAssembly"
[assembly: PexInstrumentAssembly("Lib")]

Wichtige statische Hilfsklassen

  • PexAssume wertet Annahmen aus (Eingabefilterung)
  • PexAssert wertet Assertionen aus
  • PexChoose generiert neue Auswahlmöglichkeiten (zusätzliche Eingaben)
  • PexObserve protokolliert Livewerte bei den generierten Tests.
[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);
}

Einschränkungen

In diesem Abschnitt werden die Einschränkungen von IntelliTest beschrieben:

Nichtdeterminismus

IntelliTest geht davon aus, dass das analysierte Programm deterministisch ist. Wenn es nicht der Fall ist, führt IntelliTest Zyklen durch, bis es eine Erkundungsgrenze erreicht.

IntelliTest betrachtet ein Programm als nicht deterministisch, wenn es auf Eingaben basiert, die IntelliTest nicht steuern kann.

IntelliTest steuert Eingaben, die für parametrisierte Komponententests bereitgestellt und aus dem PexChoose abgerufen werden. In diesem Sinne werden die Ergebnisse von Aufrufen von nicht verwalteten oder nicht instrumentierten Code auch als "Eingaben" für das instrumentierte Programm betrachtet, aber IntelliTest kann sie nicht steuern. Wenn der Steuerungsfluss des Programms von bestimmten Werten abhängig ist, die aus diesen externen Quellen stammen, kann IntelliTest das Programm nicht auf zuvor aufgedeckte Bereiche "lenken".

Darüber hinaus wird das Programm als nicht-deterministisch angesehen, wenn sich die Werte aus externen Quellen beim erneuten Ausführen des Programms ändern. In solchen Fällen verliert IntelliTest die Kontrolle über die Ausführung des Programms und seine Suche wird ineffizient.

Manchmal ist es nicht offensichtlich, wenn dies geschieht. Betrachten Sie die folgenden Beispiele:

  • Das Ergebnis der GetHashCode()- Methode wird von nicht verwalteten Code bereitgestellt und ist nicht vorhersehbar.
  • Die System.Random-Klasse verwendet die aktuelle Systemzeit, um wirklich zufällige Werte zu liefern.
  • Die System.DateTime-Klasse stellt die aktuelle Uhrzeit bereit, die sich nicht unter dem Steuerelement von IntelliTest befindet.

Konkurrenz

IntelliTest behandelt keine Multithreadprogramme.

Nativer Code

IntelliTest versteht keinen systemeigenen Code, z. B. x86-Anweisungen, die über P/Invoke aufgerufen werden. Es ist nicht bekannt, wie solche Aufrufe in Einschränkungen übersetzt werden können, die an den Einschränkungslöser übergeben werden können. Selbst für .NET-Code kann er nur Code analysieren, den er instrumentiert. IntelliTest kann bestimmte Teile von mscorlib, einschließlich der Spiegelungsbibliothek, nicht instrumentieren. DynamicMethod kann nicht instrumentiert werden.

Die vorgeschlagene Problemumgehung besteht darin, einen Testmodus zu haben, in dem sich diese Methoden in Typen in einer dynamischen Assembly befinden. Selbst wenn einige Methoden nicht instrumentiert sind, versucht IntelliTest, so viel instrumentierter Code wie möglich abzudecken.

Plattform

IntelliTest wird nur auf dem X86, 32-Bit-.NET-Framework unterstützt.

Language

IntelliTest kann grundsätzlich beliebige .NET-Programme analysieren, die in jeder .NET-Sprache geschrieben sind. In Visual Studio wird jedoch nur C# unterstützt.

Symbolische Begründung

IntelliTest verwendet einen automatischen Einschränkungslöser , um zu bestimmen, welche Werte für den Test und das programm im Test relevant sind. Die Fähigkeiten des Constraints-Lösers sind jedoch begrenzt und werden es immer sein.

Falsche Stapelablaufverfolgungen

Da IntelliTest Ausnahmen in jeder instrumentierten Methode abfängt und erneut wirft, sind die Zeilennummern in Stack-Traces nicht korrekt. Diese Einschränkung ist eine bewusste Gestaltung der "Rethrow"-Anweisung.