MSTest-attribut
MSTest använder anpassade attribut för att identifiera och anpassa tester.
För att ge en tydligare översikt över testramverket organiserar det här avsnittet medlemmarna i Microsoft.VisualStudio.TestTools.UnitTesting namnområdet i grupper med relaterade funktioner.
Kommentar
Attribut, vars namn slutar med "Attribut", kan användas med eller utan "Attribut" i slutet. Attribut som har en parameterlös konstruktor kan skrivas med eller utan parentes. Följande kodexempel fungerar identiskt:
[TestClass()]
[TestClassAttribute()]
[TestClass]
[TestClassAttribute]
Attribut som används för att identifiera testklasser och metoder
Varje testklass måste ha TestClass
attributet och varje testmetod måste ha attributet TestMethod
.
TestClassAttribute
Attributet TestClass markerar en klass som innehåller tester och, om du vill, initiera eller rensa metoder.
Det här attributet kan utökas för att ändra eller utöka standardbeteendet.
Exempel:
[TestClass]
public class MyTestClass
{
}
TestMethodAttribute
Attributet TestMethod används i en TestClass
för att definiera den faktiska testmetoden som ska köras.
Metoden ska vara en instansmetod public
som definieras som void
, Task
eller ValueTask
(från och med MSTest v3.3). Det kan vara valfritt async
men bör inte vara async void
.
Metoden bör ha noll parametrar, såvida den inte är markerad med attributet DataRow, attributet DynamicData eller ett liknande attribut som tillhandahåller testfalldata till testmetoden.
Överväg följande exempeltestklass:
[TestClass]
public class MyTestClass
{
[TestMethod]
public void TestMethod()
{
}
}
Attribut som används för datadriven testning
Använd följande element för att konfigurera datadrivna tester. Mer information finns i Skapa ett datadrivet enhetstest och Använd en konfigurationsfil för att definiera en datakälla.
DataRowAttribute
Med attributet DataRow kan du köra samma testmetod med flera olika indata. Det kan visas en eller flera gånger på en testmetod. Det bör kombineras med attributet TestMethod.
Antalet och typerna av argument måste exakt matcha testmetodens signatur. Tänk dig följande exempel på en giltig testklass som visar DataRowAttribute användning med infogade argument som justeras efter testmetodparametrar:
[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.
}
}
Kommentar
Du kan också använda params
funktionen för att samla in flera indata från DataRowAttribute.
[TestClass]
public class TestClass
{
[TestMethod]
[DataRow(1, 2, 3, 4)]
public void TestMethod(params int[] values) {}
}
Exempel på ogiltiga kombinationer:
[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) {}
}
Kommentar
Från och med MSTest v3, när du vill skicka exakt 2 matriser, behöver du inte längre omsluta den andra matrisen i en objektmatris.
Före:[DataRow(new string[] { "a" }, new object[] { new string[] { "b" } })]
Stirra med v3:[DataRow(new string[] { "a" }, new string[] { "b" })]
Du kan ändra visningsnamnet som används i Visual Studio och loggare för varje instans av DataRowAttribute genom att ange egenskapen DisplayName .
[TestClass]
public class TestClass
{
[TestMethod]
[DataRow(1, 2, DisplayName = "Functional Case FC100.1")]
public void TestMethod(int i, int j) {}
}
Du kan också skapa ett eget specialiserat DataRow
-attribut genom att ärva DataRowAttribute.
[AttributeUsage(AttributeTargets.Method, AllowMultiple = true)]
public class MyCustomDataRowAttribute : DataRowAttribute
{
}
[TestClass]
public class TestClass
{
[TestMethod]
[MyCustomDataRow(1)]
public void TestMethod(int i) {}
}
Attribut som används för att tillhandahålla initiering och rensning
Installation och rensning som är gemensam för flera tester kan extraheras till en separat metod och markeras med något av attributen nedan för att köra den vid lämplig tidpunkt, till exempel före varje test. Mer information finns i Anatomi för ett enhetstest.
Sammansättningsnivå
Attributet AssemblyInitialize anropas direkt efter att sammansättningen har lästs in och attributet AssemblyCleanup anropas precis innan sammansättningen tas bort.
De metoder som har markerats med dessa attribut ska definieras som static void
, static Task
eller static ValueTask
(från och med MSTest v3.3), i en klass markerad med TestClassAttributeoch visas bara en gång. Initieringsdelen kräver en parameter av typen TestContext, och städning kan antingen ha inga parametrar eller, från och med MSTest 3.8, en parameter av typen TestContext.
[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)
{
}
}
Klassnivå
Attributet ClassInitialize anropas precis innan klassen läses in (men efter den statiska konstruktorn) och ClassCleanup- anropas direkt efter att klassen har inaktiverats.
Viktig
Som standard utlöses ClassCleanupAttribute efter det sista testet av sammansättningen (på samma sätt som AssemblyCleanupAttribute). Du kan ändra det här beteendet genom att ange CleanupBehavior för attributet. Du kan också ange det här beteendet globalt för sammansättningen med hjälp av sammansättningsattributet ClassCleanupExecutionAttribute.
Det går också att styra arvsbeteendet: endast för den aktuella klassen med hjälp av InheritanceBehavior.Noneeller för alla härledda klasser med hjälp av InheritanceBehavior.BeforeEachDerivedClass.
Metoderna som är markerade med dessa attribut ska definieras som static void
, static Task
eller static ValueTask
(från och med MSTest v3.3), i en , och visas bara en TestClass
gång. Initieringsdelen kräver en parameter av typen TestContext och städningsdelen antingen inga parametrar, eller från och med MSTest 3.8 kan den ha en parameter av typen TestContext.
[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)
{
}
}
Testnivå
Attributet TestInitialize anropas precis innan testet startas och TestCleanup- anropas direkt när testet är klart.
TestInitializeAttribute liknar klasskonstruktorn men är vanligtvis mer lämplig för långa eller asynkrona initieringar. TestInitializeAttribute anropas alltid efter konstruktorn och anropas för varje test (inklusive varje post i datadrivna tester).
TestCleanupAttribute liknar klassen Dispose
(eller DisposeAsync
) men är vanligtvis mer lämplig för långa eller asynkrona rensningar.
TestCleanupAttribute anropas alltid precis före DisposeAsync
/Dispose
och anropas för varje test (inklusive varje post i datadrivna tester).
Metoderna som är markerade med dessa attribut ska definieras som void
, Task
eller ValueTask
(från och med MSTest v3.3), i , TestClass
vara parameterlösa och visas en eller flera gånger.
[TestClass]
public class MyTestClass
{
[TestInitialize]
public void TestInitialize()
{
}
[TestCleanup]
public void TestCleanup()
{
}
}
Attribut som används för att kontrollera testkörning
Följande attribut kan användas för att ändra hur tester körs.
TimeoutAttribute
Attributet Timeout kan användas för att ange den maximala tid i millisekunder som en testmetod tillåts köra. Om testmetoden körs längre än den angivna tiden avbryts testet och markeras som misslyckat.
Det här attributet kan tillämpas på valfri testmetod eller någon fixturmetod (initierings- och rensningsmetoder). Det är också möjligt att ange tidsgränsen globalt för antingen alla testmetoder eller alla testfixturmetoder med hjälp av timeout-egenskaperna för filen runsettings.
Kommentar
Tidsgränsen är inte garanterad att vara exakt. Testet avbryts när den angivna tiden har passerat, men det kan ta längre tid innan steget avbryts.
När du använder timeout-funktionen skapas en separat tråd/uppgift för att köra testmetoden. Huvudtråden/uppgiften ansvarar för att övervaka tidsgränsen och avobservera metodtråden/aktiviteten om tidsgränsen nås.
Från och med MSTest 3.6 är det möjligt att ange CooperativeCancellation egenskapen för attributet (eller globalt via körningar) för att aktivera kooperativ annullering. I det här läget ansvarar metoden för att kontrollera annulleringstoken och avbryta testet om det signaleras som du skulle göra i en typisk async
metod. Det här läget är mer högpresterande och ger mer exakt kontroll över annulleringsprocessen. Det här läget kan tillämpas på både asynkrona metoder och synkroniseringsmetoder.
STATestClassAttribute
När det tillämpas på en testklass anger attributet STATestClass att alla testmetoder (och metoderna [ClassInitialize]
och [ClassCleanup]
) i klassen ska köras i en enkeltrådad lägenhet (STA). Det här attributet är användbart när testmetoderna interagerar med COM-objekt som kräver STA.
Kommentar
Detta stöds endast i Windows och i version 3.6 och senare.
STATestMethodAttribute
När det tillämpas på en testmetod anger attributet STATestMethod att testmetoden ska köras i en enkeltrådad lägenhet (STA). Det här attributet är användbart när testmetoden interagerar med COM-objekt som kräver STA.
Kommentar
Detta stöds endast i Windows och i version 3.6 och senare.
ParallelizeAttribute
Som standard kör MSTest tester i sekventiell ordning. Attributet på sammansättningsnivå Parallellisera attribut kan användas för att köra tester parallellt. Du kan ange om parallelliteten ska vara på klassnivå (flera klasser kan köras parallellt men tester i en viss klass körs sekventiellt) eller på metodnivå.
Det går också att ange det maximala antalet trådar som ska användas för parallell körning. Ett värde på 0
(standardvärde) innebär att antalet trådar är lika med antalet logiska processorer på datorn.
Det går också att ange parallelliteten genom parallelliseringsegenskaperna för filen runsettings.
DoNotParallelizeAttribute
Attributet DoNotParallelize kan användas för att förhindra parallell körning av tester i en viss sammansättning. Det här attributet kan tillämpas på sammansättningsnivå, klassnivå eller metodnivå.
Kommentar
Som standard kör MSTest tester i sekventiell ordning, så du behöver bara använda det här attributet om du har tillämpat sammansättningsnivån Parallellisera attribut.
RetryAttribute
Attributet Retry
introducerades i MSTest 3.8. Det här attributet gör att testmetoden försöker igen när den misslyckas eller tidsgränsen överskrids. Det gör att du kan ange det maximala antalet återförsök, tidsfördröjningen mellan återförsök och en fördröjningstyp för backoff, som antingen är konstant eller exponentiell.
Endast en RetryAttribute
förväntas finnas på en testmetod och RetryAttribute
kan inte användas på metoder som inte är markerade med TestMethod.
Kommentar
RetryAttribute
härleds från en abstrakt RetryBaseAttribute
. Du kan också skapa egna omprövningsimplementeringar om den inbyggda RetryAttribute
inte passar dina behov.
Verktygsattribut
DeploymentItemAttribute
Attributet DeploymentItem används för att kopiera filer eller mappar som anges som distributionsobjekt till distributionskatalogen (utan att lägga till en anpassad utdatasökväg kommer de kopierade filerna att finnas i TestResults
mapp i projektmappen). Distributionskatalogen är den plats där alla distributionsobjekt finns tillsammans med testprojektets DLL.
Den kan användas antingen på testklasser (klasser som har markerats med attributet TestClass) eller på testmetoder (metoder som har markerats med TestMethod- attribut).
Användare kan ha flera instanser av attributet för att ange mer än ett objekt.
Och här kan du se dess konstruktorer.
Exempel
[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");
}
}
Varning
Vi rekommenderar inte att du använder det här attributet för att kopiera filer till distributionskatalogen.
ExpectedExceptionAttribute
Attributet ExpectedException definierar undantaget som testmetoden förväntas generera. Testet godkänns om det förväntade undantaget utlöses och undantagsmeddelandet matchar det förväntade meddelandet.
Varning
Det här attributet finns för bakåtkompatibilitet och rekommenderas inte för nya tester. Använd i stället metoden Assert.ThrowsException
(eller Assert.ThrowsExactly
om du använder MSTest 3.8 och senare).
Metadataattribut
Följande attribut och de värden som tilldelats dem visas i fönstret Visual Studio
Egenskaper för en viss testmetod. De här attributen är inte avsedda att nås via testkoden. I stället påverkar de hur testet används eller körs, antingen av dig via IDE i Visual Studio eller av Visual Studio-testmotorn. Vissa av dessa attribut visas till exempel som kolumner i testhanterarens fönster och fönstret Testresultat , vilket innebär att du kan använda dem för att gruppera och sortera tester och testresultat. Ett sådant attribut är TestPropertyAttribute, som du använder för att lägga till godtyckliga metadata i tester.
Du kan till exempel använda den för att lagra namnet på ett "testpass" som det här testet omfattar genom att markera testet med [TestProperty("Feature", "Accessibility")]
. Du kan också använda den för att lagra en indikator för vilken typ av test det är med [TestProperty("ProductMilestone", "42")]
. Den egenskap som du skapar med hjälp av det här attributet och det egenskapsvärde som du tilldelar visas båda i fönstret Egenskaper för Visual Studio under rubriken Testspecifikt.
- DescriptionAttribute
- IgnoreAttribute
- OwnerAttribute
- PriorityAttribute
- TestCategoryAttribute
- TestPropertyAttribute
- WorkItemAttribute
Attributen nedan relaterar testmetoden som de dekorerar till entiteter i projekthierarkin för ett Team Foundation Server
teamprojekt: