In ClassInitialize generierte datengesteuerte Tests funktionieren in Visual Studio 2012 nicht mehr
Ich habe ein Upgrade von Visual Studio 2010 auf Visual Studio 2012 durchgeführt.
In meinem Unit-Test-Projekt habe ich eine [ClassInitialize] -Methode, die eine CSV-Datei generiert, die ich dann unter Verwendung der mit der CSV verbundenen [DataSource] in eine datengesteuerte [TestMethod] einspeise.
Dies funktioniert hervorragend in Visual Studio 2010.
Ich kann dies in Visual Studio 2012 nicht zum Laufen bringen.
Es scheint, dass der MS-Testläufer in VS2012 die mit der [DataSource] verbundene Datei bereits benötigt, da sonst keiner der Tests ausgeführt wird. Wenn ich die CSV selbst erstelle, werden die datengesteuerten Tests ausgeführt, die in [ClassInitialize] erstellten Daten werden jedoch nicht abgerufen: Es scheint, dass die Liste der Tests aus der [DataSource] VOR der Ausführung von [ClassInitialize] ausgewertet wird.
Gibt es eine Problemumgehung?
Dies ist ein Minimalprojekt, das das Problem reproduziert. Für mich ist dies in VS2010 erfolgreich, aber in VS2012 schlägt dies fehl.
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);
}
}
}
In meinem Fall ist "Test als 32-Bit ausführen" die Standardeinstellung. Dies kann geändert werden unter -
in VS2012: TEST> TestSettings> StandardprozessorarchitekturKlicken Sie in VS2010 mit der rechten Maustaste auf Solution Explorer 'Solution Items'> Hinzufügen> Neues Element> Testeinstellungen.VS2010-Hauptmenü> Tests> Testeinstellungen bearbeiten> Hosts> Tests im 32-Bit- oder 64-Bit-Prozess ausführen.Wenn Sie 64-Bit verwenden, verwenden Sie [DataSource ("CsvTestData64")]. Möglicherweise müssen Sie das installierenMS Access 64-Bit-ODBC-Treiber. Am einfachsten ist es, sich an 32-Bit zu halten.
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>