2008-12-07 9 views
41

Sé que MSTest no es compatible con RowTest y pruebas similares.¿Cómo hacer RowTest con MSTest?

¿Qué MSTests usuarios hacen? ¿Cómo es posible vivir sin el soporte RowTest?

He visto DataDriven características de prueba pero suena como demasiado por encima, ¿hay algún parche o herramienta de terceros que me permita hacer RowTest pruebas similares en MSTest? solución

+1

Lamentablemente, DaTest parece funcionar solo con VS2008. –

+1

http://code.google.com/p/datest/wiki/DaTest –

+0

Posible duplicado de [¿Cómo ejecutar un método de prueba con múltiples parámetros en MSTest?] (Http://stackoverflow.com/questions/9021881/how -to-run-a-test-method-with-multiple-parameters-in-mstest) – Rob

Respuesta

35
[TestMethod] 
Test1Row1 
{ 
    Test1(1,4,5); 
} 

[TestMethod] 
Test1Row2 
{ 
    Test1(1,7,8); 
} 

private Test1(int i, int j, int k) 
{ 
    //all code and assertions in here 
} 
+2

Este es el método que he usado, y también le permite dar a cada "fila" un nombre separado, y con suerte descriptivo. – Mel

4

Hemos añadido soporte para DataRow en VS2012 Update1. See this blog for a breif introduction

Editar: Desea destacar que esta función se encuentra actualmente limitada a las aplicaciones de la tienda de Windows.

+7

¿por qué está limitado a las aplicaciones de la tienda de Windows? ¿Estará disponible para proyectos de prueba regulares en el corto plazo? – DevDave

+1

xUnit ha tenido esto por tanto tiempo. Este es un escenario tan común, ¿por qué solo debería habilitarse para las aplicaciones de la Tienda Windows? No tiene sentido. – CodeMonkeyKing

+0

@DevDave, aunque no sé de los planes de vnext, hay un adaptador disponible para proyectos legacy mstest que proporciona una funcionalidad similar. Consulte este blog para obtener más información: http://blogs.msdn.com/b/vstsqualitytools/archive/2009/09/04/extending-the-visual-studio-unit-test-type-part-2.aspx – allen

0

He resuelto este problema mediante la generación de código de clase de prueba con diferente número de métodos de prueba generados. Solo tiene que descargar 2 archivos e incluirlos en su proyecto.
Entonces subclase una clase con número requerido de filas en el código de prueba y aplicar 2 métodos abstractos:

[TestClass] 
public class Ha_ha_ha_Test: MsTestRows.Rows.TestRows_42<string> 
{ 
    public override void TestMethod(string dataRow, int rowNumber) 
    { 
     Console.WriteLine(dataRow); 
     Assert.IsFalse(dataRow.Contains("3")); 
    } 

    public override string GetNextDataRow(int rowNumber) 
    { 
     return "data" + rowNumber; 
    } 
} 

Más detalles:

https://github.com/dzhariy/mstest-rows

7

Sé que esto es una respuesta tardía pero con suerte, ayuda a los demás.

Busqué una solución elegante en todas partes y terminé escribiendo una. Lo usamos en más de 20 proyectos con miles de pruebas unitarias y cientos de miles de iteraciones. Nunca perdiste el ritmo.

https://github.com/Thwaitesy/MSTestHacks

1) instalar el paquete NuGet.

2) Heredar su clase de prueba de TestBase

public class UnitTest1 : TestBase 
{ } 

3) crear una propiedad, campo o método, que devuelve IEnumerable

public class UnitTest1 : TestBase 
{ 
    private IEnumerable<int> Stuff 
    { 
     get 
     { 
      //This could do anything, get a dynamic list from anywhere.... 
      return new List<int> { 1, 2, 3 }; 
     } 
    } 
} 

4) Añadir la MSTest Atributo de DataSource a su método de prueba, lo que indica el nombre de IEnumerable anterior. Esto necesita ser totalmente calificado.

