c# - 单元测试中的 DeploymentItem 和 TestCleanup 冲突?

标签 c# unit-testing

我有一个应用程序,在许多类中有许多单元测试。许多测试都有 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 似乎只保证文件在测试执行之前就在那里,但并没有比这更具体。我想我遇到了以下问题:

  1. 用于测试执行的部署项
  2. (发生其他事情?)
  3. 从之前的测试执行中进行测试清理
  4. 下一个测试执行
  5. 测试失败,因为文件不见了

有人知道不同测试属性的执行顺序吗?我一直在寻找,但没有找到太多。

我考虑过让每个部署项都使用自己的、唯一的数据文件夹,但这变得很困难,因为有数百个测试要经过。

最佳答案

test attributes的顺序如下:

  1. 标有 AssemblyInitializeAttribute 的方法。
  2. 标有 ClassInitializeAttribute 的方法。
  3. 标有 TestInitializeAttribute 的方法。
  4. 标有 TestMethodAttribute 的方法。

部分问题是 Visual Studio 以不确定的顺序(默认为 but this can be changed)运行测试,并且一次运行多个测试。这意味着您无法在每次测试后删除该文件夹。


一般来说,如果您可以避免进入磁盘进行单元测试,那么会好很多。一般来说,除了可以破坏您的测试的代码之外,您不希望有任何东西。

关于c# - 单元测试中的 DeploymentItem 和 TestCleanup 冲突?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14286682/

相关文章:

unit-testing - 如何在开 Jest 中链接具有多个异常的 promise

python - 使用路径模拟 os.path.dirname

javascript - 如何对 Vue 组件的 'v-show' 属性进行单元测试

c# - 使用 LINQ 读取 xml 并存储在对象列表中

c# - 客户端-服务器 IN 应用程序中外部 IP 上的服务器没有响应

c# - 使用 svc-less 服务的 Autofac WCF 注册异常

perl - 如何在 Mojolicious 应用程序的单元测试中伪造客户端 IP 地址?

c# - Xamarin.Forms 中未显示 Android 权限对话框

c# - 在随机生成的迷宫上使用递归回溯

unit-testing - 谷歌应用引擎 + GWT + Eclipse : where do your unit tests live?