Condividi tramite


Struttura di unit test

Aggiornamento: novembre 2007

Uno unit test è un metodo membro di una classe scritta in C#, Visual Basic o Visual C++.

Nota:

Per dettagli sulle modalità di utilizzo degli unit test con il codice di produzione C++ e degli unit test scritti in C++, vedere Unit test e C++.

Per consentire a Strumenti di test Team System di riconoscere uno unit test, il file del codice sorgente deve risiedere in un progetto di test che a sua volta fa parte di una soluzione Visual Studio. Quando viene generato questo progetto, o l'intera soluzione, il progetto del test viene generato all'interno di un assembly che contiene lo unit test eseguibile.

Tutti i metodi di unit test sono contrassegnati con l'attributo [TestMethod()], <TestMethod()> in Visual Basic, e sono membri della classe [TestClass()]. A sua volta, questa classe è definita nello spazio dei nomi Microsoft.VisualStudio.TestTools.UnitTesting. Quando si genera uno unit test, questo spazio dei nomi viene incluso all'inizio del file generato, in un'istruzione using o Imports.

Attributi e proprietà di unit test

Oltre all'attributo [TestMethod()] del metodo dello unit test e all'attributo [TestClass()] della classe che lo contiene, vengono utilizzati altri attributi per abilitare le funzioni specifiche dello unit test. I principali tra tali attributi sono [TestInitialize()] e [TestCleanup()]. Utilizzare un metodo contrassegnato con [TestInitialize()] per preparare gli aspetti dell'ambiente in cui lo unit test sarà eseguito; lo scopo di questa operazione è di creare uno stato noto per l'esecuzione dello unit test. Ad esempio, è possibile utilizzare un metodo [TestInitialize()] per copiare, modificare o creare determinati file di dati che saranno utilizzati dal test.

Utilizzare un metodo contrassegnato con [TestCleanup()] per ripristinare uno stato noto per l'ambiente dopo l'esecuzione di un test; a tale scopo, può essere necessario eliminare i file nelle cartelle o ripristinare lo stato noto di un database. Un esempio è la reimpostazione dello stato iniziale di un database di magazzino dopo aver eseguito il test di un metodo utilizzato in un'applicazione per le voci di ordini. Inoltre, si consiglia di utilizzare un codice di pulitura in un metodo [TestCleanup()] o ClassCleanup e non in un metodo finalizzatore. Le eccezioni generate da un metodo finalizzatore non vengono rilevate e possono causare risultati imprevisti.

Una proprietà importante sulle classi di test è la proprietà TestContext. Questa proprietà contiene informazioni quali il nome dello unit test correntemente in esecuzione, la directory di distribuzione, i nomi dei file di log e, per il test basato sui dati, il database a cui si è collegati. La proprietà TestContext restituisce un'istanza TestContext. Per ulteriori informazioni, vedere Utilizzo della classe TestContext.

Esempio di unit test

Nel seguente frammento di codice viene mostrato un semplice unit test scritto in C#.

[TestMethod()]
public void DebitTest()
{
    string customerName = "Mr. Bryan Walton"; 
    double balance = 11.99; 
    BankAccount target = new BankAccount(customerName, balance);
    double amount = 11.22; 
    target.Debit(amount);
    Assert.AreEqual((System.Convert.ToDouble(0.77)), target.Balance, 0.05); // 0.05 is tolerance for floating-point comparison
    //Assert.Inconclusive("A method that does not return a value cannot be verified.");
}

Per un altro esempio, vedere Codifica di unit test basati sui dati.

Risultati di unit test

Sono disponibili tre modi per verificare se uno unit test ha avuto esito positivo:

  • Utilizzare una o più istruzioni Assert per convalidare determinati risultati. Per ulteriori informazioni, vedere Utilizzo di istruzioni Assert.

  • Verificare che non siano state generate eccezioni. Si consiglia di utilizzare una o più istruzioni Assert.

  • Verificare che sia stata generata una determinata eccezione. A tale scopo, utilizzare l'attributo ExpectedExceptionAttribute.

Utilizzo di istruzioni Assert

Se il risultato positivo o negativo del test è più importante delle azioni che il test può completare, utilizzare una o più istruzioni Assert nel codice del test.

Per il modulo del test tutti gli unit test iniziano in uno stato di test superato. Lo stato del test non viene modificato finché l'istruzione Assert produce un risultato contrario allo stato di test superato, modificandolo da test superato a non superato e Inconclusive oppure finché viene generata un'eccezione non specificata nell'attributo ExpectedExceptionAttribute. In altre parole, uno unit test senza un'istruzione Assert produrrà un risultato Pass ogni volta che viene eseguito. Non è necessariamente un test inutile in quanto consente di verificare il funzionamento del codice per assicurarsi che venga eseguito senza generare un'eccezione. Il codice eseguito per prova in uno unit test sarà riportato come completato nelle statistiche del completamento del codice indipendentemente dal risultato del test o dall'inclusione o esclusione del test nell'istruzione.

Tuttavia, per verificare se una determinata azione verrà eseguita o se un determinato stato sarà raggiunto, è necessario utilizzare le istruzioni Assert. Nello spazio dei nomi Microsoft.VisualStudio.TestTools.UnitTesting sono disponibili numerose istruzioni Assert. Le istruzioni Assert forniscono una certa flessibilità; ad esempio, è possibile forzare l'esito negativo di un test utilizzando l'istruzione Assert.Fail(). Oltre a queste istruzioni Assert, è possibile, naturalmente, creare funzioni personalizzate, ad esempio utilizzando le istruzioni Assert nei blocchi if.

Indipendentemente dai risultati restituiti dal test, l'esito dipende dalle istruzioni Assert del test. Se un test contiene numerose istruzioni Assert, lo stato del test sarà superato finché viene rilevata un'istruzione Assert che modifica lo stato in non superato o Inconclusive.

Per ulteriori informazioni, vedere Utilizzo di classi Assert.

Vedere anche

Riferimenti

Microsoft.VisualStudio.TestTools.UnitTesting

Altre risorse

Creazione di unit test