Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
MSTest verwendet benutzerdefinierte Attribute, um Tests zu identifizieren und anzupassen.
Für einen besseren Überblick über das Testframework werden die Member des Microsoft.VisualStudio.TestTools.UnitTesting-Namespace in diesem Abschnitt in Gruppen verwandter Funktionen strukturiert.
Hinweis
Attribute, deren Namen mit der Zeichenfolge „Attribute“ enden, können mit oder ohne „Attribute“ am Ende verwendet werden. Attribute mit parameterlosem Konstruktor können mit oder ohne Klammer geschrieben werden. Die folgenden Codebeispiele funktionieren identisch:
[TestClass()]
[TestClassAttribute()]
[TestClass]
[TestClassAttribute]
Zum Angeben von Testklassen und Testmethoden verwendete Attribute
Jede Testklasse muss das TestClass
-Attribut aufweisen und jede Testmethode das TestMethod
-Attribut.
TestClassAttribute
Das TestClass-Attribut markiert eine Klasse, die Tests enthält und optional Methoden initialisiert oder bereinigt.
Dieses Attribut kann erweitert werden, um das Standardverhalten zu ändern oder zu erweitern.
Beispiel:
[TestClass]
public class MyTestClass
{
}
TestMethodAttribute
Das TestMethod-Attribut wird innerhalb eines TestClass
Attributs verwendet, um die tatsächliche auszuführende Testmethode zu definieren.
Die Methode muss eine Instanzmethode vom Typ public
sein, die als void
, Task
oder ValueTask
(ab MSTest 3.3) definiert ist. Sie kann optional async
sein, aber nicht async void
.
Die Methode sollte null Parameter aufweisen, es sei denn, sie ist mit dem attribut DataRow, dem DynamicData-attribut oder einem ähnlichen Attribut gekennzeichnet, das Testfalldaten für die Testmethode bereitstellt.
Sehen Sie sich die folgenden exemplarischen Testklassen an:
[TestClass]
public class MyTestClass
{
[TestMethod]
public void TestMethod()
{
}
}
Für datengesteuerte Tests verwendete Attribute
Verwenden Sie die folgenden Elemente, um datengesteuerte Test einzurichten. Weitere Informationen finden Sie unter Vorgehensweise: Erstellen eines datengesteuerten Komponententests und Verwenden einer Konfigurationsdatei zum Definieren einer Datenquelle.
Tipp
MSTest unterstützt nicht systemeigene Kombinationstests, aber Sie können diese Funktion mithilfe des Open-Source-Pakets Combinatorial.MSTest NuGet hinzufügen. Es wird aktiv von der Community verwaltet und auf GitHub verfügbar. Dieses Paket wird von Microsoft nicht verwaltet.
DataRowAttribute
Mit dem DataRow--Attribut können Sie dieselbe Testmethode mit mehreren verschiedenen Eingaben ausführen. Das Attribut kann in einer Testmethode einmal oder mehrmals verwendet werden. Es sollte mit dem TestMethod Attribut kombiniert werden.
Die Anzahl von Argumenten und die Argumenttypen müssen genau mit der Testmethodensignatur übereinstimmen. Betrachten Sie das folgende Beispiel einer gültigen Testklasse, die die Verwendung von DataRowAttribute mit Inline-Argumenten zeigt, die sich auf die Testmethodenparameter beziehen:
[TestClass]
public class TestClass
{
[TestMethod]
[DataRow(1, "message", true, 2.0)]
public void TestMethod1(int i, string s, bool b, float f)
{
// Omitted for brevity.
}
[TestMethod]
[DataRow(new string[] { "line1", "line2" })]
public void TestMethod2(string[] lines)
{
// Omitted for brevity.
}
[TestMethod]
[DataRow(null)]
public void TestMethod3(object o)
{
// Omitted for brevity.
}
[TestMethod]
[DataRow(new string[] { "line1", "line2" }, new string[] { "line1.", "line2." })]
public void TestMethod4(string[] input, string[] expectedOutput)
{
// Omitted for brevity.
}
}
Hinweis
Das Feature params
kann auch verwendet werden, um mehrere Eingaben der Datenzeile (DataRowAttribute) zu erfassen.
[TestClass]
public class TestClass
{
[TestMethod]
[DataRow(1, 2, 3, 4)]
public void TestMethod(params int[] values) {}
}
Beispiele für ungültige Kombinationen:
[TestClass]
public class TestClass
{
[TestMethod]
[DataRow(1, 2)] // Not valid, we are passing 2 inline data but signature expects 1
public void TestMethod1(int i) {}
[TestMethod]
[DataRow(1)] // Not valid, we are passing 1 inline data but signature expects 2
public void TestMethod2(int i, int j) {}
[TestMethod]
[DataRow(1)] // Not valid, count matches but types do not match
public void TestMethod3(string s) {}
}
Hinweis
Ab MSTest v3 müssen Sie, wenn Sie genau zwei Arrays übergeben möchten, das zweite Array nicht mehr in einem Objektarray umschließen.
Vorher:[DataRow(new string[] { "a" }, new object[] { new string[] { "b" } })]
Ab Version 3:[DataRow(new string[] { "a" }, new string[] { "b" })]
Sie können den in Visual Studio verwendeten Anzeigenamen und die Protokollierungen für jede Instanz von DataRowAttribute ändern, indem Sie die DisplayName-Eigenschaft festlegen.
[TestClass]
public class TestClass
{
[TestMethod]
[DataRow(1, 2, DisplayName = "Functional Case FC100.1")]
public void TestMethod(int i, int j) {}
}
Sie können durch Vererben desDataRow
auch ein eigenes spezialisiertes DataRowAttribute-Attribut erstellen.
[AttributeUsage(AttributeTargets.Method, AllowMultiple = true)]
public class MyCustomDataRowAttribute : DataRowAttribute
{
}
[TestClass]
public class TestClass
{
[TestMethod]
[MyCustomDataRow(1)]
public void TestMethod(int i) {}
}
Attribute, die zum Bereitstellen von Initialisierungen und Bereinigungen verwendet werden
Einrichtungs- und Bereinigungsvorgänge, die von mehreren Tests verwendet werden, können in eine separate Methode extrahiert und mit einem der unten aufgeführten Attribute gekennzeichnet werden, um sie zum geeigneten Zeitpunkt auszuführen (z. B. vor jedem Test). Weitere Informationen finden Sie unter Aufbau eines Komponententests.
Assemblyebene
Das AssemblyInitialize-Attribut wird direkt nach dem Laden der Assembly aufgerufen, und das AssemblyCleanup--Attribut wird direkt aufgerufen, bevor die Assembly entladen wird.
Die mit diesen Attributen gekennzeichneten Methoden sollten als static void
, static Task
oder static ValueTask
(beginnend mit MSTest v3.3) in einer Klasse definiert werden, die mit TestClassAttributegekennzeichnet ist und nur einmal angezeigt wird. Der Initialisierungsteil erfordert einen Parameter vom Typ TestContext. Die Bereinigung kann entweder keine Parameter haben, oder ab MSTest 3.8 einen Parameter vom Typ TestContextenthalten.
[TestClass]
public class MyTestClass
{
[AssemblyInitialize]
public static void AssemblyInitialize(TestContext testContext)
{
}
[AssemblyCleanup]
public static void AssemblyCleanup() // Starting with MSTest 3.8, it can be AssemblyCleanup(TestContext testContext)
{
}
}
Klassenebene
Das ClassInitialize-Attribut wird direkt aufgerufen, bevor die Klasse geladen wird (aber nach dem statischen Konstruktor), und die ClassCleanup- wird direkt nach dem Entladen der Klasse aufgerufen.
Wichtig
Standardmäßig wird ClassCleanupAttribute nach dem letzten Test der Assembly ausgelöst (ähnlich wie AssemblyCleanupAttribute). Sie können dieses Verhalten ändern, indem Sie die CleanupBehavior für das Attribut festlegen. Alternativ können Sie dieses Verhalten global für die Assembly mithilfe des Assembly-Attributs ClassCleanupExecutionAttributefestlegen.
Es ist auch möglich, das Vererbungsverhalten zu steuern: nur für die aktuelle Klasse mit InheritanceBehavior.Noneoder für alle abgeleiteten Klassen mit InheritanceBehavior.BeforeEachDerivedClass.
Mit diesen Attributen gekennzeichnete Methoden müssen als static void
, static Task
oder static ValueTask
(ab MSTest 3.3) in einer Testklasse (TestClass
) definiert werden und dürfen nur einmal vorkommen. Der Initialisierungsteil erfordert einen Parameter vom Typ TestContext. Die Bereinigung kann entweder keine Parameter haben, oder ab MSTest 3.8 einen Parameter vom Typ TestContextenthalten.
[TestClass]
public class MyTestClass
{
[ClassInitialize]
public static void ClassInitialize(TestContext testContext)
{
}
[ClassCleanup]
public static void ClassCleanup() // Starting with MSTest 3.8, it can be ClassCleanup(TestContext testContext)
{
}
}
Testebene
Das TestInitialize Attribut wird direkt aufgerufen, bevor der Test gestartet wird, und die TestCleanup- wird direkt nach Abschluss des Tests aufgerufen.
TestInitializeAttribute ähnelt dem Klassenkonstruktor, eignet sich jedoch in der Regel besser für lange oder asynchrone Initialisierungen. TestInitializeAttribute wird immer nach dem Konstruktor und für jeden Test aufgerufen (einschließlich jeder Datenzeile von datengesteuerten Tests).
TestCleanupAttribute ähnelt der Klasse Dispose
(oder DisposeAsync
), ist jedoch in der Regel für lange oder asynchrone Bereinigungen besser geeignet.
TestCleanupAttribute wird immer unmittelbar vor DisposeAsync
/Dispose
und für jeden Test aufgerufen (einschließlich jeder Datenzeile von datengesteuerten Tests).
Mit diesen Attributen gekennzeichnete Methoden müssen als void
, Task
oder ValueTask
(ab MSTest 3.3) in einer Testklasse (TestClass
) definiert werden, parameterlos sein und dürfen einmal oder mehrmals vorkommen.
[TestClass]
public class MyTestClass
{
[TestInitialize]
public void TestInitialize()
{
}
[TestCleanup]
public void TestCleanup()
{
}
}
Attribute zum Steuern der Testausführung
Die folgenden Attribute können verwendet werden, um die Ausführung von Tests zu ändern.
TimeoutAttribute
Das Attribut Timeout kann verwendet werden, um die maximale Ausführungsdauer einer Testmethode anzugeben (in Millisekunden). Wenn die Ausführungsdauer der Testmethode die angegebene Zeit übersteigt, wird der Test abgebrochen und als nicht erfolgreich markiert.
Dieses Attribut kann auf eine beliebige Test- oder Fixturemethode (Initialisierungs- und Bereinigungsmethoden) angewendet werden. Es ist auch möglich, das Timeout global festzulegen – entweder für alle Testmethoden oder für alle Testfixturemethoden. Hierzu können die Timeouteigenschaften der RUNSETTINGS-Datei verwendet werden.
Hinweis
Die Präzision des Timeouts wird nicht garantiert. Der Test wird abgebrochen, nachdem die angegebene Zeit verstrichen ist, es kann jedoch noch länger dauern, bis der Schritt abgebrochen wird.
Bei Verwendung des Timeoutfeatures wird ein separater Thread bzw. eine separate Aufgabe erstellt, um die Testmethode auszuführen. Der Hauptthread bzw. die Aufgabe ist für die Überwachung des Timeouts und nach Erreichen des Timeouts für die Beendigung der Beobachtung des Methodenthreads bzw. der Aufgabe zuständig.
Ab MSTest 3.6 ist es möglich, die Eigenschaft CooperativeCancellation für das Attribut (oder global per RUNSETTINGS-Datei) anzugeben, um einen kooperativen Abbruch zu ermöglichen. In diesem Modus ist die Methode dafür zuständig, das Abbruchtoken zu überprüfen und den Test bei entsprechender Signalisierung abzubrechen (genau wie bei einer typischen async
-Methode). Dieser Modus ist leistungsfähiger und ermöglicht eine präzisere Steuerung des Abbruchprozesses. Dieser Modus kann sowohl auf asynchrone als auch auf synchrone Methoden angewendet werden.
STATestClassAttribute
Bei Anwendung auf eine Testklasse gibt das attribut STATestClass an, dass alle Testmethoden (und die [ClassInitialize]
und [ClassCleanup]
Methoden) in der Klasse in einem Singlethread-Apartment (STA) ausgeführt werden sollen. Dieses Attribut ist hilfreich, wenn die Testmethoden mit COM-Objekten interagieren, die STA erfordern.
Hinweis
Dies ist nur unter Windows und in Version 3.6 und höher möglich.
STATestMethodAttribute
Bei Anwendung auf eine Testmethode gibt das Attribut STATestMethod an, dass die Testmethode in einem Singlethread-Apartment (STA) ausgeführt werden soll. Dieses Attribut ist hilfreich, wenn die Testmethode mit COM-Objekten interagiert, die STA erfordern.
Hinweis
Dies ist nur unter Windows und in Version 3.6 und höher möglich.
ParallelizeAttribute
Standardmäßig werden Tests von MSTest sequenziell ausgeführt. Das Attribut auf Assemblyebene Parallelize Attribut kann verwendet werden, um Tests parallel auszuführen. Sie können angeben, ob die Parallelität auf Klassenebene oder auf Methodenebene gelten soll. Bei Parallelität auf Klassenebene können mehrere Klassen parallel ausgeführt werden, aber Tests in einer bestimmten Klasse werden sequenziell ausgeführt.
Es ist auch möglich, die maximale Anzahl von Threads anzugeben, die für die parallele Ausführung verwendet werden sollen. Beim Wert 0
(Standardwert) entspricht die Anzahl von Threads der Anzahl logischer Prozessoren auf dem Computer.
Es ist auch möglich, die Parallelität über die Parallelisierungseigenschaften der RUNSETTINGS-Datei anzugeben.
DoNotParallelizeAttribute
Das Attribut DoNotParallelize kann verwendet werden, um die parallele Ausführung von Tests in einer bestimmten Assembly zu verhindern. Dieses Attribut kann auf Assemblyebene, Klassenebene oder Methodenebene angewendet werden.
Hinweis
Standardmäßig führt MSTest Tests in sequenzieller Reihenfolge aus, sodass Sie dieses Attribut nur verwenden müssen, wenn Sie die Assemblyebene Parallelize Attribut angewendet haben.
RetryAttribute
Das Retry
-Attribut wurde in MSTest 3.8 eingeführt. Dieses Attribut bewirkt, dass die Testmethode erneut versucht wird, wenn Fehler oder Timeouts auftreten. Sie können die maximale Anzahl von Wiederholungsversuchen, die Zeitverzögerung zwischen Wiederholungsversuchen und einen Verzögerungsrücklauftyp angeben, der entweder konstant oder exponentiell ist.
Es wird erwartet, dass nur ein RetryAttribute
bei einer Testmethode vorhanden ist, während RetryAttribute
nicht für Methoden verwendet werden können, die nicht mit TestMethodgekennzeichnet sind.
Hinweis
RetryAttribute
wird von einem abstrakten RetryBaseAttribute
abgeleitet. Sie können auch eine eigene Wiederholungsimplementierung erstellen, wenn das integrierte RetryAttribute
Ihren Anforderungen nicht entspricht.
Hilfsprogrammattribute
DeploymentItemAttribute
Das attribut DeploymentItem wird zum Kopieren von Dateien oder Ordnern verwendet, die als Bereitstellungselemente in das Bereitstellungsverzeichnis angegeben sind (ohne einen benutzerdefinierten Ausgabepfad hinzuzufügen, wird die kopierten Dateien im Ordner TestResults
im Projektordner gespeichert). Im Bereitstellungsverzeichnis befinden sich alle Bereitstellungselemente und die DLL-Datei für das Testprojekt.
Sie kann entweder für Testklassen (Klassen, die mit dem attribut TestClass gekennzeichnet sind) oder für Testmethoden (Mit TestMethod Attribut gekennzeichnete Methoden) verwendet werden.
Benutzer*innen können mehrere Instanzen des Attributs erstellen, um mehr als ein Element anzugeben.
Hier sehen Sie die Konstruktoren.
Beispiel
[TestClass]
[DeploymentItem(@"C:\classLevelDepItem.xml")] // Copy file using some absolute path
public class UnitTest1
{
[TestMethod]
[DeploymentItem(@"..\..\methodLevelDepItem1.xml")] // Copy file using a relative path from the dll output location
[DeploymentItem(@"C:\DataFiles\methodLevelDepItem2.xml", "SampleDataFiles")] // File will be added under a SampleDataFiles in the deployment directory
public void TestMethod1()
{
string textFromFile = File.ReadAllText("classLevelDepItem.xml");
}
}
Warnung
Dieses Attribut sollte nicht zum Kopieren von Dateien in das Bereitstellungsverzeichnis verwendet werden.
ExpectedExceptionAttribute
Das attribut ExpectedException definiert die Ausnahme, die die Testmethode auslösen soll. Der Test besteht, wenn die erwartete Ausnahme ausgelöst wird und die Ausnahmemeldung mit der erwarteten Nachricht übereinstimmt.
Warnung
Dieses Attribut ist aus Gründen der Abwärtskompatibilität vorhanden und wird für neue Tests nicht empfohlen. Verwenden Sie stattdessen die Methode Assert.ThrowsException
(oder Assert.ThrowsExactly
, wenn Sie MSTest 3.8 oder höher verwenden).
Metadatenattribute
Die folgenden Attribute und die ihnen zugewiesenen Werte werden im Fenster Visual Studio
von für eine bestimmte Testmethode angezeigt. Auf diese Attribute darf nicht über den Code des Tests zugegriffen werden. Stattdessen beeinflussen sie, in welcher Weise der Test ausgeführt wird – entweder von Ihnen über die IDE von Visual Studio oder durch die Test-Engine von Visual Studio. Einige dieser Attribute werden beispielsweise im Fenster Test Manager und im Fenster Testergebnisse in Spalten angezeigt. Das bedeutet, dass Sie sie zum Gruppieren und Sortieren von Tests und Testergebnissen verwenden können.
TestPropertyAttribute ist ein solches Attribut. Mit ihm können Tests beliebige Metadaten hinzugefügt werden.
Sie können es beispielsweise verwenden, um den Namen eines Testdurchlaufs zu speichern, der von diesem Test abgedeckt wird, indem Sie den Test mit [TestProperty("Feature", "Accessibility")]
kennzeichnen. Alternativ können Sie es verwenden, um einen Indikator zu speichern, der die Art des Tests angibt: [TestProperty("ProductMilestone", "42")]
. Die Eigenschaft, die durch die Verwendung dieses Attributs erstellt wird, und der zugewiesene Eigenschaftswert werden im Visual Studio-Eigenschaftenfenster unter der Überschrift Testspezifisch angezeigt.
- DescriptionAttribute
- IgnoreAttribute
- OwnerAttribute
- PriorityAttribute
- TestCategoryAttribute
- TestPropertyAttribute
- WorkItemAttribute
Die im Anschluss beschriebenen Attribute verknüpfen die Testmethode, in der sie enthalten sind, mit Entitäten in der Projekthierarchie eines Team Foundation Server
-Teamprojekts: