unit test ejemplo unit-testing mstest rowtest datadriven

unit testing - ejemplo - ¿Cómo hacer RowTest con MSTest?



unit test c# (6)

Sé que MSTest no es compatible con RowTest y pruebas similares.

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

He visto las características de prueba de DataDriven , pero suena demasiado, ¿hay algún parche o herramienta de terceros que me permita hacer pruebas similares a MSTest en MSTest ?


En mi equipo que está bloqueado en el uso del marco de prueba MS, desarrollamos una técnica que se basa únicamente en los tipos anónimos para mantener 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 tienes un método de extensión como este:

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

Puede usar una matriz de tipos anónimos combinados con LINQ para 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 utilizar un mensaje formateado que incluya 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 .


He resuelto este problema generando un 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.
Luego, subclase una clase con el número requerido de filas en su código de prueba e implemente 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


Hemos agregado soporte para DataRow en VS2012 Update1. Vea este blog para una introducción breif

Editar: desea resaltar que esta función está actualmente limitada a las aplicaciones de la tienda de Windows.


Sé que esta es una respuesta tardía pero espero que ayude a otros.

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 devuelva 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) Agregue el atributo MSTest DataSource a su método de prueba, señalando el nombre de IEnumerable arriba. 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 al igual que el DataSource normal :)

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



[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 }