单元测试中DeploymentItem和TestCleanup冲突?

问题描述 投票:0回答:2

我有一个应用程序,在许多类中有许多单元测试。许多测试都有 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. 测试失败,因为文件丢失了

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

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

c# unit-testing
2个回答
5
投票

测试属性顺序如下:

部分问题在于 Visual Studio 以不确定的顺序运行测试,并且一次运行多个测试。


1
投票

我也有类似的问题。在少数测试中,我需要删除已部署的项目 - 所有测试在单独运行时都通过,但在播放列表中运行时失败。我的解决方案很丑陋,但很简单:为每个测试使用不同的文件夹

例如:

    [TestMethod]
    [DeploymentItem("Resources\\DSC06247.JPG", "D1")]
    public void TestImageUploadWithRemoval()
    {
        // Arrange
        myDeployedImagePath = Path.Combine(TestContext.DeploymentDirectory, "D1", "DSC06247.JPG");
        // Act ...
    }

    [TestMethod]
    [DeploymentItem("Resources\\DSC06247.JPG", "D2")]
    public void TestImageUploadWithoutRemoval()
    {
        // Arrange
        myDeployedImagePath = Path.Combine(TestContext.DeploymentDirectory, "D2", "DSC06247.JPG");
        // Act...
    }
© www.soinside.com 2019 - 2024. All rights reserved.