【问题标题】:How to fail or continue to next RSpec test after n seconds?如何在 n 秒后失败或继续下一个 RSpec 测试?
【发布时间】:2016-03-04 20:00:23
【问题描述】:

如果完成时间超过 n 秒,我想失败(或继续)RSpec 测试。我将其用作调试应用程序在测试期间停止的位置的一种方式。

  • 我需要将测试包装在一个事务中。 我尝试创建一个Timeout 块,但没有清理数据库,并且一个线程处于打开状态。也许 database_cleaner 可以在这里提供帮助...
  • 理想情况下,我想用自定义消息替换 Capybara 错误(见下文),例如 'Forced Timeout'

我知道将fail 放入测试中,但它仅在读取该行时才有效。相反,如果一个测试在同一行上持续了 10 秒,我希望它通过失败或调用某个 continue 方法移动到下一个测试。

Capybara 失败消息示例:

1) Exercise Login page - log in as user type
   Failure/Error: fill_in "Username", with: @user.name
   Capybara::ElementNotFound:
     Unable to find field "Username"

【问题讨论】:

  • 您不应该在测试中实施超时,而是在任何需要很长时间的情况下实施。因此,如果您长时间运行的进程正在尝试连接到某个东西,那么您的 HTTP 客户端(或其他任何东西)应该检测它自己的超时。
  • @Anthony 我同意你的观点,但在这一点上,我不确定什么需要这么长时间。例如,我在午餐时间运行我的套件,但在 2 分钟后停止了 10 次测试。在这种情况下,记录的最后一件事是ROLLBACK——没有什么可以说明回滚是如何崩溃的。
  • 在进行 capybara 规范时,您希望使用截断而不是事务 - 特别是当您使用 webkit 或 selenium 之类的 javascript 驱动程序时。 github.com/jnicklas/capybara#transactions-and-database-setup
  • 此外,如果您使用 Webkit、Poltergeist 或 Selenium,您可以在驱动程序级别设置超时,请参阅每个驱动程序的文档。
  • @max 我不知道 Poltergeist 或 Capybara Webkit 有超时方法。我会检查文档,谢谢。

标签: ruby-on-rails ruby rspec rspec3


【解决方案1】:

您可以将 RSpec 与 Ruby 的 Timeout 结合使用。 在全球范围内,您可以这样设置,但如果您知道哪个是问题,您甚至可以在特定测试中进行设置。

require 'timeout'
time_limit = n

RSpec.configure do |c|
  c.around(:each) do |example|
    Timeout::timeout(time_limit) {
      example.run
    }
  end
end

【讨论】:

  • 我正在使用 Capybara,并尝试显示“找不到元素”,而不是 Timeout 或其他内容。
  • 更新 -- 这不起作用,因为它会影响数据库清理和线程。我会继续寻找解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-09-13
  • 2015-12-18
  • 2019-01-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多