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

时间:2013-01-11 21:10:20

标签: 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. 测试因文件消失而失败
  6. 有谁知道不同测试属性的执行顺序?我一直在寻找,但我找不到多少。

    我曾考虑让每个部署项目都使用自己独特的数据库文件夹,但这很难实现,因为需要进行数百次测试。

2 个答案:

答案 0 :(得分:5)

test attributes的顺序如下:

  1. 使用AssemblyInitializeAttribute标记的方法。
  2. 使用ClassInitializeAttribute标记的方法。
  3. 使用TestInitializeAttribute标记的方法。
  4. 使用TestMethodAttribute标记的方法。
  5. 部分问题是Visual Studio以非确定性顺序(默认为but this can be changed)运行测试,一次运行多个。这意味着您无法在每次测试后删除该文件夹。


    一般情况下,如果您避免转到磁盘进行单元测试,那么很多会更好。一般来说,除了可以打破您的测试的代码之外,您不希望有任何其他内容。

答案 1 :(得分: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...
    }