【发布时间】:2013-01-11 21:10:19
【问题描述】:
我有一个应用程序,它在许多类中有许多单元测试。许多测试都有 DeploymentItem 属性来提供所需的测试数据:
[TestMethod]
[DeploymentItem("UnitTesting\testdata1.xml","mytestdata")]
public void Test1(){
/*test*/
}
[TestMethod]
[DeploymentItem("UnitTesting\testdata2.xml","mytestdata")]
public void Test1(){
/*test*/
}
单独运行测试时,它们会通过。当全部同时运行时(例如,当我选择“在当前上下文中运行所有测试”时),一些测试会失败,因为其他测试留下的DeploymentItems 会导致测试抓取错误的数据。 (或者,一个测试错误地使用了用于另一个尚未运行的测试的文件。)
我发现了 [TestCleanup] 和 [ClassCleanup] 属性,这似乎会有所帮助。我添加了这个:
[TestCleanup]
public void CleanUp(){
if(Directory.Exists("mytestdata"))
Directory.Delete("mytestdata", true);
}
问题是,这会在每个测试方法之后运行,并且它似乎会删除尚未运行的测试的 DeploymentItems。 [ClassCleanup] 可以防止这种情况发生,但不幸的是,它的运行频率不足以防止最初的问题。
从 MSDN 文档看来,DeploymentItem 似乎只保证文件在测试执行之前就在那里,但并没有比这更具体。我想我看到了以下问题:
- 执行测试的部署项
- (发生了其他事情?)
- 执行上一个测试的测试清理
- 下一个测试执行
- 测试失败,因为文件消失了
有人知道不同测试属性的执行顺序吗?我一直在寻找,但没有找到太多。
我曾考虑让每个部署项使用其自己的唯一数据文件夹,但这变得很困难,因为要进行数百次测试。
【问题讨论】:
-
“某些测试失败,因为其他测试留下的 DeploymentItems 导致测试获取错误的数据” - 为什么会发生这种情况,您的单元测试是否修改了部署测试期间的项目?如果这是真的,您可以简单地创建您需要在每个测试中修改的部署项的副本以保留原始文件...
-
每个测试是否使用不同的文件但共享同一个文件夹?
标签: c# unit-testing