test di data-driven in NUnit?
-
26-09-2019 - |
Domanda
In MSTest si può fare qualcosa di simile:
[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?
Soluzione
Vorrei guardare la documentazione parametrizzato test in NUnit 2.5 vedere se si può fare qualcosa di simile a quello che stai facendo lì. Non ricordo NUnit avente un attributo incorporato CSV leggere per guidare test parametrizzati. Ci può essere un plug-in comunità da qualche parte però.
Vorrei anche sottolineare che se si sta solo in cerca di non-MS Unit Testing librerie quadro per aiutarvi fuori, xUnit.net ha questa funzionalità. Dai un'occhiata a questo post da Ben Hall
Altri suggerimenti
mi sono dati CSV basato test guidato in NUnit lavorare come segue:
Utilizza la csv lettore dal progetto di codice , avvolto in un metodo privato di ritorno IEnumerable nel test di classe, e quindi fare riferimento questo con un attributo TestCaseSource sui vostri casi di test. Includere il file CSV nel progetto e insieme " Copia in uscita Directory " a " 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-con-csv.html
Ecco un altro esempio molto simile a Tim Abell sta tuttavia non si utilizza un quadro di riferimento per il lettore CSV e mostrando le specifiche del test. Nota quando si utilizza 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();
}
}
CSV dei dati:
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 di unità
Risultati:
trova sotto alternativa utilizzando oggetti TestCaseData e impostando un tipo di ritorno (che off-corso è obbligatorio)
[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);
}
}
MS test fornisce un meccanismo per avere i vostri dati di prova provenienti da fonti diverse. Tuttavia questo non è disponibile out of the box da NUnit.
Sono a favore di utilizzare la separazione dei dati e il codice per i test che sono di una certa dimensione considerevole. Quando mi separo entrambi, la mia aspettativa è 1. La leggibilità dei dati di test 2. I dati dei test dovrebbe essere facile da modificare 3. I test di unità dovrebbe funzionare in modo confortevole in un ambiente locale e costruzione
Il JsonSectionReader seguito ha tutte le caratteristiche che vorrei avere. Lo strumento è in grado di leggere le sezioni di dati da file JSON embedded. Fornisce inoltre un meccanismo molto comodo per deserializzare.
https://www.nuget.org/packages/WonderTools.JsonSectionReader/
P.S. Sono il manutentore di questo progetto, e questo progetto è stato creato perché non ho trovato nessun altro strumento che risolve questo problema nella misura che volevo.
Credo l'equivilent Nunit è per contrassegnare un metodo come un metodo di configurazione e quindi caricare i dati in un campo da utilizzare nelle prove successive.
È necessario il codice da soli, più o meno.