Udostępnij za pośrednictwem


Używanie struktury MSTest w testach jednostkowych

Platforma MSTest obsługuje testowanie jednostkowe w programie Visual Studio. Użyj klas i elementów członkowskich w Microsoft.VisualStudio.TestTools.UnitTesting przestrzeni nazw podczas kodowania testów jednostkowych. Można ich również używać podczas udoskonalania testu jednostkowego wygenerowanego na podstawie kodu.

Elementy członkowskie struktury

Aby ułatwić bardziej szczegółowe omówienie struktury testowania jednostkowego, ta sekcja organizuje elementy członkowskie Microsoft.VisualStudio.TestTools.UnitTesting przestrzeni nazw w grupach powiązanych funkcji.

Uwaga

Elementy atrybutów, których nazwy kończą się ciągiem "Attribute", mogą być używane z lub bez atrybutu na końcu i dla konstruktorów bez parametrów z nawiasem lub bez nawiasu. Na przykład następujące 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 . Aby uzyskać więcej informacji, zobacz Anatomia testu jednostkowego.

TestClassAttribute

Atrybut TestClass oznacza klasę zawierającą testy i, opcjonalnie, inicjowanie lub oczyszczanie metod.

Ten atrybut można rozszerzyć, aby zaktualizować lub rozszerzyć 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 zdefiniowaną jako public void lub public Task (opcjonalnie async) i być bez parametrów.

Przykład

[TestClass]
public class MyTestClass
{
    [TestMethod]
    public void TestMethod()
    {
    }
}
[TestClass]
public class MyTestClass
{
    [TestMethod]
    public async Task TestMethod()
    {
    }
}

Atrybuty używane do testowania opartego na danych

Użyj następujących elementów, aby skonfigurować testy jednostkowe 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.

Datarow

Element DataRowAttribute umożliwia podanie wbudowanych danych używanych podczas wywoływania metody testowej. Może pojawić się jeden lub wiele razy w metodzie testowej. Należy go połączyć z wartościami TestMethodAttribute lub DataTestMethodAttribute.

Liczba i typy argumentów muszą być dokładnie zgodne z sygnaturą metody testowej.

Przykłady prawidłowych wywołań:

[TestClass]
public class TestClass
{
    [TestMethod]
    [DataRow(1, "message", true, 2.0)]
    public void TestMethod1(int i, string s, bool b, float f) {}
    
    [TestMethod]
    [DataRow(new string[] { "line1", "line2" })]
    public void TestMethod2(string[] lines) {}

    [TestMethod]
    [DataRow(null)]
    public void TestMethod3(object o) {}

    [TestMethod]
    [DataRow(new string[] { "line1", "line2" }, new string[] { "line1.", "line2." })]
    public void TestMethod4(string[] input, string[] expectedOutput) {}
}

Należy pamiętać, że można również użyć params tej funkcji, aby przechwycić wiele danych wejściowych elementu DataRow.

