【问题标题】:after(:each) vs after(:all) in Rails rspecRails rspec中的after(:each)与after(:all)
【发布时间】:2015-10-26 14:45:37
【问题描述】:

在 rails rspec 中,我正在编写执行此操作的测试用例:

after(:each) do
    DatabaseCleaner.clean_with(:truncation)
  end

我需要在每次测试运行后清理数据库。但这会影响我的测试性能并使它们变慢吗?

【问题讨论】:

  • 您的问题是“如果我的计算机必须做更多的事情,那会比它做更少的事情需要更长的时间”吗?如果是这样,那么是的,很明显。
  • 但它会显着减慢我的测试速度,并且使用 after(:each) 是一种不好的做法
  • 取决于“显着”的含义。我想你会注意到不同之处。不如先试试看,然后再决定能不能忍?
  • 每次测试后尝试DatabaseCleaner.clean_with(:transaction)。它会加快你的测试速度(但如果你在玩EventMachine,事务策略可能不起作用,所以你必须坚持截断策略)。 AFAIK 在每次测试后清理数据库是一种很好的做法,因为它消除了由数据库中的历史数据引起的假绿。

标签: ruby-on-rails ruby activerecord rspec


【解决方案1】:

“截断”方法会根据表的数量产生影响,因为它会为每个表执行一个查询来截断。您可以改用“事务”方法,该方法将执行基于事务的回滚,这将大大减少用于回滚到干净数据库状态的资源量。

如果您使用 ActiveRecord 并希望清楚地了解发生了什么,您可以在测试中执行以下操作:

before do
  ActiveRecord::Base.logger = Logger.new(STDOUT)
end

【讨论】:

    【解决方案2】:

    它会对性能产生影响,具体取决于运行after 挂钩的测试数量。

    另外,我认为最好使用before 而不是after。根据测试用例,数据库的状态是前提;测试用例需要这个前提条件。并且您应该确保使用 before 挂钩而不是依赖于在其他地方定义的 after 挂钩的前提条件。

    【讨论】:

      猜你喜欢
      • 2012-02-17
      • 2013-05-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-02
      相关资源
      最近更新 更多