gpt4 book ai didi

c# - ClassInitialize : no longer working in Visual Studio 2012 中生成的数据驱动测试

转载 作者:太空狗 更新时间:2023-10-29 23:24:38 24 4
gpt4 key购买 nike

我已从 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>

最佳答案

MSTestHacks可能有帮助。

它允许将测试类中的 IEnumberable 用作 TestMethodDataSource

来自网站:

运行时数据源

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

[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 名称。这需要完全合格。

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

Assert.IsNotNull(number);
}

关于c# - ClassInitialize : no longer working in Visual Studio 2012 中生成的数据驱动测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13365393/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com