c# - dinamicos - Pruebas basadas en datos generadas en ClassInitialize: ya no funcionan en Visual Studio 2012
crear objetos en c# (1)
MSTestHacks podría ayudar.
Permite que un IEnumberable
en su clase de prueba se use como DataSource
para su TestMethod
.
Desde el sitio web:
Runtime DataSource
DEBES heredar tu clase de prueba de TestBase
[TestClass]
public class UnitTest1 : TestBase
{ }
Crear una propiedad, campo o método que devuelva un valor IEnumerable
[TestClass]
public class UnitTest1 : TestBase
{
private IEnumerable<int> Stuff
{
get
{
//This could do anything, fetch a dynamic list from anywhere....
return new List<int> { 1, 2, 3 };
}
}
}
Agregue el atributo DataSource
a su método de prueba, señalando el nombre de IEnumerable
creado anteriormente. Esto necesita ser totalmente calificado.
[TestMethod]
[DataSource("Namespace.UnitTest1.Stuff")]
public void TestMethod1()
{
var number = this.TestContext.GetRuntimeDataSourceObject<int>();
Assert.IsNotNull(number);
}
Actualicé de Visual Studio 2010 a Visual Studio 2012.
En mi proyecto de prueba de unidad, tengo un método [ClassInitialize] que genera un archivo CSV que luego alimentaré en un [TestMethod] basado en datos utilizando [DataSource] conectado al CSV.
Esto funciona muy bien en Visual Studio 2010.
No puedo hacer que esto funcione en Visual Studio 2012.
Parece que en VS2012 el corredor de prueba MS requiere que el archivo conectado a [DataSource] ya exista, de lo contrario, ninguna de las pruebas se ejecutará. Si yo mismo creo el CSV, las pruebas basadas en datos se ejecutan, pero no recogen los datos creados en [ClassInitialize]: parece que la lista de pruebas de [DataSource] se evalúa ANTES de ejecutar [ClassInitialize].
¿Hay alguna solución?
Este es un proyecto mínimo que reproduce el problema. Para mí, esto tiene éxito en VS2010 pero falla en VS2012.
TestProject.cs
using System.Diagnostics;
using System.IO;
using Microsoft.VisualStudio.TestTools.UnitTesting;
namespace TestProject
{
[TestClass]
public class DataDrivenUnitTest
{
private static bool _classInitializeCalled;
private static int _testCount;
public TestContext TestContext { get; set; }
[ClassInitialize]
public static void ClassInitialize(TestContext testContext)
{
// Generate the csv list of tests
//TestContext = testContext;
_classInitializeCalled = true;
string testDirectory;
testDirectory = testContext.DeploymentDirectory;
using (var f = new StreamWriter(testDirectory + @"/" + "TestList.csv"))
{
f.WriteLine("TestName");
f.WriteLine("TestA");
f.WriteLine("TestB");
}
}
[TestMethod]
[DataSource("CsvTestData32")]
public void TestMethod1()
{
_testCount++;
var testName = TestContext.DataRow["TestName"];
Debug.Print("Test {0}: {1}", _testCount, testName);
}
[ClassCleanup]
public static void ClassCleanup()
{
Assert.IsTrue(_classInitializeCalled);
Assert.AreEqual(_testCount, 2);
Debug.Print("Tests completed: Tests run {0}", _testCount);
}
}
}
En mi caso, ''ejecutar la prueba como de 32 bits'' es la configuración predeterminada; esto puede ser cambiado en -
- en VS2012: TEST> TestSettings> Arquitectura predeterminada del procesador
- en VS2010 Haga clic con el botón derecho en ''Elementos de solución'' del Explorador de soluciones> Agregar> Nuevo elemento> Configuración de prueba, luego,
- Menú principal de VS2010> Pruebas> Editar configuración de prueba> Hosts> Ejecutar pruebas en un proceso de 32 o 64 bits.
Si usa 64 bits, use [DataSource ("CsvTestData64")], y es posible que necesite instalar el controlador ODBC MS Access de 64 bits . La forma más fácil es seguir con 32 bits.
App.config
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="microsoft.visualstudio.testtools" type="Microsoft.VisualStudio.TestTools.UnitTesting.TestConfigurationSection, Microsoft.VisualStudio.QualityTools.UnitTestFramework, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
</configSections>
<microsoft.visualstudio.testtools>
<dataSources>
<add name="CsvTestData32" connectionString="CsvConn32" dataTableName="`TestList.csv`" dataAccessMethod="Sequential" />
<add name="CsvTestData64" connectionString="CsvConn64" dataTableName="`TestTest.csv`" dataAccessMethod="Sequential" />
</dataSources>
</microsoft.visualstudio.testtools>
<connectionStrings>
<add name="CsvConn32" connectionString="Driver={Microsoft Text Driver (*.txt; *.csv)};./;Extensions=csv;" providerName="System.Data.Odbc" />
<add name="CsvConn64" connectionString="Driver={Microsoft Access Text Driver (*.txt, *.csv)};Dbq=./;Extensions=csv" providerName="System.Data.Odbc" />
</connectionStrings>
</configuration>