【问题标题】:DeploymentItem and TestCleanup conflict in unit tests?单元测试中的 DeploymentItem 和 TestCleanup 冲突?
【发布时间】:2013-01-11 21:10:19
【问题描述】:

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

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

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

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

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

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

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

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

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

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

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

【问题讨论】:

  • “某些测试失败,因为其他测试留下的 DeploymentItems 导致测试获取错误的数据” - 为什么会发生这种情况,您的单元测试是否修改了部署测试期间的项目?如果这是真的,您可以简单地创建您需要在每个测试中修改的部署项的副本以保留原始文件...
  • 每个测试是否使用不同的文件但共享同一个文件夹?

标签: c# unit-testing


【解决方案1】:

test attributes的顺序如下:

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

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


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

【讨论】:

  • 是的,我同意避免使用磁盘。问题是我正在测试代码,其目的是读取文件,所以必须有文件。这些文件还代表大型数据集,因此我无法轻松地在代码中实例化可比较的对象,并且在针对小型数据集运行时,测试并不总是具有很大价值。
  • 我还在处理一个问题,但你确实回答了我关于执行顺序的问题,所以我会标记它。
  • @SouthShoreAK 您可能需要查看How to: Configure Test Deployment 以确保每个路径都配置正确。
  • @SouthShoreAK 你真的想测试从文件系统读取文件,还是想测试你的代码如何处理来自文件系统的数据?如果是后者(我希望它是),您希望 mock 文件系统用于测试目的。
【解决方案2】:

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

例如:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-08
    • 1970-01-01
    相关资源
    最近更新 更多