【问题标题】:Programmatically timeout a test in MSTest以编程方式使 MSTest 中的测试超时
【发布时间】:2012-09-20 12:26:28
【问题描述】:

我遇到了一种情况,我正在使用单元测试来执行执行测试的外部工具。我可以从工具的退出代码中确定测试是否通过、失败或超时。

是否有某种方法可以使单元测试失败,从而将测试结果设置为超时而不是失败?

我尝试抛出 TimeoutException,但这与使用 Assert 的结果相同。

编辑: 我们将单元测试与 TFS 中的测试用例联系起来。在 Microsoft 测试中心中,测试运行中的测试可以有多种状态。其中之一是超时状态。我正在尝试使我的测试失败,以便它正确显示在这种状态下,并且不会与失败的测试用例混在一起。

【问题讨论】:

  • 如果您的测试依赖于外部工具来完成某些工作,那么它就不是单元测试。理想情况下,您将模拟外部工具,以便您可以测试您的代码,而不管他们的代码是否按预期工作。
  • @Jamie:那是吹毛求疵。他可能正在做一个集成测试,但(像许多其他人一样)称它为单元测试只是因为它是在测试运行器中运行的。
  • 他可能是@erikkallen,但他也可能打算将其编写为单元测试,但不完全掌握嘲笑或知道这甚至是一件要做的事情。在后者的情况下,我的评论可能会将 OP 推向一个有用的方向,如果没有,也不会造成任何伤害。
  • @erikkallen 是正确的,我们将这些测试作为集成/加载/...测试运行。
  • 我称它为单元测试,因为这是我执行测试的机制。

标签: c# tfs mstest


【解决方案1】:

您可以设置每次测试的超时限制,使用在 Test 属性中添加 Timeout(millisecond)...

[TestMethod, Timeout(2000)]

如果执行时间超过 2 秒,测试将失败。

谢谢 马尔科

【讨论】:

    【解决方案2】:

    这并不是真正的“程序化”,但您可以:

    如果您的测试识别出外部工具返回超时退出代码(这将是“程序化”部分),则您的测试应该等待。

    所以测试框架会为你设置测试结果为“超时”。

    我想,特别是如果您的测试是自动化的,那将是一个合适的解决方案。

    【讨论】:

      【解决方案3】:

      在单元测试中,您使用 2 种颜色进行处理:绿色和红色。没有 超时 颜色。

      所以我想如果你的外部工具超时,你可以手动失败测试:

      Assert.Fail("External tool used to do this test timed out");
      

      检测您的外部工具超时的方式当然取决于您使用的外部工具以及您从单元测试中调用它的方式。

      【讨论】:

      • 查看 Microsoft 测试中心,您会发现不仅仅是绿色和红色。如果测试时间过长(超时),您也会得到黄色。
      • 我很想否决这个答案,因为我认为从问题中(即使是原始形式)很清楚,这完全不是我要问的,而且我已经考虑使用 Assert。
      【解决方案4】:

      您抛出TimeoutException 的方法似乎是一个不错的选择。但是TimeoutException 不是从UnitTestAssertException 派生的。

      您可能想要执行以下操作之一:

      1. 抛出一个AssertFailedException,以字符串形式指示原因。

      2. 使用自定义 UnitTestTimeOutException 子类化 UnitTestAssertException 并抛出它。

      3. Assert.Fail 用作@Darin-Dimitrov suggested

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-07-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-02-22
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多