2010-10-27 13 views
11

En MSTest se puede hacer algo como:Pruebas basadas en datos en 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(...); 
} 

¿Cuál es el código equivalente en NUnit 2.5?

Respuesta

7

Me gustaría ver el parameterized tests documentation in NUnit 2.5 y ver si puede hacer algo como lo que está haciendo allí. No recuerdo que NUnit tenga un atributo de lectura CSV incorporado para controlar las pruebas parametrizadas. Sin embargo, puede haber un complemento de la comunidad en algún lugar.

Debo señalar también que si solo está buscando bibliotecas de marcos de pruebas de unidades que no sean de la MS para ayudarlo, xUnit.net sí tiene esta funcionalidad. Echa un vistazo a esto blog post from Ben Hall

+0

, gracias - He hecho algo de investigación. No existe tal complemento. Tal vez solo lo haga yo mismo. La razón principal por la que solicité NUnit fue porque es el único marco de prueba que he usado, eso es todo. – Nobody

+2

Pruebe xUnit si le facilitará las pruebas en este sentido. Es muy similar a NUnit (¡James Newkirk desarrolló ambos!) Y puede vivir fácilmente al lado de NUnit hasta que averigüe si quiere cambiar completamente o no.No recomendaría tener xUnit y NUnit como parte de su solución en curso porque los corredores son diferentes y no creo que tengan ninguna capacidad para ejecutar las pruebas de los demás. –

-2

Creo que el Nunit equivilent es marcar un método como método de configuración y luego cargar los datos en un campo que se utilizará en pruebas posteriores.

Tiene que codificarlo usted mismo, más o menos.

12

tengo datos basados ​​csv impulsadas prueba de NUnit Trabajo, a saber:

Uso del csv reader from code project, envuelto en un método privado de regresar IEnumerable en su clase de prueba, y luego hacer referencia a este con un atributo TestCaseSource en sus casos de prueba . Incluya su archivo csv en su proyecto y configure "Copiar al directorio de salida" a "Copiar siempre".

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 original en: http://timwise.blogspot.com/2011/05/data-driven-test-in-nunit-with-csv.html

3

Aquí es otro ejemplo muy similar a la de Tim Abell sin embargo no se utiliza un marco de referencia para el lector CSV y que muestra los detalles de la prueba. Tenga en cuenta que cuando use TestCaseAttribute, se puede omitir TestAttribute.

 [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(); 
    } 
} 

datos 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 tercera columna es la suma de las dos primeras columnas y esto se afirmará en la prueba unitaria.

Resultados:

results

encontrar más adelante una alternativa utilizando objetos TestCaseData y el establecimiento de un tipo de retorno (que fuera de curso es obligatorio)

 [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); 
     } 
    } 
Cuestiones relacionadas