4

我有一个应用程序,在许多类中有许多单元测试。许多测试具有 DeploymentItem 属性以提供所需的测试数据:

[TestMethod]
[DeploymentItem("UnitTesting\testdata1.xml","mytestdata")]
public void Test1(){
    /*test*/
}

[TestMethod]
[DeploymentItem("UnitTesting\testdata2.xml","mytestdata")]
public void Test1(){
    /*test*/
}

当测试单独运行时,它们通过了。当全部同时运行时(例如,当我选择“在当前上下文中运行所有测试”时),一些测试会失败,因为DeploymentItem其他测试留下的 s 会导致测试抓取错误的数据。(或者,一个测试错误地使用了用于另一个尚未运行的测试的文件。)

我发现了[TestCleanup]and[ClassCleanup]属性,这似乎会有所帮助。我添加了这个:

[TestCleanup]
public void CleanUp(){
    if(Directory.Exists("mytestdata"))
        Directory.Delete("mytestdata", true);
}

问题是,这在每个测试方法之后运行,并且似乎它会删除尚未运行的测试的 DeploymentItems。[ClassCleanup]会阻止这种情况,但不幸的是,它运行的频率不足以阻止最初的问题。

从 MSDN 文档看来,DeploymentItem 似乎只保证文件在测试执行之前就在那里,但并不比这更具体。我想我看到了以下问题:

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

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

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

4

2 回答 2

5

测试属性的顺序如下:

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

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


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

于 2013-01-11T21:30:14.837 回答
1

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

例如:

    [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...
    }
于 2013-11-23T09:17:38.777 回答