Condividi tramite


Scrivere test con MSTest

In questo articolo vengono fornite informazioni sulle API e sulle convenzioni usate da MSTest per scrivere e modellare i test.

Nota

I nomi degli attributi che terminano con "Attribute" possono usare la forma breve. TestClass e TestClassAttribute sono equivalenti. Gli attributi con costruttori senza parametri possono omettere parentesi.

Struttura di test

Ogni classe di test MSTest deve avere l'attributo TestClass e ogni metodo di test deve avere l'attributo 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 contrassegna una classe che contiene test e, facoltativamente, metodi di inizializzazione o pulizia. È possibile estendere questo attributo per personalizzare il comportamento della classe di test.

TestMethodAttribute

Contrassegna TestMethodAttribute un metodo come test da eseguire. I metodi di test devono essere:

  • Metodi di istanza (non statici)
  • Public
  • Restituire void, Tasko ValueTask (MSTest v3.3+)
  • Senza parametri, a meno che non si usino attributi basati sui dati
[TestClass]
public class TestMethodExamples
{
    [TestMethod]
    public void SynchronousTest()
    {
        Assert.IsTrue(true);
    }

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

Avvertimento

Non usare async void per i metodi di test. In sostituzione utilizzare async Task o async ValueTask.

DiscoverInternalsAttribute

L'attributo DiscoverInternalsAttribute assembly consente a MSTest di individuare internal classi e metodi di test. Per impostazione predefinita, solo public test vengono individuati. Questo attributo è particolarmente utile quando sono presenti test con parametri che usano tipi interni come parametri:

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

Senza DiscoverInternals, il metodo di test e il relativo tipo di parametro interno TestInput non vengono individuati dal test runner.

Concetti principali

La documentazione di MSTest è organizzata in base all'argomento:

Argomento Description
Asserzioni Verificare i risultati previsti con le classi Assert
Test basati sui dati Eseguire test con più input (DataRow, DynamicData)
Ciclo di vita dei test Configurare e pulire a livello di assembly, classe e test
Controllo di esecuzione Gestione dei thread, parallelizzazione, timeout, tentativi ed esecuzione condizionale
Organizzazione di test Categorie, priorità, proprietari e metadati
Testcontext Accedere alle informazioni sul runtime di test

Guida rapida agli attributi

Categoria Attributi Visualizza
Identificazione test TestClass, TestMethod, DiscoverInternals Questa pagina
Basato sui dati DataRow, DynamicData, TestDataRow Test basati sui dati
Lifecycle AssemblyInitialize, ClassInitialize, TestInitialize e le controparti di pulizia Ciclo di vita dei test
Gestione dei thread STATestClass, STATestMethod, UITestMethod Controllo di esecuzione
Parallelizzazione Parallelize, DoNotParallelize Controllo di esecuzione
Timeout/Ripetizione tentativi Timeout, Retry Controllo di esecuzione
Conditional Ignore, OSCondition, CICondition Controllo di esecuzione
Metadati TestCategory, TestProperty, OwnerPriority Organizzazione di test
Tracciamento del lavoro WorkItem, GitHubWorkItem Organizzazione di test

Asserzioni

Usare le classi Assert dello spazio dei nomi Microsoft.VisualStudio.TestTools.UnitTesting per verificare funzionalità specifiche. Un metodo di test esegue l'esercizio del codice nell'applicazione, ma segnala la correttezza solo quando si includono istruzioni Assert.

Le asserzioni MSTest sono suddivise in:

Test dei membri privati

È possibile testare i membri privati utilizzando classi wrapper di reflection:

Suggerimento

Valutare se i metodi privati necessitano di test diretti. Spesso, i test tramite interfacce pubbliche offrono una copertura migliore e test più gestibili.

Vedere anche