如何使用minitest运行所有测试?


70

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

现在,我想运行测试以找出是否损坏了任何东西。

测试是在最小的DSL中进行的。

我如何一次运行它们?

我搜索了适用的耙任务等,但未找到任何内容。


1
您是否进行了任何单独的测试?如果是这样,怎么办?
安德鲁·格林

Answers:


93

这是Rake :: TestTask的链接。

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

require 'rake/testtask'

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

如您所见,我假设我的文件全部在其中/lib,并且我的规格都在其中/spec并且已命名whatever_spec.rb

希望能帮助到你。


3
将您@locks提及的内容放入Rakefile中,即可开始运行rake test
Nick

使用minitest-metadata标签可以运行分布在不同目录中的所有测试吗?
buurkeey

29

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 

19

Rake::TestTask或多或少是在后台执行的操作:

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

注意:libtest/test*.rb(以上)是默认值,而testtest/*_test.rb分别是更典型的值。

来源:rake / testtask.rb在c34d9e0行169

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


文档链接在此处已断开。
亚当·斯皮尔斯

如此奇怪怎么./test/*_test.rb运作,但是没有test/*_test.rb。您也可以使用ruby -I lib -e 'ARGV.each { |f| load f }' test/*_test.rb似乎可以同时使用./test/*_test.rbtest/*_test.rb
mbigras

14

这是我的全部内容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'在每个测试文件的顶部。


这很好,除了事实是如果您使用bundler ...在这种情况下,每个require语句都将填充,因为gem不会在上$LOAD_PATH
Pablo Olmos de Aguilera C.

6

也可以通过Makefile完成。

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

运行make将运行所有测试。



3

仅使用Ruby标准库执行此操作的另一种方法是with 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,因此我们只需获取所有这些文件和/requirerequire_relative它们。在命令行中,require_relative失败,因此我们使用,require但首先将当前目录添加$LOAD_PATH-I .


1

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


-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)

这是非常昂贵的,因为对于您要运行的每个测试都需要一个ruby解释器。同样,这是很多代码,可以完成一件非常简单的事情。看看Theo的解决方案。它做同样的事情,效率更高,而且您也不需要rake
2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.