2010-10-27 16 views
11

In MSTest si può fare qualcosa di simile:Test basati sui dati in NUnit?

[TestMethod] 
[DataSource("Microsoft.VisualStudio.TestTools.DataSource.CSV", 
      "testdata.csv", "testdata#csv", DataAccessMethod.Sequential)] 
public void TestSomething() 
{ 
    double column1 = Convert.ToDouble(TestContext.DataRow["column1"]); 
    ... 
    Assert.AreEqual(...); 
} 

Qual è il codice equivalente in NUnit 2.5?

risposta

7

Vorrei vedere lo parameterized tests documentation in NUnit 2.5 e vedere se riesci a fare qualcosa di simile a quello che stai facendo lì. Non ricordo che NUnit abbia un attributo di lettura CSV incorporato per guidare test parametrizzati. Tuttavia, potrebbe esserci un plug-in di comunità.

Vorrei anche sottolineare che se stai cercando solo librerie di framework Unit non MS per aiutarti, xUnit.net ha questa funzionalità. Date un'occhiata a questo blog post from Ben Hall

+0

Grazie - ho fatto qualche scavo. Nessun plugin di questo tipo esiste. Forse lo farò da solo. Il motivo principale per cui ho chiesto NUnit è perché è l'unico framework di test utilizzato da me, tutto qui. – Nobody

+2

Prova xUnit una prova se renderà la tua vita di test più semplice a questo proposito. È molto simile a NUnit (James Newkirk ha sviluppato entrambi!) E può facilmente vivere accanto a NUnit fino a quando non capisci se vuoi completamente passare o meno.Non suggerirei di avere sia xUnit che NUnit come parte della soluzione in corso perché i corridori sono diversi e non credo che abbiano alcuna possibilità di eseguire gli altri test. –

-2

Penso che Nunit equivilent sia quello di contrassegnare un metodo come metodo di installazione e quindi caricare i dati in un campo da utilizzare nei test successivi.

Devi codificarlo da solo, più o meno.

12

ho ottenuto i dati CSV base di test condotti in NUnit lavorare come segue:

Utilizzare il csv reader from code project, avvolto in un metodo privato di ritorno IEnumerable nella classe di prova, quindi fare riferimento a questo con un attributo TestCaseSource sui vostri casi di test . Includere il file csv nel progetto e impostare "Copia nella directory di output" su "Copia sempre".

using System.Collections.Generic; 
using System.IO; 
using LumenWorks.Framework.IO.Csv; 
using NUnit.Framework; 

namespace mytests 
{ 
    class MegaTests 
    { 
     [Test, TestCaseSource("GetTestData")] 
     public void MyExample_Test(int data1, int data2, int expectedOutput) 
     { 
      var methodOutput = MethodUnderTest(data2, data1); 
      Assert.AreEqual(expectedOutput, methodOutput, string.Format("Method failed for data1: {0}, data2: {1}", data1, data2)); 
     } 

     private int MethodUnderTest(int data2, int data1) 
     { 
      return 42; //todo: real implementation 
     } 

     private IEnumerable<int[]> GetTestData() 
     { 
      using (var csv = new CsvReader(new StreamReader("test-data.csv"), true)) 
      { 
       while (csv.ReadNextRecord()) 
       { 
        int data1 = int.Parse(csv[0]); 
        int data2 = int.Parse(csv[1]); 
        int expectedOutput = int.Parse(csv[2]); 
        yield return new[] { data1, data2, expectedOutput }; 
       } 
      } 
     } 
    } 
} 

post originale in: http://timwise.blogspot.com/2011/05/data-driven-test-in-nunit-with-csv.html

3

Ecco un altro esempio molto simile a quella di Tim Abell, tuttavia, non si utilizza un quadro di riferimento per il lettore CSV e mostrando le specifiche del test. Nota quando usi il TestCaseAttribute il TestAttribute può essere omesso.

 [TestCaseSource("GetDataFromCSV")] 
    public void TestDataFromCSV(int num1,int num2,int num3) 
    { 
     Assert.AreEqual(num1 + num2 ,num3); 
    } 

    private IEnumerable<int[]> GetDataFromCSV() 
    { 
     CsvReader reader = new CsvReader(path); 
     while (reader.Next()) 
     { 
      int column1 = int.Parse(reader[0]); 
      int column2 = int.Parse(reader[1]); 
      int column3 = int.Parse(reader[2]); 
      yield return new int[] { column1, column2, column3 }; 
     } 
    } 


public class CsvReader : IDisposable 
{ 
    private string path; 
    private string[] currentData; 
    private StreamReader reader; 

    public CsvReader(string path) 
    { 
     if (!File.Exists(path)) throw new InvalidOperationException("path does not exist"); 
     this.path = path; 
     Initialize(); 
    } 

    private void Initialize() 
    { 
     FileStream stream = new FileStream(path, FileMode.Open, FileAccess.Read); 
     reader = new StreamReader(stream); 
    } 

    public bool Next() 
    { 
     string current = null; 
     if ((current = reader.ReadLine()) == null) return false; 
     currentData = current.Split(','); 
     return true; 
    } 

    public string this[int index] 
    { 
     get { return currentData[index]; } 
    } 


    public void Dispose() 
    { 
     reader.Close(); 
    } 
} 

dati CSV:

10.200.210 20.190.210 30.180.210 40.170.210 50.160.210 60.150.210 70.140.210 80.130.210 90.120.210 100.110.210

Nota: La 3a colonna è una somma delle prime due colonne e questo sarà affermato nel test unitario.

Risultati:

results

seguito troverete un'alternativa utilizzando oggetti TestCaseData e l'impostazione di un tipo di ritorno (che off-corso è obbligatoria)

 [TestCaseSource("GetDataFromCSV2")] 
    public int TestDataFromCSV2(int num1, int num2) 
    { 
     return num1 + num2; 
    } 

    private IEnumerable GetDataFromCSV2() 
    { 
     CsvReader reader = new CsvReader(path); 
     while (reader.Next()) 
     { 
      int column1 = int.Parse(reader[0]); 
      int column2 = int.Parse(reader[1]); 
      int column3 = int.Parse(reader[2]); 
      yield return new TestCaseData(column1, column2).Returns(column3); 
     } 
    } 
Problemi correlati