在ClassInitialize中生成的数据驱动测试:不再在Visual Studio 2012中工作

我已从Visual Studio 2010升级到Visual Studio 2012。

在我的unit testing项目中,我有一个[ClassInitialize]方法生成一个CSV文件,然后使用连接到CSV的[DataSource]将其输入数据驱动的[TestMethod]。

这在Visual Studio 2010中非常有用。

我无法在Visual Studio 2012中使用它。

似乎在VS2012中,MS测试运行器需要连接到[DataSource]的文件已经存在,否则将不会运行任何测试。 如果我自己创建CSV,则会运行数据驱动的测试,但它们不会获取[ClassInitialize]中创建的数据:似乎在[ClassInitialize]运行之前评估来自[DataSource]的测试列表。

有解决方法吗?


这是一个重现问题的最小项目。 对我来说,这在VS2010中取得了成功,但在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); } } } 

在我的情况下,’运行测试为32位’是默认设置; 这可能会改变 –

  • 在VS2012中:TEST> TestSettings>默认处理器体系结构
  • 在VS2010中右键单击解决方案资源管理器’解决方案项’>添加>新项>测试设置,然后,
  • VS2010主菜单>测试>编辑测试设置>主机>以32位或64位进程运行测试。

如果您使用64位,请使用[DataSource(“CsvTestData64”)],您可能需要安装MS Access 64位ODBC驱动程序 。 最简单的方法是坚持使用32位。

App.config中

    

MSTestHacks可能有所帮助。

它允许测试类上的IEnumberable用作TestMethodDataSource

来自网站:

运行时数据源

您必须从TestBaseinheritance您的测试类

 [TestClass] public class UnitTest1 : TestBase { } 

创建一个返回IEnumerable的Property,Field或Method

 [TestClass] public class UnitTest1 : TestBase { private IEnumerable Stuff { get { //This could do anything, fetch a dynamic list from anywhere.... return new List { 1, 2, 3 }; } } } 

DataSource属性添加到测试方法,指向先前创建的IEnumerable名称。 这需要完全合格。

 [TestMethod] [DataSource("Namespace.UnitTest1.Stuff")] public void TestMethod1() { var number = this.TestContext.GetRuntimeDataSourceObject(); Assert.IsNotNull(number); }