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

时间:2012-11-13 17:13:35

标签: c# unit-testing visual-studio-2012 mstest data-driven-tests

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

在我的单元测试项目中,我有一个[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-bit ODBC driver。最简单的方法是坚持使用32位。

的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>

1 个答案:

答案 0 :(得分:4)

MSTestHacks可能会有所帮助。

它允许您的测试类IEnumberable用作DataSource的{​​{1}}。

来自网站:

运行时数据源

您必须从TestBase

继承您的测试类
TestMethod

创建一个返回[TestClass] public class UnitTest1 : TestBase { }

的属性,字段或方法
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 }; } } } 属性添加到测试方法中,并指回先前创建的DataSource名称。这需要完全合格。

IEnumerable