我在单元测试的属性评估之后执行的单元测试的 classinitialize 方法遇到问题。这些测试使用 [classinitialize] 方法生成一个测试集,该测试集在 xml 文件中生成一组随机数据。 xml 文件由具有属性 [datasource] 的单元测试使用。其精简版本如下所示:
[ClassInitialize]
public static void Initialize(TestContext context)
{
// Create xml output file
var output = new XDocument(new XElement("Rows"));
foreach (var Code in Codes)
{
if (output.Root != null)
output.Root.Add(new XElement("Row", new XElement("Code", Code)));
}
output.Save("TestData.xml");
}
[DataSource("Microsoft.VisualStudio.TestTools.DataSource.XML",
"|DataDirectory|\\TestData.xml",
"Row",
DataAccessMethod.Sequential)]
[TestMethod]
public void TestStuff()
{
var Code = (string)TestContext.DataRow["Code"];
TestItem(Code);
}
我正在使用 Visual Studio 2012 Update 3。我使用了 Sysinternals 工具 Process Monitor 来验证执行顺序。我在每个方法的开头设置了一个断点。然后我逐步查看文件访问情况。我看到的操作顺序。
- 由 vstestexecutionengine 读取 TestData.xml。
- 调用ClassInitialize方法并写入TestData.xml
- 使用步骤 1 中读取的数据执行 TestMethod。(我添加了一个包含虚假数据的文件来测试)
所以我的问题是,我做错了什么,在读取 xml 文件之前 classinitialize 没有执行?或者我想做的事情是不可能的?
MS测试黑客 https://github.com/Thwaitesy/MSTestHacks可能对你来说是一个可能的解决方法。
它允许IEnumerable
在你的测试类上用作DataSource
为您TestMethod
。您可以将您所拥有的归还为Codes
在这个属性中。
来自网站:
运行时数据源:您的测试类必须继承自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 };
}
}
}
Add the DataSource
属性到您的测试方法,指向回IEnumerable
之前创建的名称。这需要完全合格。
[TestMethod]
[DataSource("Namespace.UnitTest1.Stuff")]
public void TestMethod1()
{
var number = this.TestContext.GetRuntimeDataSourceObject<int>();
Assert.IsNotNull(number);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)