【问题标题】:How to run all tests with minitest?如何使用 minitest 运行所有测试?
【发布时间】:2018-09-02 11:08:26
【问题描述】:

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

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

测试在 minitest DSL 中。

如何一次运行它们?

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

【问题讨论】:

  • 您是否运行了任何单独的测试?如果有,怎么做?

标签: ruby minitest


【解决方案1】:

这是Rake::TestTask的链接。

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

require 'rake/testtask'

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

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

希望对你有帮助。

【讨论】:

  • 把你@locks 提到的东西放在一个Rakefile 中将允许你运行rake test
  • 是否可以使用 minitest-metadata 标签运行分布在不同目录中的所有测试?
【解决方案2】:

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 

【讨论】:

    【解决方案3】:

    这就是 Rake::TestTask 在幕后所做的,或多或少:

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

    注意:libtest/test*.rb(上图)是默认值,但 testtest/*_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.rbtest/*_test.rb
    【解决方案4】:

    这是我的整个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'

    【讨论】:

    • 这很好,除非你使用 bundler... 在这种情况下,每个 require 语句都会被填满,因为 gem 不会在 $LOAD_PATH 上。
    • 当我运行rake 时,我根本没有得到任何输出。我没有使用记者,我需要吗?
    【解决方案5】:

    这也可以通过 Makefile 来完成。

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

    运行 make 将运行您的所有测试。

    【讨论】:

      【解决方案6】:

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

      【讨论】:

      • 这不运行我的系统测试,只运行组件测试。
      【解决方案7】:

      另一种仅使用 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 匹配的任何文件,因此我们只需获取所有这些文件以及requirerequire_relative 它们。从命令行,require_relative 失败,所以我们使用require 但首先将当前目录添加到$LOAD_PATH-I .

      【讨论】:

        【解决方案8】:

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

        【讨论】:

          【解决方案9】:

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

          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
          猜你喜欢
          • 1970-01-01
          • 2014-10-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-04-21
          相关资源
          最近更新 更多