使用 Test::Unit,如何在所有测试(但不是每个测试)之前运行一些代码?

Posted

技术标签:

【中文标题】使用 Test::Unit,如何在所有测试(但不是每个测试)之前运行一些代码?【英文标题】:With Test::Unit, how can I run a bit of code before all tests (but not each test)? 【发布时间】:2011-10-11 16:36:31 【问题描述】:

在我使用 test::unit 的测试应用程序中,我需要首先从各种来源提取大量数据。我只想这样做一次 - 数据只是读取,而不是写入,并且在测试之间不会更改,并且加载(以及加载错误检查)需要一些时间。

我确实希望每次都重置一些值,这些值很容易,但如果我想要持久可访问的值怎么办?最好的方法是什么?

我对可以让我将这些分配推送到可以包含在我所有测试中的某个模块的解决方案特别感兴趣,因为它们都需要访问这些数据。

【问题讨论】:

非常相似的问题,除了 OP 希望在单个测试套件之前运行一些代码,而不是在所有测试套件之前:***.com/questions/255969/… 【参考方案1】:

为什么在测试中需要它?你可以全局定义它:

gem 'test-unit'#, '>= 2.1.1' #startup
require 'test/unit'

GLOBAL_DATA = 11

class My_Tests < Test::Unit::TestCase

  def test_1()
    puts "Testing startup 1"
    assert_equal(11, GLOBAL_DATA)
  end
end

GLOBAL_DATA 可以是(单例)类(相应的实例)。

如果你只有一个测试类,你可以使用 TestCase.startup:

gem 'test-unit'#, '>= 2.1.1' #startup
require 'test/unit'


class My_Tests < Test::Unit::TestCase
  def self.startup
    puts "Define global_data "
    @@global_data = 11
  end

  def test_1()
    puts "Testing 1"
    assert_equal(11,     @@global_data = 11)
  end
  def test_2()
    puts "Testing 2"
    assert_equal(11,     @@global_data = 11)
  end
end

【讨论】:

【参考方案2】:

您可以将它们放在班级的首位。它们将被执行,然后您的测试将被执行。

【讨论】:

【参考方案3】:

您可以在设置方法中执行此操作:

  def setup
    if !defined?(@@initial_data)
      # Whatever you need to do to get your initial data
      @@initial_data = foo
    end
    @other_data = bar
  end

【讨论】:

以上是关于使用 Test::Unit,如何在所有测试(但不是每个测试)之前运行一些代码?的主要内容,如果未能解决你的问题,请参考以下文章

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

如何在 Ruby 2.2 上运行现有的测试代码

流星测试:Mocha没有找到所有测试文件

如何使用 boost C++ 开始单元测试

车载测试系列:CANoe之Test Module和Test Unit组件

如何在测试之间重复使用 Capybara 会话?