Použití architektury MSTest v testech jednotek

Architektura MSTest podporuje testování částí v sadě Visual Studio. Třídy a členy v Microsoft.VisualStudio.TestTools.UnitTesting oboru názvů použijte při psaní testů jednotek. Můžete je také použít při zpřesnění testu jednotek, který byl vygenerován z kódu.

Členové architektury

Abychom vám pomohli poskytnout přehlednější přehled architektury testování částí, tato část uspořádá členy Microsoft.VisualStudio.TestTools.UnitTesting oboru názvů do skupin souvisejících funkcí.

Poznámka:

Elementy atributů, jejichž názvy končí atributem "Attribute", lze použít buď s atributem nebo bez atributu na konci, a pro konstruktory bez parametrů s závorkou nebo bez závorek. Například následující příklady kódu fungují identicky:

[TestClass()]

[TestClassAttribute()]

[TestClass]

[TestClassAttribute]

Atributy používané k identifikaci tříd a metod testů

Každá testovací třída musí mít TestClass atribut a každá testovací metoda musí mít TestMethod atribut. Další informace naleznete v tématu Anatomie testu jednotek.

TestClassAttribute

Atribut TestClass označuje třídu, která obsahuje testy a volitelně inicializovat nebo vyčistit metody.

Tento atribut lze rozšířit, aby se aktualizovalo nebo rozšířilo chování.

Příklad:

[TestClass]
public class MyTestClass
{    
}

TestMethodAttribute

Atribut TestMethod se používá uvnitř a TestClass definuje skutečnou testovací metodu, která se má spustit.

Metoda by měla být metoda instance definovaná jako public void nebo public Task (volitelně async) a měla by být bez parametrů.

Příklad

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

Atributy používané pro testování řízené daty

K nastavení testů jednotek řízených daty použijte následující prvky. Další informace najdete v tématu Vytvoření testu jednotek řízeného daty a použití konfiguračního souboru k definování zdroje dat.

Datarow

Umožňuje DataRowAttribute zadat vložená data použitá při vyvolání testovací metody. Může se zobrazit jednou nebo vícekrát v testovací metodě. Měla by být kombinována s TestMethodAttribute nebo DataTestMethodAttribute.

Počet a typy argumentů musí přesně odpovídat podpisu testovací metody.

Příklady platných volání:

[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) {}
}

Všimněte si, že funkci můžete použít params také k zachycení více vstupů DataRow.

[TestClass]
public class TestClass
{
    [TestMethod]
    [DataRow(1, 2, 3, 4)]
    public void TestMethod(params int[] values) {}
}

Příklady neplatných kombinací:

[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) {}
}

Poznámka:

Počínaje msTest v3, pokud chcete předat přesně 2 matice, už nemusíte zabalit druhé pole do pole objektu. Before: [DataRow(new string[] { "a" }, new object[] { new string[] { "b" } })] In v3 dále: [DataRow(new string[] { "a" }, new string[] { "b" })]

Zobrazovaný název použitý v sadě Visual Studio a protokolovací nástroje pro každou instanci DataRowAttribute můžete upravit nastavením DisplayName vlastnosti.

[TestClass]
public class TestClass
{
    [TestMethod]
    [DataRow(1, 2, DisplayName= "Functional Case FC100.1")]
    public void TestMethod(int i, int j) {}
}

Můžete také vytvořit vlastní specializovaný atribut datového řádku děděním DataRowAttribute.

[AttributeUsage(AttributeTargets.Method, AllowMultiple = true)]
public class MyCustomDataRowAttribute : DataRowAttribute
{
}

[TestClass]
public class TestClass
{
    [TestMethod]
    [MyCustomDataRow(1)]
    public void TestMethod(int i) {}
}

Atributy používané k inicializaci a vyčištění

Metoda zdobená jedním z následujících atributů se volá v okamžiku, kdy zadáte. Další informace naleznete v tématu Anatomie testu jednotek.

Sestavení

SestaveníInitialize se volá hned po načtení sestavení a SestaveníCleanup je voláno přímo před uvolněním sestavení.

Metody označené těmito atributy by měly být definovány jako static void nebo static Task, v a TestClassa zobrazí se pouze jednou. Část inicializace vyžaduje jeden argument typu TestContext a vyčistit žádný argument.

[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()
    {
    }
}

Třída

ClassInitialize se volá přímo před načtením třídy (ale po statickém konstruktoru) a TřídaCleanup se volá přímo po uvolnění třídy.

