在ClassInitialize生成的数据驱动测试:在Visual Studio 2012中不再工作 [英] Data driven tests generated in ClassInitialize: no longer working in Visual Studio 2012

查看:685
本文介绍了在ClassInitialize生成的数据驱动测试:在Visual Studio 2012中不再工作的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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



在我的单元测试的项目,我有一个生成CSV文件中的[ClassInitialize]方法,我然后送入一个数据驱动的使用[数据源]连接到CSV [TestMethod的]。



这工作在Visual Studio 2010中大。



我不能得到这个在Visual Studio工作2012



看来,在VS2012的MS测试运行需要连接到[数据源文件]已经存在,否则没有任何的测试运行。如果我创建CSV自己的数据驱动测试运行,但他们不拿起[ClassInitialize]创建的数据:看来,从[数据源]测试列表之前[ClassInitialize]运行评估

有没有解决办法?






这是一个很小的项目,再现的问题。对我来说,这成功地VS2010,但VS2012失败。



TestProject.cs



 使用System.Diagnostics程序; 
:使用System.IO;
使用Microsoft.VisualStudio.TestTools.UnitTesting;

命名空间TestProject
{
[TestClass中]
公共类DataDrivenUnitTest
{
私人静态布尔_classInitializeCalled;
私有静态诠释_testCount;

公众的TestContext的TestContext {搞定;组; }

[ClassInitialize]
公共静态无效ClassInitialize(的TestContext的TestContext)
{
//生成测试
//的CSV名单的TestContext =的TestContext ;
_classInitializeCalled = TRUE;
串testDirectory;
testDirectory = testContext.DeploymentDirectory;
使用(VAR F =新的StreamWriter(testDirectory + @\+TestList.csv))
{
f.WriteLine(测试名);
f.WriteLine(种皮);
f.WriteLine(TESTB);
}
}

[TestMethod的]
[数据源(CsvTestData32)]
公共无效TestMethod1()
{
_testCount ++;
VAR测试名= TestContext.DataRow [测试名];
Debug.Print(测试{0}:{1},_testCount,测试名);
}

[ClassCleanup]
公共静态无效ClassCleanup()
{
Assert.IsTrue(_classInitializeCalled);
Assert.AreEqual(_testCount,2);
Debug.Print(完成测试:测试运行{0},_testCount);
}
}
}

在我的情况下运行测试为32位是默认设置; TEST> TestSettings>默认处理器架构




    • 在VS2012 - 这可能下切换VS2010右键单击解决方案资源管理器解决方案项目'>添加>新项目>测试设置,然后,

    • VS2010主菜单>测试>编辑测试设置>主机>运行测试,在32位或64位进程。



    如果您使用64位,使用[数据源(CsvTestData64)],并且您可能需要安装 MS访问64位ODBC驱动程序。最简单的方法是坚持使用32位。



    App.config中



     <?XML版本=1.0编码=UTF-8>?; 
    <结构>
    < configSections>
    <节名称=microsoft.visualstudio.testtoolsTYPE =Microsoft.VisualStudio.TestTools.UnitTesting.TestConfigurationSection,Microsoft.VisualStudio.QualityTools.UnitTestFramework,版本= 10.0.0.0,文化=中性公钥= b03f5f7f11d50a3a />
    < / configSections>

    < microsoft.visualstudio.testtools>
    <数据源>
    <添加名称=CsvTestData32的connectionString =CsvConn32dataTableName =`TestList.csv`dataAccessMethod =顺序/>
    <添加名称=CsvTestData64的connectionString =CsvConn64dataTableName =`TestTest.csv`dataAccessMethod =顺序/>
    < /数据源>
    < /microsoft.visualstudio.testtools>

    <&是connectionStrings GT;
    <添加名称=CsvConn32的connectionString =驱动程序= {Microsoft文本驱动程序(* .TXT; * .csv的)} ;. \;扩展= CSV;的providerName =System.Data.Odbc/>
    <添加名称=CsvConn64的connectionString =驱动程序= {Microsoft Access中的文本驱动程序(*。txt文件,* .csv的)}; DBQ = .\;扩展= CSV的providerName =System.Data这。 ODBC/>
    < /&是connectionStrings GT;
    < /结构>


    解决方案

    MSTestHacks 可能的帮助。



    它允许 IEnumberable 在您的测试类被用作数据源 TestMethod的


    >

    从网站:



    运行数据源



    您必须继承你的测试类从TestBase

      [TestClass中] 
    公共类UnitTest1:TestBase
    {}

    创建属性,字段或方法,返回一个的IEnumerable

      [TestClass中] 
    公共类UnitTest1:TestBase
    {
    私人的IEnumerable< INT>东西
    {
    得到
    {
    //这可以从任何地方做任何事情,获取的动态列表....
    返回新的List< INT> {1,2,3};
    }
    }
    }



    添加数据源属性为您的测试方法,指回的IEnumerable 名称前面创建。这需要完全合格的。

      [TestMethod的] 
    [数据源(Namespace.UnitTest1.Stuff)]
    公共无效TestMethod1()
    {
    变种数= this.TestContext.GetRuntimeDataSourceObject< INT>();

    Assert.IsNotNull(数);
    }


    I have upgraded from Visual Studio 2010 to Visual Studio 2012.

    In my unit test project, I have a [ClassInitialize] method which generates a CSV file which I then feed into a data-driven [TestMethod] using [DataSource] connected to the CSV.

    This works great in Visual Studio 2010.

    I cannot get this to work in Visual Studio 2012.

    It seems that in VS2012 the MS test runner requires the file connected to the [DataSource] to already exist otherwise none of the tests will run. If I create the CSV myself, the data-driven tests run, but they do not pick up the data created in [ClassInitialize]: it seems that the list of tests from the [DataSource] is evaluated BEFORE [ClassInitialize] runs.

    Is there a workaround?


    This is a minimal project that reproduces the problem. For me, this succeeds in VS2010 but fails in 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);
            }
        }
    }
    

    In my case 'run test as 32-bit' is the default setting; this may be changed under -

    • in VS2012: TEST > TestSettings > Default Processor Architecture
    • in VS2010 Right-click Solution explorer 'Solution items' > Add > New Item > Test Settings, then,
    • VS2010 main menu > Tests > Edit Test Settings > Hosts > Run tests in 32 bit or 64 bit process.

    If you use 64-bit, use [DataSource("CsvTestData64")], and you may need to install the MS Access 64-bit ODBC driver. The easiest way is to stick with 32-bit.

    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>
    

    解决方案

    MSTestHacks might help.

    It allows an IEnumberable on your test class to be used as the DataSource for your TestMethod.

    From the website:

    Runtime DataSource

    You MUST inherit your test class from TestBase

    [TestClass]
    public class UnitTest1 : TestBase
    { }
    

    Create a Property, Field or Method, that returns an 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 };
            }
        }
    }
    

    Add the DataSource attribute to your test method, pointing back to the IEnumerable name created earlier. This needs to be fully qualified.

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

    这篇关于在ClassInitialize生成的数据驱动测试:在Visual Studio 2012中不再工作的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

  • 查看全文
    登录 关闭
    扫码关注1秒登录
    发送“验证码”获取 | 15天全站免登陆