Testes baseados em dados gerados no ClassInitialize: não mais trabalhando no Visual Studio 2012
Eu fiz o upgrade do Visual Studio 2010 para o Visual Studio 2012.
No meu projeto de teste de unidade, tenho um método [ClassInitialize] que gera um arquivo CSV que, em seguida, alimento em um [TestMethod] acionado por dados usando [DataSource] conectado ao CSV.
Isso funciona muito bem no Visual Studio 2010.
Não consigo fazer isso funcionar no Visual Studio 2012.
Parece que no VS2012 o executor de testes do MS requer que o arquivo conectado ao [DataSource] já exista, caso contrário nenhum dos testes será executado. Se eu mesmo criar o CSV, os testes baseados em dados serão executados, mas eles não coletarão os dados criados em [ClassInitialize]: parece que a lista de testes do [DataSource] é avaliada ANTES [ClassInitialize] é executado.
Existe uma solução alternativa?
Este é um projeto mínimo que reproduz o problema. Para mim, isso é bem-sucedido no VS2010, mas falha no 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);
}
}
}
No meu caso, 'executar teste como 32 bits' é a configuração padrão; isso pode ser alterado em -
em VS2012: TEST> TestSettings> Default Processor Architectureno VS2010 Clique com o botão direito do mouse em Solution Explorer 'Solution items'> Add> New Item> Test Settings e, em seguida,Menu principal do VS2010> Testes> Editar configurações de teste> Hosts> Executar testes no processo de 32 ou 64 bits.Se você usa 64 bits, use [DataSource ("CsvTestData64")] e talvez seja necessário instalar oDriver ODBC de 64 bits do MS Access. A maneira mais fácil é ficar com 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>