Test::Unit 中的全局设置和拆卸块

Posted

技术标签:

【中文标题】Test::Unit 中的全局设置和拆卸块【英文标题】:Global setup and teardown blocks in Test::Unit 【发布时间】:2009-11-15 04:16:55 【问题描述】:

在整个测试套件(不仅仅是一个测试类)中的每个方法之前运行设置的最佳方法是什么?

Rspec 允许您定义全局的前后块。在不涉及将模块混合到每个测试类中的 Test::Unit 中是否有一种干净的可比方法?

【问题讨论】:

我也对这个很感兴趣。我将 mongoid 与黄瓜一起使用,所有用于在测试之间清除数据库的示例都使用 Rspec。我不太喜欢下面的解决方案,因为它不允许我在每个测试中也有单独的设置/拆卸方法,以及全局方法。 In Ruby's Test::Unit::TestCase, how do I override the initialize method?的可能重复 【参考方案1】:

假设您使用的是 Rails。只需在您的 test/test_helper.rb 文件中添加以下内容。

class ActiveSupport::TestCase
  setup :global_setup

  def global_setup
    #stuff to run before _every_ test.
  end
end

在 Rails 3.0.9 上测试。

【讨论】:

有没有办法确保先调用本地设置方法? @IsaacBetesh 不,我不这么认为。但是,我很确定您可以在代码中找到解决方法,因为这是一种非常标准的链接方式 - “本地设置之前的通用设置”。 (虽然我没有将其作为“事实”出售,但我只是说这更像是一个规则而不是一个例外;并且可以有反例)。【参考方案2】:

您可以只修补 Test::Unit::TestCase 并定义一个 setup 方法:

class Test::Unit::TestCase
  def setup
    puts 'in setup'
  end
end

而你的子类会默认使用这个:

class FooTest < Test::Unit::TestCase
  def test_truth
    assert true
  end
end

class BarTest < Test::Unit::TestCase
  def test_truth
    assert true
  end
end

如果测试用例需要有自己的设置,您需要先调用super 以确保全局设置运行:

class BazTest < Test::Unit::TestCase
  def setup
    super
    puts 'custom setup'
  end

  def test_truth
    assert true
  end
end

您真的需要进行全局设置吗,或者在Test::Unit::TestCase 上定义一个辅助方法并在需要它的测试中调用它会有所帮助吗?辅助方法方法对我的项目很有帮助——设置状态和意图在每个单独的测试中都更清晰,我不需要四处寻找一些“隐藏”的设置方法。很多时候,全局设置是一种代码异味,表明您需要重新考虑部分设计,但 YMMV。

更新

由于您使用的是 ActiveSupport,因此每次在测试用例中定义 setup 方法时,都不需要调用 super。我不知道它有多大价值,因为它需要调用不同的方法,并且任何开发人员都可以在测试用例中定义自己的 setup 方法,这将使此更改无效。这里是:

require 'rubygems'
require 'test/unit'
require 'active_support'
require 'active_support/test_case'

class ActiveSupport::TestCase

  def setup_with_global
    puts 'In Global setup'
    setup_without_global
  end

  alias_method_chain :setup, :global

end

class FooTest < ActiveSupport::TestCase

  def setup_without_global
    puts 'In Local setup'
  end

  def test_truth
    assert true
  end

end

【讨论】:

在这个项目中需要清除一些全局内存缓存,以免测试用例相互污染。总的来说,我同意这有点异味,但 IMO 在这里比要求开发人员记住调用助手并处理有时不可预测的后果更有意义。我想知道是否有某种方法可以避免在定义设置的每个子类中调用 super 。 ActiveSupport::TestCase 是否在设置/拆卸时提供此功能? 我在原始回复中添加了 - 不确定该解决方案是否能让您更接近。 毫无疑问,最好的解决方案是使用“超级”方法。不要使用 alias_method_chain。

以上是关于Test::Unit 中的全局设置和拆卸块的主要内容,如果未能解决你的问题,请参考以下文章

让 Jest 全局设置和全局拆卸在打字稿项目中工作

qt中的全局try and catch块

将 Locust 作为库运行时触发事件挂钩

全局变量局部变量闭包详解

C语言基础:作用域规则(局部变量,全局变量,形式参数)全局变量与局部变量在内存中的区别初始化局部变量和全局变量

检查变量是不是设置在全局范围内?