单元测试中的DeploymentItem和TestCleanup冲突

本文关键字:TestCleanup 冲突 DeploymentItem 单元测试 | 更新日期: 2023-09-27 17:51:19

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

  1. 测试执行的部署项
  2. (其他事情发生?)
  3. 执行先前测试的测试清理
  4. 下一个测试执行
  5. 测试失败,因为文件已经消失

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

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

单元测试中的DeploymentItem和TestCleanup冲突

测试属性的顺序如下:

  1. 用AssemblyInitializeAttribute标记的方法
  2. 用ClassInitializeAttribute标记的方法
  3. 使用TestInitializeAttribute标记的方法。
  4. 使用TestMethodAttribute标记的方法。

部分问题是Visual Studio以不确定的顺序运行测试(默认情况下,但可以更改),并且一次运行多个测试。这意味着您不能在每次测试后删除文件夹。


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

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

例如:

    [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...
    }