在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
用作TestMethod
的DataSource
。
来自网站:
运行时数据源
您必须从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); }