Udostępnij za pośrednictwem


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, Tasklub 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 TestClassobiekcie 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 TestClassobiekcie , 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 Studiooknie 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.

Poniższe atrybuty odnoszą metodę testową, którą dekorują do jednostek w hierarchii projektu zespołowego Team Foundation Server :