Condividi tramite


Procedura: creare uno unit test basato sui dati

Utilizzando il framework dei test d'unità Microsoft per il codice gestito, è possibile impostare un metodo nel test per recuperare i valori utilizzati da esso provenienti da una sorgente dati.Il metodo viene eseguito in successione per ogni riga della sorgente dati, che semplifica il verificare di vari input tramite l'uso di un singolo metodo.

Di seguito sono elencate le diverse sezioni di questo argomento:

Creare un test d'unità basato sui dati include i passaggi seguenti:

  1. Creare una sorgente dati che contiene i valori utilizzati nel metodo di test.L'origine dei dati può essere di qualsiasi tipo che viene registrato nel computer che esegue il test.

  2. Aggiungere un campo privato TestContext e una proprietà pubblica TestContext alla classe di test.

  3. Creare un metodo di unit test con un attributo DataSourceAttribute.

  4. Utilizzare la proprietà dell'indicizzatore DataRow per recuperare i valori utilizzati in un test.

Il metodo sottoposto a test

Ad esempio, si presupponga di aver creato:

  1. Una soluzione denominata MyBank che accetta ed elabora le transazioni per diversi tipi di account.

  2. Un progetto in MyBank ha chiamato BankDb che gestisce le transazioni per gli account.

  3. La classe ha chiamato Maths nel progetto DbBank che esegue funzioni matematiche per assicurare che qualsiasi transazione sia vantaggiosa per la banca.

  4. Un progetto di unit test ha chiamato BankDbTests per verificare il comportamento del componente BankDb.

  5. Una classe di unit test ha chiamato MathsTests per verificare il comportamento della classe Maths.

Verificheremo un metodo in Maths che aggiunge due interi utilizzando un ciclo:

public int AddIntegers(int first, int second)
{
    int sum = first;
    for( int i = 0; i < second; i++)
    {
        sum += 1;
    }
    return sum;
}

Creazione di un'origine dati

Per testare il metodo AddIntegers, viene creata un'origine dati che specifica un intervallo di valori per i parametri e la somma che si prevede venga restituita.Nell'esempio, viene creato un Sql Compact database denominato MathsData ed una tabella denominata AddIntegersData che contenente i nomi di colonna ed i valori

FirstNumber

SecondNumber

Somma

0

1

1

1

1

2

2

-3

-1

Aggiunta di un TestContext alla classe di test

Il framework di unit test crea un oggetto TestContext per archiviare le informazioni di un'origine dati per un test basato su dati.Il framework quindi imposta l'oggetto come valore della proprietà TestContext che crea.

    private TestContext testContextInstance;
    public TestContext TestContext
    {
        get { return testContextInstance; }
        set { testContextInstance = value; }
    }

Nel metodo di test, è possibile accedere ai dati tramite la proprietà dell'indicizzatore DataRow del TestContext.

Scrittura di un metodo di test

Il metodo di test per AddIntegers è abbastanza semplice.Per ogni riga della sorgente dati, verrà chiamato AddIntegers con i valori della colonna FirstNumber e SecondNumber come parametri e verificato il valore restituito confrontandolo con il valore della colonna Sum :


    [DataSource(@"Provider=Microsoft.SqlServerCe.Client.4.0; Data Source=C:\Data\MathsData.sdf;", "Numbers")]
    [TestMethod()]
    public void AddIntegers_FromDataSourceTest()
    {
        var target = new Maths();
        
        // Access the data
        int x = Convert.ToInt32(TestContext.DataRow["FirstNumber"]);
        int y = Convert.ToInt32(TestContext.DataRow["SecondNumber"]); 
        int expected = Convert.ToInt32(TestContext.DataRow["Sum"]);
        int actual = target.IntegerMethod(x, y);
        Assert.AreEqual(expected, actual,
            "x:<{0}> y:<{1}>",
            new object[] {x, y});

    }

Si noti che il metodo Assert include un messaggio che visualizza i valori x ed y di un'iterazione non riuscita.Per impostazione predefinita, i valori asseriti, expected e actual, sono già inclusi nei dettagli di un test non superato.

ms182527.collapse_all(it-it,VS.110).gifSpecificare il DataSourceAttribute

