74

我下载了一个项目的源代码,发现了一个错误并修复了它。

现在我想运行测试,看看我是否破坏了任何东西。

测试在 minitest DSL 中。

我如何一次运行它们?

我搜索了适用的 rake 任务等,但没有找到。

4

9 回答 9

95

这是Rake::TestTask的链接。

页面中有一个示例可以帮助您入门。
我将发布另一个我现在正在使用的宝石:

require 'rake/testtask'

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

如您所见,我假设我的文件都在/lib里面,并且我的规格在里面/spec并且被命名whatever_spec.rb

希望能帮助到你。

于 2011-02-11T07:39:55.880 回答
30

locks 的答案更好,但我还想指出,您也可以像使用 ruby​​ 命令一样直接从命令运行 minitest。要在 spec/calculator_spec.rb 文件中运行测试,请运行:

$ ruby spec/calculator_spec.rb 

请记住在calculator_spec.rb 文件中包含以下代码:

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

要运行 spec/ 目录中的所有测试,请使用以下命令(有关详细信息,请参阅这篇文章Globbing 不适用于 Minitest - 仅运行一个文件

$ for file in spec/*.rb; do ruby $file; done 
于 2013-02-20T15:08:52.930 回答
19

Rake::TestTask或多或少是在幕后做的:

ruby -Ilib -e 'ARGV.each { |f| require f }' ./test/test*.rb

注意:lib& test/test*.rb(上图)是默认值,但test&test/*_test.rb分别更典型。

来源:c34d9e0 第 169 行的 rake/testtask.rb

如果您使用 JRuby 并希望避免两次支付启动成本(一次用于 Rake,然后一次用于 Rake 启动的子进程),只需使用该命令即可。

于 2013-12-19T08:55:53.140 回答
16

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

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

要一次运行所有测试文件,我只需键入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-13T23:07:55.530 回答
7

这也可以通过 Makefile 来完成。

default:
  echo "Dir.glob('./test/*_test.rb').each { |file| require file}" | ruby

runningmake将运行您的所有测试。

于 2014-06-09T20:02:40.067 回答
4

$ rake test跑出了rails 5.0的盒子。

于 2016-11-10T20:17:13.923 回答
3

另一种仅使用 Ruby 标准库的方法是使用Dir.glob. 在 ruby​​ 文件中,它看起来像这样:

require "minitest/autorun"

Dir.glob("**/*Test.rb") { |f| require_relative(f) }

或者从命令行,您可以使用以下命令:

ruby -I . -e "require 'minitest/autorun'; Dir.glob('**/*Test.rb') { |f| require(f) }"

Dir.glob('**/*Test.rb')递归搜索当前目录以查找匹配的任何文件*Test.rb,因此我们只需获取所有这些文件和require/或require_relative它们。从命令行,require_relative失败,所以我们使用require但首先将当前目录添加到$LOAD_PATH通过-I .

于 2015-07-27T18:45:32.403 回答
1

我意识到这是一个非常古老的问题,但rake test在 Rails 4.2 中对我有用,包括 test/ 下的文件以及 test/integration/、test/unit/ 等。

于 2018-09-02T03:08:26.573 回答
-1

如果你没有耙子,试试这个:

http://blog.gingergriffis.com/post/85871430778/ruby-how-to-run-all-tests-in-a-directory

# run_all_tests.rb

require 'find'
require 'optparse'

options = {
  :exclude => [],
}

OptionParser.new do |opts|
  opts.on('--exclude Comma Separated String',
          'Test scripts to exclude') do |css|
    options[:exclude] = css.split(',')
  end
end.parse!

commands = []

Find.find(File.dirname(__FILE__)) do |path|
  Find.prune if path =~ /#{__FILE__}$/
    if !File.directory?(path) && (path =~ /(.*)\.rb$/)
      if options[:exclude].none? {|e| path.include?(e)}
        commands << "ruby #{path}"
      end
    end
end
command_string = commands.join(" && ")
exec(command_string)
于 2014-05-16T01:27:54.737 回答