47

我是一个相当新手的测试人员,但一直试图在 Rails 中的 TDD 方面做得更好。

RSpec 效果很好,但我的测试很慢。我听说 MiniTest 要快得多,而且 MiniTest/Spec DSL 看起来与我习惯使用 RSpec 的方式非常相似,所以我想我会试一试。

但是,我无法在网络上找到任何提供如何设置和运行 Minitest 的演练。我从 RSpec 书中学习了如何测试,但我不知道 Test::Unit 或 MiniTest 应该如何工作。我的 gemfile 中有 gem,我编写了一些简单的测试,但我不知道将它们放在哪里或如何运行它们。我认为这是显而易见的事情之一,没有人费心把它写下来……

谁能向我解释如何设置一些 Minitest/spec 文件并让它们运行,以便我可以将性能与 Rspec 进行比较?

编辑

具体来说,这些是我最需要知道的基础知识:

  1. 您是否需要一个 test_helper 文件(如 spec_helper),如果需要,您如何创建它?
  2. 你如何运行迷你测试?似乎没有等价于rspec specor rspec path/to/file_spec.rb,我错过了什么?

谢谢!

4

7 回答 7

40

这个问题类似于How to run all tests with minitest?

使用 Ruby 1.9.3 和 Rake 0.9.2.2,给定这样的目录布局:

Rakefile
lib/alpha.rb
spec/alpha_spec.rb

以下是alpha_spec.rb可能的样子:

require 'minitest/spec'
require 'minitest/autorun'  # arranges for minitest to run (in an exit handler, so it runs last)

require 'alpha'

describe 'Alpha' do
  it 'greets you by name' do
    Alpha.new.greet('Alice').must_equal('hello, Alice')
  end
end

这是Rakefile

require 'rake'
require 'rake/testtask'

Rake::TestTask.new do |t|
  t.pattern = 'spec/**/*_spec.rb'
end

你可以跑

  • 所有测试: rake test
  • 一项测试: ruby -Ilib spec/alpha_spec.rb

我不知道使用spec_helper.rbwith minitest 是否常见。似乎没有一种方便的加载方法。将此添加到 Rakefile:

require 'rake'
require 'rake/testtask'

Rake::TestTask.new do |t|
  t.pattern = 'spec/**/*_spec.rb'
  t.libs.push 'spec'
end

然后spec/spec_helper.rb可以包含各种多余的东西:

require 'minitest/spec'
require 'minitest/autorun'
require 'alpha'

并将spec/alpha_spec.rb多余的部分替换为:

require 'spec_helper'
  • 所有测试: rake test
  • 一项测试: ruby -Ilib -Ispec spec/alpha_spec.rb
于 2011-12-06T03:59:02.760 回答
5

请注意,watchr 或 spork 不是运行测试的要求。它们为进行自动测试提供了便利。但是运行一组 MiniTest 测试的最基本方法是使用 ruby​​ 本身:

$ ruby myfileoftests.rb
于 2011-10-07T04:45:17.493 回答
4

您使用的是哪个版本的 Ruby?

据我了解,1.9 引入了完全MiniTest替换Test::Unit的 向后兼容的 API。因此,如果您使用的是 1.9 并且您的 Rails 应用程序引用Test::Unit,它实际上已经在使用MiniTest.

看看你的 Ruby 源代码 - test/unit.rb1.9.2 有以下要求:

require 'minitest/unit'
require 'test/unit/assertions'
require 'test/unit/testcase'

test/unit/assertions包括MiniTest::Assertions.


让你的测试运行得更快是另一门黑暗的艺术。看看sporkwatchr。前者使您的应用程序保持初始化,重新加载修改过的文件,并在每次运行测试套件之前分叉。后者监视您的存储库中的文件以进行更改,并自动运行它们相关的测试用例。

它们一起为您提供了一个非常简单的 TDD 设置。您为新模型编写了一个测试用例,它会自动运行并失败。然后,每当您保存关联的模型时,该测试用例就会非常快速地重新运行。您几乎可以立即获得有关您是红/绿的反馈。

它们在设置和表现良好时都有点棘手,所以如果你遇到困难,请回来查看更多问题。

祝你好运!

于 2011-08-28T22:39:51.290 回答
3

查看这个minitest-rails 的入门视频。它介绍了为 Rails 应用程序设置 Minitest 的过程。

http://www.youtube.com/watch?v=xA2f2zBNvsc

该演练展示了如何创建帮助文件以及如何使用 rake 任务运行测试。如果要运行特定测试,可以使用以下方法:

ruby -Itest test/models/user_test.rb
于 2012-07-27T16:34:43.600 回答
1

较新版本的 RSpec(自 2012 年 1 月发布的 2.8 起)具有显着的速度提升。 是对性能差异的探索以及与 MiniTest 的比较。

另外,我发现Ryan Bates 的这个截屏视频很好地介绍了 MiniTest。请注意,这是专业视频之一,您需要订阅才能观看。

于 2012-05-20T18:14:33.890 回答
1

这是我的全部rakefile,我把它放在我的顶级目录中:

task :default => :test
task :test do
  Dir.glob('./test/*_test.rb').each { |file| require file}
end

要一次运行所有 Minitest 文件,我只需键入rake. 就是这样!

确保require 'minitest/autorun'在每个 Minitest 文件的顶部都有。Dir.glob 绝对可以与 Minitest 一起使用。

为了获得漂亮、彩色的 Minitest 输出,以及我所有测试方法的名称,我minitest_helper.rb在 /test 目录中有该文件。(必须安装 gem minitest-reporters):

require 'minitest/reporters'
Minitest::Reporters.use!(Minitest::Reporters::SpecReporter.new)
require 'minitest/autorun'

我只需要require_relative './minitest_helper'在每个测试文件的顶部。

于 2014-05-14T01:11:10.087 回答
0

帕特里克写了一个非常好的解释和例子。对于未来的读者,请注意全局期望现在已被贬值,并将在 Minitest 6 中删除。它需要在将您正在测试的东西包装在对expect.

require 'minitest/spec'
require 'minitest/autorun'  # arranges for minitest to run (in an exit handler, so it runs last)

require 'alpha'

describe 'Alpha' do
  it 'greets you by name' do
    expect(Alpha.new.greet('Alice')).must_equal('hello, Alice')
  end
end
于 2018-07-09T16:17:13.243 回答