我有一个应用程序,在许多类中有许多单元测试。许多测试都有 DeploymentItem 属性来提供所需的测试数据:
[TestMethod]
[DeploymentItem("UnitTesting\testdata1.xml","mytestdata")]
public void Test1(){
/*test*/
}
[TestMethod]
[DeploymentItem("UnitTesting\testdata2.xml","mytestdata")]
public void Test1(){
/*test*/
}
当单独运行测试时,它们会通过。当同时运行所有测试时(例如,当我选择“在当前上下文中运行所有测试”时),一些测试会失败,因为其他测试留下的 DeploymentItem
导致测试获取错误的数据。 (或者,一个测试错误地使用了用于另一个尚未运行的测试的文件。)
我发现了 [TestCleanup]
和 [ClassCleanup]
属性,它们似乎会有帮助。我添加了这个:
[TestCleanup]
public void CleanUp(){
if(Directory.Exists("mytestdata"))
Directory.Delete("mytestdata", true);
}
问题是,它在每个测试方法之后运行,而且它似乎会删除尚未运行的测试的 DeploymentItems。 [ClassCleanup]
会阻止这种情况,但不幸的是,它运行的频率不足以阻止原始问题。
从 MSDN 文档来看,DeploymentItem 似乎只保证文件在测试执行之前就在那里,但并没有比这更具体。我想我遇到了以下问题:
- 用于测试执行的部署项
- (发生其他事情?)
- 从之前的测试执行中进行测试清理
- 下一个测试执行
- 测试失败,因为文件不见了
有人知道不同测试属性的执行顺序吗?我一直在寻找,但没有找到太多。
我考虑过让每个部署项都使用自己的、唯一的数据文件夹,但这变得很困难,因为有数百个测试要经过。
最佳答案
test attributes的顺序如下:
- 标有 AssemblyInitializeAttribute 的方法。
- 标有 ClassInitializeAttribute 的方法。
- 标有 TestInitializeAttribute 的方法。
- 标有 TestMethodAttribute 的方法。
部分问题是 Visual Studio 以不确定的顺序(默认为 but this can be changed)运行测试,并且一次运行多个测试。这意味着您无法在每次测试后删除该文件夹。
一般来说,如果您可以避免进入磁盘进行单元测试,那么会好很多。一般来说,除了可以破坏您的测试的代码之外,您不希望有任何东西。
关于c# - 单元测试中的 DeploymentItem 和 TestCleanup 冲突?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14286682/