Je možné řídit chování dědičnosti: pouze pro aktuální třídu používající InheritanceBehavior.None nebo pro všechny odvozené třídy používající InheritanceBehavior.BeforeEachDerivedClass.

Je také možné nakonfigurovat, zda má být vyčištění třídy spuštěno na konci třídy nebo na konci sestavení (již není podporováno od MSTest v4, protože EndOfClass je výchozí a pouze chování čištění třídy).

Metody označené těmito atributy by měly být definovány jako static void nebo static Task, v a TestClassa zobrazí se pouze jednou. Část inicializace vyžaduje jeden argument typu TestContext a vyčistit žádný argument.

[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()
    {
    }
}

Test

TestInitialize se volá přímo před spuštěním testu a testCleanup se volá hned po dokončení testu.

Podobá TestInitialize se konstruktoru třídy, ale obvykle je vhodnější pro dlouhé nebo asynchronní inicializace. Volá TestInitialize se vždy za konstruktorem a volá se pro každý test (včetně každého datového řádku testů řízených daty).

Podobá TestCleanup se třídě Dispose (nebo DisposeAsync), ale obvykle je vhodnější pro dlouhé nebo asynchronní čištění. Vždy TestCleanup se volá těsně před testem DisposeAsync/Dispose a volá se pro každý test (včetně každého datového řádku testů řízených daty).

Metody označené těmito atributy by měly být definovány jako void nebo Task, v parametrech TestClassbez parametrů a zobrazí se jednou nebo vícekrát.

[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 jednotek mohou ověřit konkrétní chování aplikace pomocí různých druhů kontrolních výrazů, výjimek a atributů. Další informace naleznete v tématu Použití třídy assert.

TestContext – třída

Následující atributy a hodnoty, které jsou jim přiřazeny, se zobrazí v sadě Visual Studio okno Vlastnosti pro konkrétní testovací metodu. Tyto atributy nemají být přístupné prostřednictvím kódu testu jednotek. Místo toho ovlivňují způsoby použití nebo spuštění testu jednotek, ať už prostřednictvím integrovaného vývojového prostředí sady Visual Studio, nebo testovacího modulu sady Visual Studio. Některé z těchto atributů se například zobrazují jako sloupce v okně Správce testů a v okně Výsledky testů, což znamená, že je můžete použít k seskupení a řazení testů a výsledků testů. Jedním z takových atributů je TestPropertyAttribute, který použijete k přidání libovolných metadat do testů jednotek. Můžete ho například použít k uložení názvu "test pass" (úspěšného testu), který tento test pokrývá, a to tak, že označíte test [TestProperty("TestPass", "Accessibility")]jednotek . Nebo ho můžete použít k uložení indikátoru druhu testu, se kterým [TestProperty("TestKind", "Localization")]je . Vlastnost, kterou vytvoříte pomocí tohoto atributu, a hodnotu vlastnosti, kterou přiřadíte, se zobrazí v okně Vlastnosti sady Visual Studio pod nadpisem Test specifické.

DeploymentItemAttribute

Architektura MSTest V2 zavedená DeploymentItemAttribute pro kopírování souborů nebo složek zadaných jako položky nasazení do adresáře nasazení (bez přidání vlastní výstupní cesty ke zkopírovaným souborům budou ve složce TestResults uvnitř složky projektu). V adresáři nasazení jsou přítomny všechny položky nasazení společně s knihovnou DLL testovacího projektu.

Lze ji použít buď u tříd testů (tříd označených atributem TestClass ), nebo u testovacích metod (metod označených atributem TestMethod ).

Uživatelé mohou mít více instancí atributu, které určují více než jednu položku.

A tady vidíte jeho konstruktory.

Příklad

[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");
    }
}

Testování tříd konfigurace

Atributy používané ke generování sestav

Atributy v této části souvisejí s testovací metodou, kterou vyzdobují entitám v hierarchii projektu týmového Team Foundation Server projektu.

Třídy používané s privátními přístupovými objekty

Pro privátní metodu můžete vygenerovat test jednotek. Tato generace vytvoří třídu privátního přístupového objektu, která vytvoří instanci objektu PrivateObject třídy. Třída PrivateObject je třída obálky, která používá reflexi jako součást procesu privátního přístupového objektu. Třída PrivateType je podobná, ale používá se pro volání privátních statických metod místo volání metod privátní instance.

Viz také