Condividi tramite


Asserzioni MSTest

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

Informazioni generali

MSTest offre tre classi di asserzione:

Class Scopo
Assert Asserzioni per utilizzo generico per valori, tipi ed eccezioni.
StringAssert Asserzioni specifiche della stringa per modelli, sottostringhe e confronti.
CollectionAssert Asserzioni di raccolta per il confronto e la convalida delle raccolte.

Suggerimento

Quando la funzionalità esiste sia in AssertStringAssert/ che in CollectionAssert, preferire la classe Assert. La Assert classe offre una migliore individuabilità ed è la scelta consigliata per il nuovo codice. StringAssert e CollectionAssert vengono mantenuti per la compatibilità con le versioni precedenti.

Tutti i metodi di asserzione accettano un parametro di messaggio facoltativo che viene visualizzato quando l'asserzione ha esito negativo, consentendo di identificare la causa:

Assert.AreEqual(expected, actual, "Values should match after processing");

Classe Assert

Usare la classe Assert per verificare che il codice sottoposto a test si comporti come previsto.

Metodi di asserzione comuni

[TestMethod]
public async Task AssertExamples()
{
    // Equality
    Assert.AreEqual(5, calculator.Add(2, 3));
    Assert.AreNotEqual(0, result);

    // Reference equality
    Assert.AreSame(expected, actual);
    Assert.AreNotSame(obj1, obj2);

    // Boolean conditions
    Assert.IsTrue(result > 0);
    Assert.IsFalse(string.IsNullOrEmpty(name));

    // Null checks
    Assert.IsNull(optionalValue);
    Assert.IsNotNull(requiredValue);

    // Type checks
    Assert.IsInstanceOfType<IDisposable>(obj);
    Assert.IsNotInstanceOfType<string>(obj);

    // Exception testing (MSTest v3.8+)
    Assert.ThrowsExactly<ArgumentNullException>(() => service.Process(null!));
    await Assert.ThrowsExactlyAsync<InvalidOperationException>(
        async () => await service.ProcessAsync());
}

API disponibili

Classe StringAssert

Usare la classe StringAssert per confrontare ed esaminare le stringhe.

Annotazioni

Tutti i StringAssert metodi hanno equivalenti nella Assert classe . Preferire i metodi Assert per una migliore individuabilità. La StringAssert classe viene mantenuta per la compatibilità con le versioni precedenti.

Le API disponibili sono:

Classe CollectionAssert

Usare la classe CollectionAssert per confrontare raccolte di oggetti o verificare lo stato di una raccolta.

Annotazioni

Quando esiste un metodo equivalente nella Assert classe (ad esempio Assert.Contains, Assert.DoesNotContain), preferire l'uso Assert per una migliore individuabilità. La CollectionAssert classe viene mantenuta principalmente per la compatibilità con le versioni precedenti.

Le API disponibili sono:

Procedure consigliate

  1. Usare asserzioni specifiche: preferire AreEqualIsTrue(a == b) per messaggi di errore migliori.

  2. Includere messaggi descrittivi: consente di identificare rapidamente gli errori con messaggi di asserzione chiari.

  3. Testare una cosa alla volta: ogni metodo di test deve verificare un singolo comportamento.

  4. Utilizzare Throws/ThrowsExactly per le eccezioni: in MSTest v3.8+, preferire Assert.Throws, Assert.ThrowsExactlye le relative controparti asincrone (ThrowsAsync, ThrowsExactlyAsync) sull'attributo ExpectedException .

  5. Preferire a : quando la funzionalità esiste in entrambe le classi, usare la classe per una migliore individuabilità e coerenza.

Gli analizzatori seguenti consentono di garantire un uso appropriato delle asserzioni:

  • MSTEST0006 - evitare ExpectedException l'attributo, usare i metodi Assert.Throws invece.
  • MSTEST0017 : gli argomenti di asserzione devono essere passati nell'ordine corretto.
  • MSTEST0023 : non negare le asserzioni booleane.
  • MSTEST0025 - Preferire Assert.Fail anziché condizioni sempre false.
  • MSTEST0026 : gli argomenti di asserzione devono evitare l'accesso condizionale.
  • MSTEST0032 - Esaminare le condizioni di asserzione sempre vere.
  • MSTEST0037 : usare metodi di asserzione appropriati.
  • MSTEST0038 : evitare Assert.AreSame con i tipi valore.
  • MSTEST0039 : usare metodi più recenti Assert.Throws .
  • MSTEST0040 : evitare di usare asserzioni nel contesto async void.
  • MSTEST0046 : usare Assert anziché StringAssert.
  • - Assert.Throws MSTEST0051 deve contenere una singola istruzione.
  • MSTEST0053 : evitare Assert parametri di formato.
  • MSTEST0058 : evitare asserzioni nei blocchi catch.

Vedere anche