Atrybuty MSTest
Narzędzie MSTest używa atrybutów niestandardowych do identyfikowania i dostosowywania testów.
Aby ułatwić bardziej czytelne omówienie struktury testowania, ta sekcja organizuje członków Microsoft.VisualStudio.TestTools.UnitTesting przestrzeni nazw w grupach powiązanych funkcji.
Uwaga
Atrybuty, których nazwy kończą się ciągiem "Attribute", mogą być używane z atrybutem lub bez atrybutu na końcu. Atrybuty, które mają konstruktor bez parametrów, można zapisać z nawiasem lub bez nawiasu. Poniższe przykłady kodu działają identycznie:
[TestClass()]
[TestClassAttribute()]
[TestClass]
[TestClassAttribute]
Atrybuty używane do identyfikowania klas i metod testowych
Każda klasa testowa musi mieć TestClass
atrybut , a każda metoda testowa TestMethod
musi mieć atrybut .
TestClassAttribute
Atrybut TestClass oznacza klasę zawierającą testy i, opcjonalnie, inicjowanie lub oczyszczanie metod.
Ten atrybut można rozszerzyć, aby zmienić lub rozszerzyć domyślne zachowanie.
Przykład:
[TestClass]
public class MyTestClass
{
}
TestMethodAttribute
Atrybut TestMethod jest używany wewnątrz elementu , TestClass
aby zdefiniować rzeczywistą metodę testową do uruchomienia.
Metoda powinna być metodą wystąpienia public
zdefiniowaną jako void
, Task
lub ValueTask
(począwszy od msTest w wersji 3.3). Może to być async
opcjonalne, ale nie powinno być async void
.
Metoda powinna mieć zerowe parametry, chyba że jest oznaczona atrybutem DataRow, atrybutem DynamicData lub podobnym atrybutem, który dostarcza dane przypadku testowego do metody testowej.
Rozważmy następującą przykładowe klasy testowe:
[TestClass]
public class MyTestClass
{
[TestMethod]
public void TestMethod()
{
}
}
Atrybuty używane do testowania opartego na danych
Użyj następujących elementów, aby skonfigurować testy oparte na danych. Aby uzyskać więcej informacji, zobacz Tworzenie testu jednostkowego opartego na danych i Definiowanie źródła danych przy użyciu pliku konfiguracji.
DataRowAttribute
Atrybut DataRow umożliwia uruchomienie tej samej metody testowej z wieloma różnymi danymi wejściowymi. Może pojawić się jeden lub wiele razy w metodzie testowej. Należy go połączyć z atrybutem TestMethod.
Liczba i typy argumentów muszą być dokładnie zgodne z sygnaturą metody testowej. Rozważmy następujący przykład prawidłowej klasy testowej pokazującej użycie DataRowAttribute z wbudowanymi argumentami, które są zgodne z parametrami metody testowej:
[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.
}
}
Uwaga
Możesz również użyć params
tej funkcji, aby przechwycić wiele danych wejściowych elementu DataRowAttribute.
[TestClass]
public class TestClass
{
[TestMethod]
[DataRow(1, 2, 3, 4)]
public void TestMethod(params int[] values) {}
}
Przykłady nieprawidłowych kombinacji:
[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) {}
}
Uwaga
Począwszy od msTest v3, jeśli chcesz przekazać dokładnie 2 tablice, nie musisz już opakowować drugiej tablicy w tablicy obiektów.
Przed:[DataRow(new string[] { "a" }, new object[] { new string[] { "b" } })]
Wpat r. w wersji 3:[DataRow(new string[] { "a" }, new string[] { "b" })]
Możesz zmodyfikować nazwę wyświetlaną używaną w programie Visual Studio i rejestratorach dla każdego wystąpienia DataRowAttribute , ustawiając DisplayName właściwość .
[TestClass]
public class TestClass
{
[TestMethod]
[DataRow(1, 2, DisplayName = "Functional Case FC100.1")]
public void TestMethod(int i, int j) {}
}
Dziedzicząc DataRowAttribute, możesz również utworzyć własny wyspecjalizowany atrybut DataRow
.
[AttributeUsage(AttributeTargets.Method, AllowMultiple = true)]
public class MyCustomDataRowAttribute : DataRowAttribute
{
}
[TestClass]
public class TestClass
{
[TestMethod]
[MyCustomDataRow(1)]
public void TestMethod(int i) {}
}
Atrybuty używane do inicjowania i oczyszczania
Konfiguracja i oczyszczanie, które jest wspólne dla wielu testów, można wyodrębnić do oddzielnej metody i oznaczone jednym z atrybutów wymienionych poniżej, aby uruchomić je w odpowiednim czasie, na przykład przed każdym testem. Aby uzyskać więcej informacji, zobacz Anatomia testu jednostkowego.
Poziom zestawu
Atrybut AssemblyInitialize jest wywoływany bezpośrednio po załadowaniu zestawu, a atrybut AssemblyCleanup jest wywoływany bezpośrednio przed zwolnieniem zestawu.
Metody oznaczone tymi atrybutami powinny być zdefiniowane jako static void
, static Task
lub static ValueTask
(począwszy od MSTest w wersji 3.3) w klasie oznaczonej TestClassAttributei są wyświetlane tylko raz. Część inicjalizacji wymaga jednego parametru typu TestContext, a czyszczenie albo nie wymaga parametrów, albo począwszy od MSTest 3.8, może mieć jeden parametr typu 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)
{
}
}
Poziom klasy
Atrybut ClassInitialize jest wywoływany bezpośrednio przed załadowaniem klasy (ale po konstruktorze statycznym), a ClassCleanup jest wywoływana bezpośrednio po usunięciu klasy.
Ważny
Domyślnie ClassCleanupAttribute zostanie wyzwolony po ostatnim teście zestawu (podobnie jak AssemblyCleanupAttribute). To zachowanie można zmienić, ustawiając CleanupBehavior na atrybucie. Alternatywnie można ustawić to zachowanie globalnie dla zestawu przy użyciu atrybutu zestawu ClassCleanupExecutionAttribute.
Istnieje również możliwość kontrolowania zachowania dziedziczenia: tylko dla bieżącej klasy przy użyciu InheritanceBehavior.Nonelub dla wszystkich klas pochodnych przy użyciu InheritanceBehavior.BeforeEachDerivedClass.
Metody oznaczone tymi atrybutami powinny być zdefiniowane jako static void
, static Task
lub static ValueTask
(począwszy od MSTest w wersji 3.3), w TestClass
obiekcie i wyświetlane tylko raz. Część inicjowania wymaga jednego parametru typu TestContext, a część czyszczenia wymaga albo żadnych parametrów, albo począwszy od MSTest 3.8, może mieć jeden parametr typu 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)
{
}
}
Poziom testu
Atrybut TestInitialize jest wywoływany bezpośrednio przed rozpoczęciem testu, a TestCleanup jest wywoływana bezpośrednio po zakończeniu testu.
Klasa jest podobna TestInitializeAttribute do konstruktora klasy, ale zazwyczaj jest bardziej odpowiednia do długich lub asynchronicznych inicjalizacji. TestInitializeAttribute jest zawsze wywoływany po konstruktorze i uruchamiany dla każdego testu (w tym każdego wpisu do testów sterowanych danymi ).
Klasa jest podobna TestCleanupAttribute do klasy Dispose
(lub DisposeAsync
), ale zazwyczaj jest bardziej odpowiednia do długich lub asynchronicznych operacji oczyszczania.
TestCleanupAttribute jest zawsze wywoływana tuż przed DisposeAsync
/Dispose
i wywoływana dla każdego testu (w tym każdego wpisu testów opartych na danych).
Metody oznaczone tymi atrybutami powinny być zdefiniowane jako void
, Task
lub ValueTask
(począwszy od MSTest w wersji 3.3), w TestClass
obiekcie , być bez parametrów i pojawiać się jeden lub wiele razy.
[TestClass]
public class MyTestClass
{
[TestInitialize]
public void TestInitialize()
{
}
[TestCleanup]
public void TestCleanup()
{
}
}
Atrybuty używane do kontrolowania wykonywania testów
Następujące atrybuty mogą służyć do modyfikowania sposobu wykonywania testów.
TimeoutAttribute
Atrybut Limit czasu może służyć do określenia maksymalnego czasu w milisekundach, który może zostać uruchomiony przez metodę testową. Jeśli metoda testowa działa dłużej niż określony czas, test zostanie przerwany i oznaczony jako niepowodzenie.
Ten atrybut można zastosować do dowolnej metody testowej lub dowolnej metody oprawy (metody inicjowania i oczyszczania). Istnieje również możliwość określenia limitu czasu globalnego dla wszystkich metod testowych lub wszystkich metod urządzeń testowych przy użyciu właściwości limitu czasu pliku runsettings.
Uwaga
Limit czasu nie jest gwarantowany, aby był dokładny. Test zostanie przerwany po upływie określonego czasu, ale może upłynąć dłużej przed anulowaniem kroku.
W przypadku korzystania z funkcji przekroczenia limitu czasu tworzony jest oddzielny wątek/zadanie w celu uruchomienia metody testowej. Główny wątek/zadanie jest odpowiedzialne za monitorowanie limitu czasu i anulowanie obsługi wątku/zadania metody, jeśli osiągnięto limit czasu.
Począwszy od msTest 3.6, można określić CooperativeCancellation właściwość na atrybucie (lub globalnie za pomocą ustawień runsettings), aby włączyć anulowanie współpracy. W tym trybie metoda jest odpowiedzialna za sprawdzenie tokenu anulowania i przerwanie testu, jeśli zostanie zasygnalizowany, jak w typowej async
metodzie. Ten tryb jest bardziej wydajny i umożliwia bardziej precyzyjną kontrolę nad procesem anulowania. Ten tryb można zastosować zarówno do metod asynchronicznych, jak i synchronizacji.
STATestClassAttribute
Po zastosowaniu do klasy testowej, atrybut STATestClass wskazuje, że wszystkie metody testowe (oraz metody [ClassInitialize]
i [ClassCleanup]
) w klasie powinny być uruchamiane w jednowątkowym środowisku (STA). Ten atrybut jest przydatny, gdy metody testowe współdziałają z obiektami COM, które wymagają sta.
Uwaga
Jest to obsługiwane tylko w systemie Windows i w wersji 3.6 lub nowszej.
STATestMethodAttribute
Po zastosowaniu do metody testowej atrybut STATestMethod wskazuje, że metoda testowa powinna być uruchamiana w modelu jednowątkowym (STA). Ten atrybut jest przydatny, gdy metoda testowa współdziała z obiektami COM, które wymagają sta.
Uwaga
Jest to obsługiwane tylko w systemie Windows i w wersji 3.6 lub nowszej.
ParallelizeAttribute
Domyślnie narzędzie MSTest uruchamia testy w kolejności sekwencyjnej. Atrybut poziomu zestawu Parallelize może służyć do równoległego uruchamiania testów. Można określić, czy równoległość powinna być na poziomie klasy (wiele klas można uruchamiać równolegle, ale testy w danej klasie są uruchamiane sekwencyjnie) lub na poziomie metody.
Istnieje również możliwość określenia maksymalnej liczby wątków do użycia na potrzeby wykonywania równoległego. Wartość (wartość 0
domyślna) oznacza, że liczba wątków jest równa liczbie procesorów logicznych na maszynie.
Istnieje również możliwość określenia równoległości za pomocą właściwości równoległości pliku runsettings.
DoNotParallelizeAttribute
Atrybut DoNotParallelize może służyć do zapobiegania równoległemu wykonywaniu testów w danym zestawie. Ten atrybut można zastosować na poziomie zestawu, na poziomie klasy lub metody.
Uwaga
Domyślnie narzędzie MSTest uruchamia testy w kolejności sekwencyjnej, więc wystarczy użyć tego atrybutu tylko wtedy, gdy zastosowano poziom zestawu parallelize atrybutu.
RetryAttribute
Atrybut Retry
został wprowadzony w narzędziu MSTest 3.8. Ten atrybut powoduje, że metoda testowa zostanie ponowiona w przypadku niepowodzenia lub przekroczenia limitu czasu. Umożliwia określenie maksymalnej liczby prób ponownych uruchomień, opóźnienia czasu między próbami oraz typu opóźnienia wstecznego: stałym lub wykładniczym.
Oczekuje się, że w metodzie testowej będzie obecny tylko jeden RetryAttribute
, natomiast RetryAttribute
nie można używać w metodach, które nie są oznaczone TestMethod.
Uwaga
RetryAttribute
pochodzi z abstrakcyjnego RetryBaseAttribute
. Możesz również utworzyć własne implementacje ponawiania, jeśli wbudowana RetryAttribute
nie pasuje do Twoich potrzeb.
Atrybuty narzędzi
DeploymentItemAttribute
Atrybut DeploymentItem służy do kopiowania plików lub folderów określonych jako elementy wdrożenia do katalogu wdrożenia (bez dodawania niestandardowej ścieżki wyjściowej skopiowane pliki będą znajdować się w folderze TestResults
wewnątrz folderu projektu). Katalog wdrażania to miejsce, w którym znajdują się wszystkie elementy wdrożenia wraz z biblioteką DLL projektu testowego.
Można go używać w klasach testowych (klasach oznaczonych atrybutem TestClass) lub na metodach testowych (metodach oznaczonych atrybutem TestMethod).
Użytkownicy mogą mieć wiele wystąpień atrybutu, aby określić więcej niż jeden element.
W tym miejscu można zobaczyć jego konstruktory.
Przykład
[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");
}
}
Ostrzeżenie
Nie zalecamy używania tego atrybutu do kopiowania plików do katalogu wdrożenia.
ExpectedExceptionAttribute
Atrybut ExpectedException definiuje wyjątek, który ma zostać zgłoszony przez metodę testową. Test zakończy się pomyślnie, jeśli zostanie zgłoszony oczekiwany wyjątek, a komunikat o wyjątku jest zgodny z oczekiwanym komunikatem.
Ostrzeżenie
Ten atrybut istnieje w celu zapewnienia zgodności z poprzednimi wersjami i nie jest zalecany w przypadku nowych testów. Zamiast tego użyj metody Assert.ThrowsException
(lub Assert.ThrowsExactly
, jeśli używasz metody MSTest 3.8 lub nowszej).
Atrybuty metadanych
Następujące atrybuty i przypisane do nich wartości są wyświetlane w Visual Studio
oknie Właściwości dla określonej metody testowej. Te atrybuty nie mają być dostępne za pośrednictwem kodu testu. Zamiast tego mają one wpływ na sposoby użycia lub uruchomienia testu za pośrednictwem środowiska IDE programu Visual Studio lub aparatu testowego programu Visual Studio. Na przykład niektóre z tych atrybutów są wyświetlane jako kolumny w oknie Menedżer testów i w oknie Wyniki testów, co oznacza, że można ich użyć do grupowania i sortowania testów i wyników testów. Jednym z takich atrybutów jest TestPropertyAttribute, który służy do dodawania dowolnych metadanych do testów.
Można na przykład użyć go do przechowywania nazwy "testu testowego", który obejmuje ten test, oznaczając test za pomocą [TestProperty("Feature", "Accessibility")]
polecenia . Możesz też użyć go do przechowywania wskaźnika rodzaju testu.[TestProperty("ProductMilestone", "42")]
Właściwość tworzona przy użyciu tego atrybutu i przypisywana wartość właściwości są wyświetlane w oknie Właściwości programu Visual Studio pod nagłówkiem Test specyficzny.
- DescriptionAttribute
- IgnoreAttribute
- OwnerAttribute
- PriorityAttribute
- TestCategoryAttribute
- TestPropertyAttribute
- WorkItemAttribute
Poniższe atrybuty odnoszą metodę testową, którą dekorują do jednostek w hierarchii projektu zespołowego Team Foundation Server
: