Freigeben über


Schreiben von Tests mit MSTest

In diesem Artikel erfahren Sie mehr über die APIs und Konventionen, die von MSTest verwendet werden, um Ihre Tests zu schreiben und zu gestalten.

Hinweis

Attributnamen, die mit "Attribut" enden, können das kurze Formular verwenden. TestClass und TestClassAttribute sind gleichwertig. Attribute mit parameterlosen Konstruktoren können Klammern weglassen.

Teststruktur

Jede MSTest-Testklasse muss über das TestClass Attribut verfügen, und jede Testmethode muss über das TestMethod Attribut verfügen:

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

Die TestClassAttribute kennzeichnet eine Klasse, die Tests enthält und optional Initialisierungs- oder Bereinigungsmethoden bereitstellt. Sie können dieses Attribut erweitern, um das Testklassenverhalten anzupassen.

TestMethodAttribute

Die TestMethodAttribute Methode wird als Test markiert, der ausgeführt werden soll. Testmethoden müssen folgendes sein:

[TestClass]
public class TestMethodExamples
{
    [TestMethod]
    public void SynchronousTest()
    {
        Assert.IsTrue(true);
    }

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

Warnung

Verwenden Sie async void nicht für Testmethoden. Verwenden Sie stattdessen async Task oder async ValueTask.

DiscoverInternalsAttribute

Mit dem DiscoverInternalsAttribute-Assemblierungsattribut kann MSTest, Testklassen internal und -methoden ermitteln. Standardmäßig werden nur public Tests entdeckt. Dieses Attribut ist besonders hilfreich, wenn Sie parametrisierte Tests haben, die interne Typen als Parameter verwenden:

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

Ohne DiscoverInternals, die Testmethode und der interne TestInput Parametertyp würden vom Testläufer nicht erkannt.

Kernkonzepte

DIE MSTest-Dokumentation ist nach Thema organisiert:

Thema Description
Assertionen Überprüfen der erwarteten Ergebnisse mit Assert-Klassen
Datengesteuerte Tests Ausführen von Tests mit mehreren Eingaben (DataRow, DynamicData)
Testlebenszyklus Einrichten und Bereinigen auf Assembly-, Klassen- und Testebenen
Ausführungssteuerung Threading, Parallelisierung, Timeouts, Wiederholungen und bedingte Ausführung
Testorganisation Kategorien, Prioritäten, Besitzer und Metadaten
Testcontext Access-Testlaufzeitinformationen

Kurzübersicht zu Attributen

Kategorie Attribute Siehe
Testidentifikation TestClass, TestMethodDiscoverInternals Diese Seite
Datengesteuert DataRow, DynamicDataTestDataRow Datengesteuerte Tests
Lebenszyklus AssemblyInitialize, ClassInitialize, TestInitializeund Bereinigen von Entsprechungen Testlebenszyklus
Einfädelnd STATestClass, STATestMethodUITestMethod Ausführungssteuerung
Parallelisierung Parallelize, DoNotParallelize Ausführungssteuerung
Timeout/Erneuter Versuch Timeout, Retry Ausführungssteuerung
Bedingt Ignore, OSConditionCICondition Ausführungssteuerung
Metadaten TestCategory TestProperty Owner Priority Testorganisation
Arbeitsüberwachung WorkItem, GitHubWorkItem Testorganisation

Assertionen

Verwenden Sie die Assert-Klassen des Microsoft.VisualStudio.TestTools.UnitTesting-Namespace, um bestimmte Funktionen zu überprüfen. Eine Testmethode führt Code in Ihrer Anwendung aus, meldet jedoch die Korrektheit nur, wenn Sie Assert-Anweisungen einschließen.

MSTest-Assertionen sind unterteilt in:

Testen privater Member

Sie können private Member mit Reflection-Wrapperklassen testen:

Tipp

Überlegen Sie, ob private Methoden direkte Tests benötigen. Häufig bieten Tests über öffentliche Schnittstellen eine bessere Abdeckung und wartbarere Tests.

Siehe auch