2011-11-10 12 views
8

Sé que puedo usar datos en archivos para conducir la prueba unitaria, por ejemplo, datos dentro de un archivo csv o xml.¿Hay alguna forma de utilizar datos que ya están en la memoria para realizar pruebas unitarias?

Por ejemplo:

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

me gustaría saber si hay una manera que, en lugar de utilizar un archivo, puedo usar una estructura de datos que ya está en la memoria para conducir las pruebas.

Algo así como:

// 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

pregunta similar [¿Cómo RowTest con MSTest?] (Http://stackoverflow.com/q/347535) –

Respuesta

1

Una solución sencilla puede ser esto ...

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 ...) } 

De esta manera se puede utilizar el método de ensayo, en presencia datos cargados desde el archivo y con los datos cargados desde memoria.

+0

Gracias por su sugerencia. Desafortunadamente, me parece que la prueba TestDataInMemory() se ejecutará una sola vez para cualquier cantidad de entradas de datos, mientras que la prueba TestData() se ejecutará una vez por cada entrada. Para mi propósito, prefiero realizar una prueba por entrada. –

1

No creo que pueda hacer eso con el atributo [DataSource], pero puede hacer más o menos lo mismo manualmente.

Cargue sus datos en un método decorado con [AssemblyInitialize] o [ClassInitialize]. Luego, reescribe tus pruebas para recorrer los datos. Desafortunadamente, de esta manera terminará con una sola prueba en lugar de resultados separados por ejecución de prueba.

+0

Sí, los datos ya estaban siendo configurados en la función [ClassInitialize], y probé lo que sugirió. Funciona, pero una sola prueba para todos los datos significa que Asserts detendrá la función en la primera prueba fallida. No es realmente lo que estaba buscando. Gracias por la sugerencia. –

3

Si está en la memoria, mi preferencia sería no utilizar DataSource, pero use una plantilla T4 para generar automáticamente las pruebas de su unidad. De esta forma, solo escribirá la prueba una vez, pero en los resultados de la ejecución de prueba, verá una entrada para cada una de las entradas que haya probado. Agregue este archivo .tt a su proyecto de prueba.

<#@ 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

Esa es una buena idea. –

+0

¡En serio amo a este hombre de enfoque! –

0

Creo que Gallio Ambience se suponía que iba a resolver este problema. No estoy seguro de cuál es el estado del proyecto, actualmente.

1

I answered a similar question y la solución que he utilizado antes es generar un archivo CSV simple de mi en datos de memoria.

Cuestiones relacionadas