L'attributo DataSource specifica la stringa di connessione per l'origine dati ed il nome della tabella utilizzato nel metodo di test.Le informazioni esatte nella stringa di connessione possono variare a seconda del tipo di origine dati utilizzato.In questo esempio, si utilizza un database di SqlServerCe.

    [DataSource(@"Provider=Microsoft.SqlServerCe.Client.4.0;Data Source=C:\Data\MathsData.sdf", "AddIntegersData")]

L'attributo DataSource dispone di tre costruttori.

[DataSource(dataSourceSettingName)]

Un costruttore con un parametro utilizza le informazioni di connessione archiviate nel file app.config per la soluzione.Il nome dell'elemento XML nel file di configurazione che specifica le informazioni di connessione è dataSourceSettingsName.

L'utilizzo di un file app.config permette di cambiare il percorso della sorgente dati senza necessità di modificare il test d'unità stesso.Per informazioni su come creare e utilizzare un file app.config, vedere Procedura dettagliata: utilizzo di un file di configurazione per definire un'origine dati.

[DataSource(connectionString, tableName)]

Il costruttore DataSource con due parametri specifica la stringa di connessione per l'origine dati ed il nome della tabella contenente i dati per il metodo di test.

Le stringhe di connessione dipendono dal tipo del tipo di origine dati, ma deve contenere un elemento del provider che specifica il nome invariabile del provider di dati.

[DataSource(
    dataProvider, 
    connectionString, 
    tableName,
    dataAccessMethod
    )]

ms182527.collapse_all(it-it,VS.110).gifUtilizzare TestContext.DataRow per accedere ai dati

Per accedere ai dati nella tabella AddIntegersData, utilizzare l'indicizzatore TestContext.DataRow.DataRow è un oggetto DataRow, pertanto si recupereranno i valori della colonna tramite indice o tramite i nomi di colonna.Poiché i valori vengono restituiti come oggetti, è necessario convertirli nel tipo appropriato:

int x = Convert.ToInt32(TestContext.DataRow["FirstNumber"]);

Esecuzione del test e visualizzazione dei risultati

Dopo avere completato di scrivere un metodo di test, compilare il progetto di test.Il metodo di test verrà visualizzato nella finestra di esplorazione del test nel gruppo Test non eseguiti.Quando si esegue, si scrive e si riesegue i test, Esplora test mostra i risultati nei gruppi Test non superati, Test superati e Test non eseguiti.È possibile scegliere Esegui tutto per eseguire tutti i test, oppure scegliere Esegui… per selezionare un sottoinsieme dei test da eseguire.

La barra dei risultati del test all'inizio di Esplora test viene animata quando il test viene eseguito.Alla fine dell'esecuzione dei test, la barra sarà verde se i test vengono superati o rossa se i test hanno avuto esito negativo.Un riepilogo dell'esecuzione dei test viene visualizzato nel riquadro dei dettagli nella parte inferiore della finestra di Esplora test.Selezionare un test per visualizzare i dettagli del test nel riquadro inferiore.

Se si esegue il metodo AddIntegers_FromDataSourceTest nell'esempio, la barra dei risultati diventa rossa ed il metodo di test viene spostato in Test non superati. Un test basato su dati fallisce se qualche metodo iterato dalla sorgente dati fallisce.Quando si sceglie un test, basato sui dati, non superato nella finestra di esplorazione del test, il riquadro dei dettagli contiene i risultati di ogni iterazione identificata dall'indice della riga di dati.Nell'esempio, sembra che l'algoritmo AddIntegers non gestisca i valori negativi correttamente.

Quando il metodo sottoposto a test è stato corretto ed eseguito nuovamente, la barra dei risultati diventerà verde ed il metodo di test verrà spostato nel gruppo Test superati.

Vedere anche

Riferimenti

Microsoft.VisualStudio.TestTools.UnitTesting.DataSourceAttribute

Microsoft.VisualStudio.TestTools.UnitTesting.TestContext

TestContext.DataRow

Microsoft.VisualStudio.TestTools.UnitTesting.Assert

Concetti

Verifica del codice tramite unit test

Scrittura di unit test per .NET Framework con il framework unit test di Microsoft per codice gestito

Altre risorse

Procedura: creare ed eseguire uno unit test

Esecuzione di unit test con Esplora test