visual unit studio nunit mstest testcase rowtest

studio - ¿MSTest tiene un equivalente al TestCase de NUnit?



nunit vs visual studio unit testing (5)

Encuentro la función TestCase en NUnit bastante útil como una manera rápida de especificar parámetros de prueba sin necesidad de un método separado para cada prueba. ¿Hay algo similar en MSTest?

[TestFixture] public class StringFormatUtilsTest { [TestCase("tttt", "")] [TestCase("", "")] [TestCase("t3a4b5", "345")] [TestCase("3&5*", "35")] [TestCase("123", "123")] public void StripNonNumeric(string before, string expected) { string actual = FormatUtils.StripNonNumeric(before); Assert.AreEqual(expected, actual); } }


Khlr dio una buena explicación detallada y aparentemente este enfoque comenzó a funcionar en VS2015 Express for Desktop. Traté de dejar el comentario, pero mi falta de reputación no me permitió hacerlo.

Déjame copiar la solución aquí:

[TestClass] public class StringFormatUtilsTest { [TestMethod] [DataRow("tttt", "")] [DataRow("", "")] [DataRow("t3a4b5", "345")] [DataRow("3&5*", "35")] [DataRow("123", "123")] public void StripNonNumeric(string before, string expected) { string actual = FormatUtils.StripNonNumeric(before); Assert.AreEqual(expected, actual); } }

Para usarlo, simplemente instale los paquetes MSTest.TestFramework y MSTest.TestAdapter .

Un problema es

Error CS0433 El tipo ''TestClassAttribute'' existe en ''Microsoft.VisualStudio.QualityTools.UnitTestFramework, Version = 10.0.0.0 y'' Microsoft.VisualStudio.TestPlatform.TestFramework, Version = 14.0.0.0

Por lo tanto, elimine Microsoft.VisualStudio.QualityTools.UnitTestFramework de las referencias del proyecto.

Eres muy bienvenido para editar la respuesta original y eliminar esta.


MSTest tiene el atributo DataSource, que le permitirá alimentarlo con una tabla de base de datos, csv, xml, etc. Lo he usado y funciona bien. No conozco una manera de poner los datos directamente arriba como atributos como en su pregunta, pero es muy fácil configurar las fuentes de datos externas y los archivos se pueden incluir en el proyecto. Lo tenía funcionando a una hora de cuando comencé, y no soy un experto en pruebas automatizadas.

https://msdn.microsoft.com/en-us/library/ms182527.aspx?f=255&MSPPError=-2147217396 tiene un tutorial completo basado en la entrada de la base de datos.

http://www.rhyous.com/2015/05/11/row-tests-or-paramerterized-tests-mstest-xml/ tiene un tutorial basado en la entrada de archivos XML.


Sé que esta es otra respuesta tardía, pero en mi equipo que está atrapado en el uso del marco de prueba MS, desarrollamos una técnica que se basa únicamente en los tipos anónimos 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 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 .


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

[TestClass] 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.

[TestMethod] [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 { [TestClass] 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 }; } } [TestMethod] [DataSource("Namespace.UnitTest1.Stuff")] public void TestMethod1() { var number = this.TestContext.GetRuntimeDataSourceObject<int>(); Assert.IsNotNull(number); } } }


Si no tiene que seguir con MSTest y solo lo está usando para poder ejecutar las pruebas a través de Test Explorer porque solo tienes una edición de Visual Studio Express , entonces esta podría ser una solución para ti:

Existe la extensión VsTestAdapter VSIX para poder ejecutar pruebas NUnit a través de Test Explorer. Desafortunadamente, los usuarios de VS Express no pueden instalar extensiones ... ¡Pero afortunadamente el VsTestAdapter viene con un simple Paquete NuGet también!

Entonces, si usted es un usuario de VS Express, simplemente instale el VsTestAdapter NuGet-Package y disfrute ejecutando sus pruebas / testcases de NUnit a través de Test Explorer.

Lamentablemente, la declaración antes mencionada no es cierta. Si bien es perfectamente posible instalar el paquete a través de una edición Express, es inútil, ya que no puede utilizar Test Explorer. Anteriormente había una nota al margen en una versión anterior del TestAdapter, que se eliminó de la página de descripción de 2.0.0 :

Tenga en cuenta que no funciona con VS Express

Actualizar:

Microsoft anunció recientemente "MSTest V2" (ver blog-artículo ). Esto le permite a usted (desktop, UWP, ...) usar el DataRow -attribute de manera consistente.

[TestClass] public class StringFormatUtilsTest { [TestMethod] [DataRow("tttt", "")] [DataRow("", "")] [DataRow("t3a4b5", "345")] [DataRow("3&amp;amp;5*", "35")] [DataRow("123", "123")] public void StripNonNumeric(string before, string expected) { string actual = FormatUtils.StripNonNumeric(before); Assert.AreEqual(expected, actual); } }

Una vez más, el Explorador de pruebas de Visual Studio Express desafortunadamente no reconoce estas pruebas. ¡Pero al menos las versiones VS "completas" ahora admiten esa característica!

Para usarlo, simplemente instale los paquetes MSTest.TestFramework y MSTest.TestAdapter (ambos prelanzamientos a partir de ahora).