Dela via


Skriva tester med MSTest

I den här artikeln får du lära dig mer om API:er och konventioner som används av MSTest för att hjälpa dig att skriva och forma dina tester.

Kommentar

Attributnamn som slutar med "Attribut" kan använda det korta formuläret. TestClass och TestClassAttribute är likvärdiga. Attribut med parameterlösa konstruktorer kan utelämna parenteser.

Teststruktur

Varje MSTest-testklass måste ha TestClass attributet och varje testmetod måste ha attributet TestMethod :

using Microsoft.VisualStudio.TestTools.UnitTesting;

[TestClass]
public class CalculatorTests
{
    [TestMethod]
    public void Add_TwoNumbers_ReturnsSum()
    {
        // Arrange
        var calculator = new Calculator();

        // Act
        var result = calculator.Add(2, 3);

        // Assert
        Assert.AreEqual(5, result);
    }
}

TestClassAttribute

TestClassAttribute markerar en klass som innehåller test och, om du vill, initialiserings- eller städmetoder. Du kan utöka det här attributet för att anpassa beteendet för testklassen.

TestMethodAttribute

Markerar TestMethodAttribute en metod som ett test som ska köras. Testmetoderna måste vara:

  • Instansmetoder (inte statiska)
  • Public
  • Returnera void, Task eller ValueTask (MSTest v3.3+)
  • Parameterlös, såvida du inte använder datadrivna attribut
[TestClass]
public class TestMethodExamples
{
    [TestMethod]
    public void SynchronousTest()
    {
        Assert.IsTrue(true);
    }

    [TestMethod]
    public async Task AsynchronousTest()
    {
        await Task.Delay(100);
        Assert.IsTrue(true);
    }
}

Varning

Använd inte async void för testmetoder. Använd async Task eller async ValueTask i stället.

DiscoverInternalsAttribute

Sammansättningsattributet DiscoverInternalsAttribute gör det möjligt för MSTest att identifiera internal testklasser och metoder. Som standard identifieras endast public tester. Det här attributet är särskilt användbart när du har parametriserade tester som använder interna typer som parametrar:

[assembly: DiscoverInternals]

internal record TestInput(int Value, string Description);

[TestClass]
public class CalculatorTests
{
    internal static IEnumerable<TestInput> TestData
    {
        get
        {
            yield return new TestInput(1, "one");
            yield return new TestInput(2, "two");
        }
    }

    [TestMethod]
    [DynamicData(nameof(TestData))]
    internal void Add_WithTestInput_ReturnsExpected(TestInput input)
    {
        var calculator = new Calculator();
        var result = calculator.Add(input.Value, 1);
        Assert.AreEqual(input.Value + 1, result);
    }
}

Utan DiscoverInternalsskulle testmetoden och dess interna TestInput parametertyp inte identifieras av testlöparen.

Huvudkoncept

MSTest-dokumentationen ordnas efter ämne:

Ämne Description
Påståenden Verifiera förväntade resultat med Assert-klasser
Data-driven testning Köra tester med flera indata (DataRow, DynamicData)
Testlivscykel Konfigurera och rensa på sammansättnings-, klass- och testnivåer
Exekveringskontroll Trådning, parallellisering, tidsgränser, återförsök och villkorlig exekvering
Testorganisation Kategorier, prioriteringar, ägare och metadata
TestContext Åtkomst till testkörningsinformation

Snabbreferens för attribut

Kategori Attribut Se
Testidentifiering TestClass, TestMethodDiscoverInternals Den här sidan
Data-driven DataRow, DynamicDataTestDataRow Data-drivna testning
Lifecycle AssemblyInitialize, ClassInitialize, TestInitializeoch rensningsmotsvarigheter Testlivscykel
Trådning STATestClass, STATestMethodUITestMethod Körningskontroll
Parallellisering Parallelize, DoNotParallelize Körningskontroll
Tidsgräns/försök igen Timeout, Retry Körningskontroll
Villkorlig Ignore, OSConditionCICondition Körningskontroll
Metainformation TestCategory, TestProperty, , OwnerPriority Testorganisation
Arbetsspårning WorkItem, GitHubWorkItem Testorganisation

Påståenden

Använd Assert-klasserna i Microsoft.VisualStudio.TestTools.UnitTesting namnområdet för att verifiera specifika funktioner. En testmetod använder kod i ditt program, men den rapporterar endast korrekthet när du inkluderar Assert-instruktioner.

MSTest-påståenden är indelade i:

Testa privata medlemmar

Du kan testa privata medlemmar med hjälp av reflektionshanteringsklasser:

Tips/Råd

Överväg om privata metoder behöver direkt testning. Ofta ger testning via offentliga gränssnitt bättre täckning och mer underhållsbara tester.

Se även