[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(nowy ciąg[] { "a" }, nowy obiekt[] { nowy ciąg[] { "b" } })] W wersji 3 lub nowszej: [DataRow(nowy ciąg[] { "a" }, nowy ciąg[] { "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) {}
}

Możesz również utworzyć własny wyspecjalizowany atrybut wiersza danych, dziedzicząc DataRowAttributeelement .

[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

Metoda ozdobiona jednym z następujących atrybutów jest wywoływana w momencie określenia. Aby uzyskać więcej informacji, zobacz Anatomia testu jednostkowego.

Zestaw

Funkcja AssemblyInitialize jest wywoływana bezpośrednio po załadowaniu zestawu, a funkcja AssemblyCleanup jest wywoływana bezpośrednio przed zwolnieniem zestawu.

Metody oznaczone tymi atrybutami powinny być zdefiniowane jako static void lub static Taskw TestClassobiekcie i wyświetlane tylko raz. Część inicjowania wymaga jednego argumentu typu TestContext i oczyszczania bez argumentu.

[TestClass]
public class MyTestClass
{
    [AssemblyInitialize]
    public static void AssemblyInitialize(TestContext testContext)
    {
    }

    [AssemblyCleanup]
    public static void AssemblyCleanup()
    {
    }
}
[TestClass]
public class MyOtherTestClass
{
    [AssemblyInitialize]
    public static async Task AssemblyInitialize(TestContext testContext)
    {
    }

    [AssemblyCleanup]
    public static async Task AssemblyCleanup()
    {
    }
}

Klasa

Klasa ClassInitialize jest wywoływana bezpośrednio przed załadowaniem klasy (ale po konstruktorze statycznym), a klasa ClassCleanup jest wywoływana bezpośrednio po rozładowaniu klasy.

Istnieje możliwość kontrolowania zachowania dziedziczenia: tylko dla bieżącej klasy przy użyciu lub InheritanceBehavior.None dla wszystkich klas pochodnych przy użyciu metody InheritanceBehavior.BeforeEachDerivedClass.

Istnieje również możliwość skonfigurowania, czy oczyszczanie klasy powinno być uruchamiane na końcu klasy, czy na końcu zestawu (nie jest już obsługiwane począwszy od msTest v4, ponieważ EndOfClass jest domyślnym i jedynym zachowaniem oczyszczania klasy).

Metody oznaczone tymi atrybutami powinny być zdefiniowane jako static void lub static Taskw TestClassobiekcie i wyświetlane tylko raz. Część inicjowania wymaga jednego argumentu typu TestContext i oczyszczania bez argumentu.

[TestClass]
public class MyTestClass
{
    [ClassInitialize]
    public static void ClassInitialize(TestContext testContext)
    {
    }

    [ClassCleanup]
    public static void ClassCleanup()
    {
    }
}
[TestClass]
public class MyOtherTestClass
{
    [ClassInitialize]
    public static async Task ClassInitialize(TestContext testContext)
    {
    }

    [ClassCleanup]
    public static async Task ClassCleanup()
    {
    }
}

Przetestuj

TestInitialize jest wywoływany bezpośrednio przed rozpoczęciem testu, a testCleanup jest wywoływany bezpośrednio po zakończeniu testu.

Klasa jest podobna TestInitialize do konstruktora klasy, ale zazwyczaj jest bardziej odpowiednia do długich lub asynchronicznych inicjalizacji. Element TestInitialize jest zawsze wywoływany po konstruktorze i wywoływany dla każdego testu (w tym każdego wiersza danych testów opartych na danych).

Klasa jest podobna TestCleanup do klasy Dispose (lub DisposeAsync), ale zazwyczaj jest bardziej odpowiednia do długich lub asynchronicznych operacji oczyszczania. Element TestCleanup jest zawsze wywoływany tuż przed elementem DisposeAsync/Dispose i wywoływany dla każdego testu (w tym każdego wiersza danych testów opartych na danych).

Metody oznaczone tymi atrybutami powinny być zdefiniowane jako void lub Task, 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()
    {
    }
}
[TestClass]
public class MyOtherTestClass
{
    [TestInitialize]
    public async Task TestInitialize()
    {
    }

    [TestCleanup]
    public async Task TestCleanup()
    {
    }
}

Testy jednostkowe mogą weryfikować określone zachowanie aplikacji przy użyciu różnych rodzajów asercji, wyjątków i atrybutów. Aby uzyskać więcej informacji, zobacz Używanie klas asercyjnych.

Klasa TestContext

Następujące atrybuty i przypisane do nich wartości są wyświetlane w programie Visual Studio okno Właściwości dla określonej metody testowej. Te atrybuty nie mają być dostępne za pośrednictwem kodu testu jednostkowego. Zamiast tego mają one wpływ na sposób użycia lub uruchomienia testu jednostkowego 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 jednostkowych. Można na przykład użyć go do przechowywania nazwy "testu testowego", który obejmuje ten test, oznaczając test jednostkowy za pomocą [TestProperty("TestPass", "Accessibility")]polecenia . Możesz też użyć go do przechowywania wskaźnika rodzaju testu.[TestProperty("TestKind", "Localization")] 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.

Deploymentitemattribute

Struktura MSTest V2 wprowadzona DeploymentItemAttribute 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");
    }
}

Klasy konfiguracji testów

Atrybuty używane do generowania raportów

Atrybuty w tej sekcji odnoszą metodę testową, którą dekorują do jednostek w hierarchii projektu zespołowego Team Foundation Server .

Klasy używane z prywatnymi metodami dostępu

Możesz wygenerować test jednostkowy dla metody prywatnej. Ta generacja tworzy prywatną klasę dostępu, która tworzy wystąpienie obiektu PrivateObject klasy. Klasa PrivateObject jest klasą otoki, która używa odbicia w ramach procesu dostępu prywatnego. Klasa jest podobna PrivateType , ale służy do wywoływania prywatnych metod statycznych zamiast wywoływania metod wystąpienia prywatnego.

Zobacz też