MSTest-kenmerken
MSTest maakt gebruik van aangepaste kenmerken om tests te identificeren en aan te passen.
Deze sectie organiseert de leden van de Microsoft.VisualStudio.TestTools.UnitTesting naamruimte in groepen gerelateerde functionaliteit om een duidelijker overzicht te geven van het testframework.
Notitie
Kenmerken, waarvan de namen eindigen op Kenmerk, kunnen worden gebruikt met of zonder kenmerk aan het einde. Kenmerken met een parameterloze constructor kunnen worden geschreven met of zonder haakje. De volgende codevoorbeelden werken identiek:
[TestClass()]
[TestClassAttribute()]
[TestClass]
[TestClassAttribute]
Kenmerken die worden gebruikt om testklassen en -methoden te identificeren
Elke testklasse moet het TestClass
kenmerk hebben en elke testmethode moet het TestMethod
kenmerk hebben.
TestClassAttribute
Het kenmerk TestClass markeert een klasse die tests bevat en, optioneel, methoden initialiseren of opschonen.
Dit kenmerk kan worden uitgebreid om het standaardgedrag te wijzigen of uit te breiden.
Voorbeeld:
[TestClass]
public class MyTestClass
{
}
TestMethodAttribute
Het kenmerk TestMethod wordt in een TestClass
gebruikt om de werkelijke testmethode te definiëren die moet worden uitgevoerd.
De methode moet een instantiemethode public
zijn die is gedefinieerd als void
, Task
of ValueTask
(te beginnen met MSTest v3.3). Het kan optioneel zijn async
, maar mag niet zijn async void
.
De methode moet nul parameters hebben, tenzij deze is gemarkeerd met het kenmerk DataRow, het kenmerk DynamicData of een vergelijkbaar kenmerk dat testcasegegevens aan de testmethode levert.
Bekijk de volgende voorbeeldtestklasse:
[TestClass]
public class MyTestClass
{
[TestMethod]
public void TestMethod()
{
}
}
Kenmerken die worden gebruikt voor gegevensgestuurde tests
Gebruik de volgende elementen om gegevensgestuurde tests in te stellen. Zie Een gegevensgestuurde eenheidstest maken en een configuratiebestand gebruiken om een gegevensbron te definiëren voor meer informatie.
DataRowAttribute
Met het kenmerk DataRow kunt u dezelfde testmethode uitvoeren met meerdere verschillende invoerwaarden. Het kan één of meerdere keren worden weergegeven op een testmethode. Deze moet worden gecombineerd met het kenmerk TestMethod.
Het aantal en de typen argumenten moeten exact overeenkomen met de handtekening van de testmethode. Bekijk het volgende voorbeeld van een geldige testklasse die het DataRowAttribute gebruik laat zien met inlineargumenten die zijn afgestemd op testmethodeparameters:
[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.
}
}
Notitie
U kunt de params
functie ook gebruiken om meerdere invoergegevens van de DataRowAttributefunctie vast te leggen.
[TestClass]
public class TestClass
{
[TestMethod]
[DataRow(1, 2, 3, 4)]
public void TestMethod(params int[] values) {}
}
Voorbeelden van ongeldige combinaties:
[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) {}
}
Notitie
Als u vanaf MSTest v3 exact 2 matrices wilt doorgeven, hoeft u de tweede matrix niet meer in een objectmatrix te verpakken.
Voor:[DataRow(new string[] { "a" }, new object[] { new string[] { "b" } })]
Staring met v3:[DataRow(new string[] { "a" }, new string[] { "b" })]
U kunt de weergavenaam wijzigen die wordt gebruikt in Visual Studio en loggers voor elk exemplaar van DataRowAttribute door de eigenschap in te DisplayName stellen.
[TestClass]
public class TestClass
{
[TestMethod]
[DataRow(1, 2, DisplayName = "Functional Case FC100.1")]
public void TestMethod(int i, int j) {}
}
U kunt ook uw eigen gespecialiseerde DataRow
kenmerk maken door de DataRowAttributeover te nemen.
[AttributeUsage(AttributeTargets.Method, AllowMultiple = true)]
public class MyCustomDataRowAttribute : DataRowAttribute
{
}
[TestClass]
public class TestClass
{
[TestMethod]
[MyCustomDataRow(1)]
public void TestMethod(int i) {}
}
Kenmerken die worden gebruikt om initialisatie en opschoning te bieden
Het instellen en opschonen dat gebruikelijk is voor meerdere tests, kan worden geëxtraheerd naar een afzonderlijke methode, en gemarkeerd met een van de onderstaande kenmerken, om deze op het juiste moment uit te voeren, bijvoorbeeld vóór elke test. Zie Anatomie van een eenheidstest voor meer informatie.
Assemblyniveau
Het kenmerk AssemblyInitialize wordt direct aangeroepen nadat de assembly is geladen en het kenmerk AssemblyCleanup wordt aangeroepen voordat de assembly wordt verwijderd.
De methoden die zijn gemarkeerd met deze kenmerken, moeten worden gedefinieerd als static void
, static Task
of static ValueTask
(te beginnen met MSTest v3.3), in een klasse die is gemarkeerd met TestClassAttributeen slechts één keer worden weergegeven. Voor het initialiseren is één parameter van het type TestContext vereist en het opschonen vereist geen parameters, of vanaf MSTest 3.8 kan het één parameter van het type TestContexthebben.
[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)
{
}
}
Klasniveau
Het kenmerk ClassInitialize wordt direct aangeroepen voordat uw klasse wordt geladen (maar na de statische constructor) en de ClassCleanup- direct nadat uw klasse is geladen, wordt aangeroepen.
Belangrijk
Standaard wordt ClassCleanupAttribute geactiveerd na de laatste test van de assembly (vergelijkbaar met AssemblyCleanupAttribute). U kunt dit gedrag wijzigen door de CleanupBehavior op het kenmerk in te stellen. U kunt dit gedrag ook globaal instellen voor de assembly met behulp van het assemblykenmerk ClassCleanupExecutionAttribute.
Het is ook mogelijk om het overnamegedrag te beheren: alleen voor de huidige klasse die InheritanceBehavior.Nonegebruikt, of voor alle afgeleide klassen die gebruikmaken van InheritanceBehavior.BeforeEachDerivedClass.
De methoden die zijn gemarkeerd met deze kenmerken, moeten worden gedefinieerd als static void
, static Task
of static ValueTask
(beginnend met MSTest v3.3), in een TestClass
, en worden slechts één keer weergegeven. De initialisatie vereist één parameter van het type TestContext en het opschonen vereist geen parameters, maar vanaf MSTest 3.8 kan het één parameter van het type TestContextbevatten.
[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)
{
}
}
Testniveau
De TestInitialize kenmerk wordt direct aangeroepen voordat de test wordt gestart en de TestCleanup- direct nadat de test is voltooid.
De TestInitializeAttribute is vergelijkbaar met de klasseconstructor, maar is meestal geschikter voor lange of asynchrone initialisaties. De TestInitializeAttribute wordt altijd na de constructor aangeroepen en voor elke test aangeroepen (inclusief elke vermelding van gegevensgestuurde tests).
De TestCleanupAttribute is vergelijkbaar met de klasse Dispose
(of DisposeAsync
) maar is meestal geschikter voor lange of asynchrone opschoning. De TestCleanupAttribute wordt altijd net vóór de DisposeAsync
/Dispose
aangeroepen en voor elke test aangeroepen (inclusief elke vermelding van gegevensgestuurde tests).
De methoden die zijn gemarkeerd met deze kenmerken, moeten worden gedefinieerd als void
, Task
of ValueTask
(beginnend met MSTest v3.3), in een TestClass
, parameterloos zijn en één of meerdere keren worden weergegeven.
[TestClass]
public class MyTestClass
{
[TestInitialize]
public void TestInitialize()
{
}
[TestCleanup]
public void TestCleanup()
{
}
}
Kenmerken die worden gebruikt om de testuitvoering te beheren
De volgende kenmerken kunnen worden gebruikt om de manier te wijzigen waarop tests worden uitgevoerd.
TimeoutAttribute
Het time-outkenmerk kan worden gebruikt om de maximale tijd in milliseconden op te geven die door een testmethode mag worden uitgevoerd. Als de testmethode langer wordt uitgevoerd dan de opgegeven tijd, wordt de test afgebroken en gemarkeerd als mislukt.
Dit kenmerk kan worden toegepast op elke testmethode of een willekeurige armaturenmethode (initialisatie- en opschoonmethoden). Het is ook mogelijk om de time-out globaal op te geven voor alle testmethoden of alle testarmaturenmethoden met behulp van de time-outeigenschappen van het runettings-bestand.
Notitie
De time-out is niet gegarandeerd nauwkeurig. De test wordt afgebroken nadat de opgegeven tijd is verstreken, maar het kan langer duren voordat de stap wordt geannuleerd.
Wanneer u de time-outfunctie gebruikt, wordt er een afzonderlijke thread/taak gemaakt om de testmethode uit te voeren. De hoofdthread/taak is verantwoordelijk voor het controleren van de time-out en het ongedaan maken van de methodethread/-taak als de time-out is bereikt.
Vanaf MSTest 3.6 is het mogelijk om eigenschap op te geven CooperativeCancellation op het kenmerk (of globaal via runsettings) om coöperatief annuleren mogelijk te maken. In deze modus is de methode verantwoordelijk voor het controleren van het annuleringstoken en het afbreken van de test als deze wordt gesignaleerd zoals u zou doen in een typische async
methode. Deze modus is beter presterend en maakt een nauwkeurigere controle over het annuleringsproces mogelijk. Deze modus kan worden toegepast op zowel asynchrone als synchronisatiemethoden.
STATestClassAttribute
Wanneer het attribuut STATestClass wordt toegepast op een testklasse, geeft het aan dat alle testmethoden (en de [ClassInitialize]
- en [ClassCleanup]
-methoden) in de klasse moeten worden uitgevoerd in een single-threaded apartment (STA). Dit kenmerk is handig wanneer de testmethoden communiceren met COM-objecten waarvoor STA is vereist.
Notitie
Dit wordt alleen ondersteund in Windows en in versie 3.6 en hoger.
STATestMethodAttribute
Wanneer deze wordt toegepast op een testmethode, geeft de STATestMethod-kenmerk aan dat de testmethode moet worden uitgevoerd in een STA (Single Threaded Apartment). Dit kenmerk is handig wanneer de testmethode communiceert met COM-objecten waarvoor STA is vereist.
Notitie
Dit wordt alleen ondersteund in Windows en in versie 3.6 en hoger.
ParallelizeAttribute
MSTest voert standaard tests uit in een opeenvolgende volgorde. Het kenmerk op assemblyniveau Parallelliseren kenmerk kan worden gebruikt om tests parallel uit te voeren. U kunt opgeven of de parallelle uitvoering moet plaatsvinden op klasseniveau (meerdere klassen kunnen parallel worden uitgevoerd, maar tests in een bepaalde klasse worden opeenvolgend uitgevoerd) of op methodeniveau.
Het is ook mogelijk om het maximum aantal threads op te geven dat moet worden gebruikt voor parallelle uitvoering. Een waarde van 0
(standaardwaarde) betekent dat het aantal threads gelijk is aan het aantal logische processors op de computer.
Het is ook mogelijk om de parallelle uitvoering op te geven via de parallelle eigenschappen van het runettings-bestand.
DoNotParallelizeAttribute
Het kenmerk DoNotParallelize kan worden gebruikt om parallelle uitvoering van tests in een bepaalde assembly te voorkomen. Dit kenmerk kan worden toegepast op assemblyniveau, klasseniveau of methodeniveau.
Notitie
MSTest voert standaard tests in opeenvolgende volgorde uit, dus u hoeft dit kenmerk alleen te gebruiken als u het assembly-niveau Parallelize kenmerk hebt toegepast.
RetryAttribute
Het kenmerk Retry
is geïntroduceerd in MSTest 3.8. Dit kenmerk zorgt ervoor dat de testmethode opnieuw wordt uitgevoerd wanneer deze mislukt of een timeout geeft. Hiermee kunt u het maximum aantal nieuwe pogingen, de tijdsvertraging tussen nieuwe pogingen en een uitsteltype voor vertraging opgeven, wat constant of exponentieel is.
Er mag slechts één RetryAttribute
aanwezig zijn op een testmethode, en RetryAttribute
mag niet gebruikt worden bij methoden zonder de aanduiding TestMethod-.
Notitie
RetryAttribute
is afgeleid van een abstracte RetryBaseAttribute
. U kunt ook uw eigen herhaalpoging-implementaties maken als de ingebouwde RetryAttribute
niet aan uw eisen voldoet.
Kenmerken van hulpprogramma's
DeploymentItemAttribute
Het kenmerk DeploymentItem wordt gebruikt voor het kopiëren van bestanden of mappen die zijn opgegeven als implementatie-items naar de implementatiemap (zonder een aangepast uitvoerpad toe te voegen, bevinden de gekopieerde bestanden zich in TestResults
map in de projectmap). De implementatiemap is waar alle implementatie-items aanwezig zijn, samen met het dll-bestand van het testproject.
Deze kan worden gebruikt voor testklassen (klassen die zijn gemarkeerd met het kenmerk TestClass) of op testmethoden (methoden die zijn gemarkeerd met Kenmerk TestMethod).
Gebruikers kunnen meerdere exemplaren van het kenmerk hebben om meer dan één item op te geven.
En hier kunt u de constructors zien.
Voorbeeld
[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");
}
}
Waarschuwing
Het gebruik van dit kenmerk wordt niet aanbevolen voor het kopiëren van bestanden naar de implementatiemap.
ExpectedExceptionAttribute
Het kenmerk ExpectedException definieert de uitzondering die de testmethode naar verwachting zal genereren. De test wordt doorgegeven als de verwachte uitzondering wordt gegenereerd en het uitzonderingsbericht overeenkomt met het verwachte bericht.
Waarschuwing
Dit kenmerk bestaat voor achterwaartse compatibiliteit en wordt niet aanbevolen voor nieuwe tests. Gebruik in plaats daarvan de methode Assert.ThrowsException
(of Assert.ThrowsExactly
als u MSTest 3.8 en hoger gebruikt).
Metagegevenskenmerken
De volgende kenmerken en de waarden die eraan zijn toegewezen, worden weergegeven in het Visual Studio
venster Eigenschappen voor een bepaalde testmethode. Deze kenmerken zijn niet bedoeld om te worden geopend via de code van de test. In plaats daarvan hebben ze invloed op de manieren waarop de test wordt gebruikt of uitgevoerd door u via de IDE van Visual Studio of door de Visual Studio-testengine. Sommige van deze kenmerken worden bijvoorbeeld weergegeven als kolommen in het venster Testbeheer en het venster Testresultaten . Dit betekent dat u ze kunt gebruiken om tests en testresultaten te groeperen en te sorteren. Een dergelijk kenmerk is TestPropertyAttribute, dat u gebruikt om willekeurige metagegevens toe te voegen aan tests.
U kunt deze bijvoorbeeld gebruiken om de naam van een 'testpas' op te slaan die door deze test wordt behandeld, door de test te markeren met [TestProperty("Feature", "Accessibility")]
. Of u kunt het gebruiken om een indicator op te slaan van het soort test waarmee [TestProperty("ProductMilestone", "42")]
het is. De eigenschap die u maakt met dit kenmerk en de eigenschapswaarde die u toewijst, worden beide weergegeven in het venster Eigenschappen van Visual Studio onder de kop Testspecifiek.
- DescriptionAttribute
- IgnoreAttribute
- OwnerAttribute
- PriorityAttribute
- TestCategoryAttribute
- TestPropertyAttribute
- WorkItemAttribute
De onderstaande kenmerken relateren de testmethode die ze versieren aan entiteiten in de projecthiërarchie van een Team Foundation Server
teamproject: