2011-11-10 10 views
8

So che posso utilizzare i dati nei file per guidare il test dell'unità, ad esempio i dati all'interno di un file csv o xml.C'è un modo per utilizzare i dati che sono già in memoria per guidare i test unitari?

Ad esempio:

[TestMethod] 
[DataSource(
    "Microsoft.VisualStudio.TestTools.DataSource.CSV", 
    "Data.csv", 
    "Data#csv", 
    DataAccessMethod.Sequential)] 
public void TestData() {} 

Vorrei sapere se c'è un modo che, invece di utilizzare un file, posso utilizzare una struttura di dati che è già in memoria di guidare i test.

Qualcosa di simile:

// this structure has the data to use in the unit test 
var DataList = new List<string>(); 

[TestMethod] 
[DataSource(
    "Microsoft.VisualStudio.TestTools.DataSource.IEnumerable", 
    "DataList", 
    "DataList", 
    DataAccessMethod.Sequential)] 
public void TestData() {} 
+0

domanda simile [Come verificare la riga con MSTest?] (Http://stackoverflow.com/q/347535) –

risposta

1

Una soluzione semplice può essere questo ...

private void TestData(IEnumerable what) { ... your test method ... } 

[TestMethod] 
public void TestDataInMemory() { List<T> mylist = ...; this.TestData(mylist); } 

[TestMethod] 
[DataSource(
    "Microsoft.VisualStudio.TestTools.DataSource.CSV", 
    "Data.csv", 
    "Data#csv", 
    DataAccessMethod.Sequential)] 
public void TestData() { this.TestData(testContextInstance ...) } 

In questo modo è possibile utilizzare il metodo di prova sia con i dati caricati da file e con i dati caricati da memoria.

+0

Grazie per il suggerimento. Sfortunatamente, mi sembra che il test TestDataInMemory() verrà eseguito una sola volta per un numero qualsiasi di voci di dati, mentre il test TestData() verrà eseguito una volta per ogni voce. Per il mio scopo preferirei eseguire un test per ogni voce. –

1

Non penso che sia possibile farlo con l'attributo [DataSource], ma è possibile eseguire manualmente più o meno la stessa cosa.

Caricare i dati in un metodo decorato con [AssemblyInitialize] o [ClassInitialize]. Quindi riscrivi i test per eseguire il loop dei dati. Sfortunatamente in questo modo finirai con un singolo test invece di risultati separati per ogni esecuzione di test.

+0

Sì, i dati erano già stati impostati nella funzione [ClassInitialize] e ho provato ciò che mi hai suggerito. Funziona, ma un singolo test per tutti i dati indica che gli Assert interromperanno la funzione al primo test fallito. Non proprio quello che stavo cercando. Grazie per il suggerimento. –

3

Se è in memoria, la mia preferenza sarebbe quella di non utilizzare DataSource, ma utilizzare un modello T4 per generare automaticamente i test di unità. In questo modo, si scriverà il test solo una volta, ma nei risultati dell'esecuzione del test verrà visualizzata una voce per ciascun input testato. Aggiungi questo file .tt al tuo progetto di test.

<#@ template debug="false" hostspecific="true" language="C#v3.5" #> 
<#@ assembly name="System.Core.dll" #> 
<#@ assembly name="System.Data.dll" #> 
<#@ import namespace="System.Collections.Generic" #> 
<#@ import namespace="System.Linq" #> 
<#@ output extension=".cs" #> 
<# 
     List<string> DataList = AccessInMemoryData(); 
#> 
using System; 
using System.Text; 
using System.Collections.Generic; 
using System.Linq; 
using Microsoft.VisualStudio.TestTools.UnitTesting; 

namespace TestProject1 
{ 
[TestClass] 
public class UnitTest1 
{ 
    <# foreach (string currentTestString in DataList) { #> 
    [TestMethod] 
    public void TestingString_<#= currentTestString #> 
    { 
    string currentTestString = "<#= currentTestString #>"; 
    // TODO: Put your standard test code here which will use the string you created above 
    } 
    <# } #> 
} 
} 
+0

Questa è una buona idea. –

+0

Seriamente ami questo tipo di approccio! –

0

Penso che Gallio Ambience avrebbe dovuto risolvere questo problema. Non sono sicuro di quale sia lo stato del progetto, al momento.

1

I answered a similar question e la soluzione che ho usato prima è di generare un semplice file CSV dai miei dati in memoria.

Problemi correlati