【问题标题】:Programmatically skip a test in Spock以编程方式跳过 Spock 中的测试
【发布时间】:2016-02-22 11:33:54
【问题描述】:

如何以编程方式跳过 Spock 框架中的测试?我知道我可以annotate a test with @Ignore 跳过它,或者使用@IgnoreIf 跳过基于环境变量等的测试。但是有没有办法运行任意代码来决定是否应该运行测试?

例如,假设我有一个必须连接到第三方服务的沙盒环境的集成测试。服务沙盒环境中的中断会导致测试失败。假设我已经编写了一个方法 canConnectToService 来检查测试是否能够连接到该服务,我该如何编写一个在 canConnectToService() 返回 false 时将被跳过的测试?

【问题讨论】:

  • 我不明白这个问题。您可以@IgnoreIf 中运行任意代码。你有没有试过?我知道这是一个老问题,但你的问题到底是什么?如果您自己知道的板载 Spock 功能已经这样做了,我认为没有必要使用 Assume
  • @kriegaex 但此闭包无权访问测试变量。问题是如何在测试中间忽略测试,根据某些条件,在测试开始后知道。
  • 问题不在于技术,而在于您的测试方法。其他测试不应该被跳过,但都会变红,很快就失败了。跳过的测试是一种气味,并且不会在您的统计数据中报告为失败。我总是教导我的教练团队,敏捷开发的最佳特点是透明度。因此,如果您遇到第 3 方服务器中断,您希望看到 3,000 个集成测试失败,以便了解此问题的根本影响。想象一下,您只有一次失败,并且有 2,999 次跳过后续测试,甚至只有 3,000 次跳过,但还有 10 次失败的测试。 (待续)
  • 开发团队的反应如何?可能他们会将跳过的测试视为小问题,因为测试统计数据仍然看起来不错,首先修复其他失败的测试。相反,他们应该做的是联系第 3 方,并确保导致 3,000 次测试的质量信息丢失的问题尽快得到解决。这同样适用于因任何原因无法使用的内部第 3 方系统或自己的组件。跳过测试是信息隐藏。 (待续)
  • 顺便说一句,您仍然可以在单个集成规范中使用@Stepwise,以使 Spock 自动跳过该规范中的其余方法。 BTW2、@Requires@IgnoreIf 可以在您的测试中轻松调用静态方法,如果您绝对坚持这样做,则可以检查或登录远程系统。

标签: spock


【解决方案1】:

使用 JUnit 的 Assume class。具体来说,如果第三方服务不可用,您可以在测试开始时写Assume.assumeTrue(canConnectToService()) 以跳过测试。如果canConnectToService() 返回false,此方法将抛出AssumptionViolatedException,并且Spock 忽略被AssumptionViolatedException 中断的测试以实现JUnit 兼容性(请参阅this bug report)。

【讨论】:

    猜你喜欢
    • 2011-05-04
    • 1970-01-01
    • 2015-12-19
    • 2015-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多