【发布时间】:2018-09-02 11:08:26
【问题描述】:
我下载了一个项目的源代码,发现了一个错误并修复了它。
现在我想运行测试,看看我是否破坏了任何东西。
测试在 minitest DSL 中。
如何一次运行它们?
我搜索了适用的 rake 任务等,但没有找到。
【问题讨论】:
-
您是否运行了任何单独的测试?如果有,怎么做?
我下载了一个项目的源代码,发现了一个错误并修复了它。
现在我想运行测试,看看我是否破坏了任何东西。
测试在 minitest DSL 中。
如何一次运行它们?
我搜索了适用的 rake 任务等,但没有找到。
【问题讨论】:
这是Rake::TestTask的链接。
页面中有一个示例可以帮助您入门。
我将发布另一个我现在正在使用的 gem:
require 'rake/testtask'
Rake::TestTask.new do |t|
t.pattern = "spec/*_spec.rb"
end
如您所见,我假设我的文件都在 /lib 中,并且我的规格在 /spec 中并命名为 whatever_spec.rb
希望对你有帮助。
【讨论】:
rake test
locks 的答案更好,但我还想指出,您也可以像使用 ruby 命令一样直接从命令运行 minitest。要在 spec/calculator_spec.rb 文件中运行测试,请运行:
$ ruby spec/calculator_spec.rb
记得在calculator_spec.rb 文件中包含以下代码:
require 'minitest/spec'
require 'minitest/autorun'
要运行 spec/ 目录中的所有测试,请使用以下命令(有关更多详细信息,请参阅此帖子Globbing doesn't work with Minitest - Only one file is run)
$ for file in spec/*.rb; do ruby $file; done
【讨论】:
这就是 Rake::TestTask 在幕后所做的,或多或少:
ruby -Ilib -e 'ARGV.each { |f| require f }' ./test/test*.rb
注意:lib 和 test/test*.rb(上图)是默认值,但 test 和 test/*_test.rb 更典型。
来源:rake/testtask.rb at c34d9e0 line 169
如果您使用 JRuby 并希望避免支付两次启动成本(一次用于 Rake,一次用于 Rake 启动的子进程),只需使用该命令即可。
【讨论】:
./test/*_test.rb 的工作方式太奇怪了,test/*_test.rb 却不行。您还可以使用ruby -I lib -e 'ARGV.each { |f| load f }' test/*_test.rb,这似乎适用于./test/*_test.rb 和test/*_test.rb
这是我的整个rakefile,我把它放在我的顶级目录中:
task :default => :test
task :test do
Dir.glob('./test/*_test.rb').each { |file| require file}
end
要一次运行所有测试文件,我只需输入rake。就是这样!
确保在每个 Minitest 文件的顶部都有 require 'minitest/autorun'。 Dir.glob 绝对可以与 Minitest 一起使用。
为了获得漂亮的彩色 Minitest 输出,以及我所有测试方法的名称,我的 /test 目录中有文件 minitest_helper.rb。 (必须安装 gem minitest-reporters):
require 'minitest/reporters'
Minitest::Reporters.use!(Minitest::Reporters::SpecReporter.new)
require 'minitest/autorun'
我只需要在每个测试文件的顶部添加require_relative './minitest_helper'。
【讨论】:
$LOAD_PATH 上。
rake 时,我根本没有得到任何输出。我没有使用记者,我需要吗?
这也可以通过 Makefile 来完成。
default:
echo "Dir.glob('./test/*_test.rb').each { |file| require file}" | ruby
运行 make 将运行您的所有测试。
【讨论】:
$ rake test 跑出了 rails 5.0 的盒子。
【讨论】:
另一种仅使用 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 .
【讨论】:
我意识到这是一个非常古老的问题,但 rake test 在 Rails 4.2 中为我工作,包括 test/ 下的文件以及 test/integration/、test/unit/ 等。
【讨论】:
如果你没有耙子,试试这个:
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)
【讨论】:
rake。