【问题标题】:Stop execution of particular rspec test (not test suite) on first failure在第一次失败时停止执行特定的 rspec 测试(不是测试套件)
【发布时间】:2013-04-11 17:27:44
【问题描述】:

是否有某种编程方式可以强制 rspec 测试在第一次失败时停止?

例如,

  1. 我有一个包含几个 rspec 测试的测试套件,我同时运行它们。
  2. 每个 rspec 测试都位于单独的 spec.rb 文件中

如果这些测试中的任何一个发生故障,我想在失败的特定测试步骤上进一步停止执行该特定测试,但不停止执行我正在运行的整个测试套件。

我知道有以下方法:

RSpec.configure do |c|
  c.fail_fast = true
end

但是在我在测试套件中运行的任何规范文件中定义它会导致套件的所有执行失败。

有什么办法可以处理这种情况?

提前致谢

【问题讨论】:

  • 准确理解你想要什么有点困难,但你的意思是如果发生故障,是否可以停止在特定文件中运行的所有测试,同时仍然继续运行套件中的其他测试?如果是这样,我不确定这是否可能。如果您的意思是可以运行整个测试套件但立即显示任何失败消息,以便您可以在其他测试仍在继续运行的同时对其进行调查,然后尝试Fuubar gem
  • 所以我的想法如下: 1. 我的测试套件中有 5 个规范测试 2. 每个测试都在单独的规范文件中 3. 每个测试都包含几个上下文,在这些上下文中完成了一些验证. 4. 我运行命令 rspec 。运行完整的测试套件 5. 当一个测试(一个文件)内的一个上下文中出现问题时,我想停止在该特定上下文上的执行,而不是在该测试中更进一步,而是执行其他规范文件。有没有可能做到这一点?

标签: ruby testing rspec


【解决方案1】:

我知道这是一个老问题,但我在寻求自己实现同样的行为时偶然发现了它。经过多次徒劳的搜索后,我想出了一个相当简单的实现方法,它实际上提供了所需的行为!

只需将以下内容添加到每个规范文件中,以在发生异常时跳过后续示例(在该特定文件中):

  before :all do
    $continue = true
  end

  around :each do |example|
    if $continue
      $continue = false
      example.run
      $continue = true unless example.exception
    else
      example.skip
    end
  end

这里的逻辑应该是不言自明的。继续运行示例直到发生异常,然后跳过该规范的其余示例。围绕每个钩子很好地促进了这个逻辑,因为它可以控制每个示例的执行。有关“around”钩子的更多信息,请参阅RSpec documentation

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-03-30
    • 1970-01-01
    • 2021-03-19
    • 2018-12-17
    • 1970-01-01
    • 1970-01-01
    • 2015-05-30
    相关资源
    最近更新 更多