【问题标题】:How to run a full MiniTest suite without Rake?如何在没有 Rake 的情况下运行完整的 MiniTest 套件?
【发布时间】:2012-05-22 17:07:26
【问题描述】:

已经看过this question,这或多或少反映了我目前运行整个套件的方式。

此外,我还设置了以下 rake 任务:

Rake::TestTask.new do |t|
  t.name = "spec:models"
  t.libs << "test"
  t.pattern = "spec/models/*_spec.rb"
end

但是我注意到当我使用time rake spec:models 运行它时,它在大约 2.36 秒内完成。如果我使用ruby /path/to/spec.rb 运行该目录中的所有单独测试(目前所有测试都与 ActiveRecord 隔离 - 还没有持久性,非常快),它们的累积总用户时间为 2.36 秒,但我也注意到每个文件从开始到结束执行需要 0.4 个用户秒,MiniTest 报告的实际“测试”时间要快得多(这样我的整个套件,在加载依赖项后,应该在不到 0.15 秒的时间内执行,而不是 2.36 秒)。

示例(针对一个规范文件):

Started

11/11:         100% |======================================| Time: 00:00:00

Finished in 0.02223s
11 tests, 15 assertions, 0 failures, 0 errors, 0 skips
ruby path/to/spec.rb  0.43s user 0.06s system 88% cpu 0.559 total

我怀疑 Rake 会在每次测试执行之间重新加载库,这会占用额外的时间。无论如何我可以验证这一点,或者在不使用 Rake 的情况下运行我的整个套件吗?

顺便说一句,当我前面说“用户时间”时,我指的是通过在我的 ruby​​ 命令前面加上 time 输出的第一个数字来运行单个测试文件,所以 time ruby /path/to/spec.rb = ruby path/to/spec.rb 0.43s user 0.06s system 88% cpu 0.559 total

【问题讨论】:

  • 你找到解决方案了吗?

标签: ruby-on-rails ruby rake minitest


【解决方案1】:

在项目的顶级目录中创建一个文件spec.rb

$:<<'spec'  # add to load path
files = Dir.glob('spec/**/*.rb') 
files.each{|file| require file.gsub(/^spec\/|.rb$/,'')}  

运行它:

ruby spec.rb

如果这对您有用,您可以根据需要重命名 spec.rb 文件,或将其移动到更好的位置,或根据需要更改加载路径等。

【讨论】:

    【解决方案2】:

    这将在文件名末尾带有 _spec.rb 的 spec 目录和子目录中运行所有测试:

    ruby -Itest spec/**/*_spec.rb
    

    【讨论】:

    • 嗯,这似乎只运行一个文件(我的最终输出 ruby -Itest spec/models/*_spec.rb 显示完成了 5 个测试,而上面运行 rake spec:models 显示完成了 77 个测试)。那是怎么回事?
    • 我想知道为什么 Matthew 的建议对我也不起作用。
    • 我认为您可能需要在 spec/**/_spec.rb 周围加上引号,否则您的 shell 会将其扩展,我怀疑只有一个文件,除非您使用的 shell 可以理解该符号.
    • 看起来所有这些 cmets 都没有正确使用递归子目录的通配符语法。 **/* 必须完全相同。我已经在 bash 和 zsh 中进行了测试。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-17
    • 1970-01-01
    • 2012-11-08
    • 2019-01-15
    • 2012-07-04
    • 2021-09-08
    相关资源
    最近更新 更多