[DataSource("Namespace.UnitTest1.Stuff")] 
public void TestMethod1() 
{ 
    var number = this.TestContext.GetRuntimeDataSourceObject<int>(); 

    Assert.IsNotNull(number); 
} 

Resultado Final: 3 iteraciones igual que el origen de datos normales :)

using Microsoft.VisualStudio.TestTools.UnitTesting; 
using MSTestHacks; 

namespace Namespace 
{ 
    public class UnitTest1 : TestBase 
    { 
     private IEnumerable<int> Stuff 
     { 
      get 
      { 
       //This could do anything, get a dynamic list from anywhere.... 
       return new List<int> { 1, 2, 3 }; 
      } 
     } 

     [DataSource("Namespace.UnitTest1.Stuff")] 
     public void TestMethod1() 
     { 
      var number = this.TestContext.GetRuntimeDataSourceObject<int>(); 

      Assert.IsNotNull(number); 
     } 
    } 
} 
+0

Muchas gracias, @Thwaitesy! Me has ahorrado mucho tiempo. – tsul

1

En mi equipo que está bloqueado en el marco usando MS prueba, hemos desarrollado una técnica que se basa sólo en Anónimo Tipos para contener una matriz de datos de prueba, y LINQ para recorrer y probar cada fila. No requiere clases o marcos adicionales, y tiende a ser bastante fácil de leer y entender. También es mucho más fácil de implementar que las pruebas basadas en datos que usan archivos externos o una base de datos conectada.

Por ejemplo, supongamos que tiene un método de extensión de esta manera:

public static class Extensions 
{ 
    /// <summary> 
    /// Get the Qtr with optional offset to add or subtract quarters 
    /// </summary> 
    public static int GetQuarterNumber(this DateTime parmDate, int offset = 0) 
    { 
     return (int)Math.Ceiling(parmDate.AddMonths(offset * 3).Month/3m); 
    } 
} 

usted podría utilizar y variedad de tipos anónimos se combinaron para LINQ a escribir pruebas como esta:

[TestMethod] 
public void MonthReturnsProperQuarterWithOffset() 
{ 
    // Arrange 
    var values = new[] { 
     new { inputDate = new DateTime(2013, 1, 1), offset = 1, expectedQuarter = 2}, 
     new { inputDate = new DateTime(2013, 1, 1), offset = -1, expectedQuarter = 4}, 
     new { inputDate = new DateTime(2013, 4, 1), offset = 1, expectedQuarter = 3}, 
     new { inputDate = new DateTime(2013, 4, 1), offset = -1, expectedQuarter = 1}, 
     new { inputDate = new DateTime(2013, 7, 1), offset = 1, expectedQuarter = 4}, 
     new { inputDate = new DateTime(2013, 7, 1), offset = -1, expectedQuarter = 2}, 
     new { inputDate = new DateTime(2013, 10, 1), offset = 1, expectedQuarter = 1}, 
     new { inputDate = new DateTime(2013, 10, 1), offset = -1, expectedQuarter = 3} 
     // Could add as many rows as you want, or extract to a private method that 
     // builds the array of data 
    }; 
    values.ToList().ForEach(val => 
    { 
     // Act 
     int actualQuarter = val.inputDate.GetQuarterNumber(val.offset); 
     // Assert 
     Assert.AreEqual(val.expectedQuarter, actualQuarter, 
      "Failed for inputDate={0}, offset={1} and expectedQuarter={2}.", val.inputDate, val.offset, val.expectedQuarter); 
     }); 
    } 
} 

Al utilizar Esta técnica es útil para utilizar un mensaje formateado que incluye los datos de entrada en el Assert para ayudarlo a identificar qué fila hace que falle la prueba.

He escrito sobre esta solución con más antecedentes y detalles en AgileCoder.net.

Cuestiones relacionadas