如何一次运行多个Rails单元测试

gtd*_*gtd 17 ruby ruby-on-rails testunit

我经常运行各种测试组,如:

rake test:units
rake test:functionals
Run Code Online (Sandbox Code Playgroud)

我还想运行单独的测试文件或单独的测试:

ruby -Itest test/unit/file_test.rb
ruby -Itest test/unit/file_test.rb -n '/some context Im working on/'
Run Code Online (Sandbox Code Playgroud)

还有:

rake test TEST=test/unit/file_test.rb
Run Code Online (Sandbox Code Playgroud)

我甚至在我的Rakefile中创建了自定义分组:

  Rake::TestTask.new(:ps3) do |t|
    t.libs << 'test'
    t.verbose = true
    t.test_files = FileList["test/unit/**/ps3_*_test.rb", "test/functional/services/ps3/*_test.rb"]
  end
Run Code Online (Sandbox Code Playgroud)

我还没想到的是如何在命令行运行多个临时测试.换句话说,我如何将test_files注入rake任务.就像是:

rake test TEST=test/unit/file_test.rb,test/functional/files_controller_test.rb
Run Code Online (Sandbox Code Playgroud)

然后我可以运行一个带有任意参数的shell函数并运行快速ruby -Itest单一测试,或者rake如果有多个文件则执行任务.

小智 17

bundle exec ruby -I.:test -e "ARGV.each{|f| require f}" file1 file1

要么:

find test -name '*_test.rb' | xargs -t bundle exec ruby -I.:test -e "ARGV.each{|f| require f}"


gtd*_*gtd 12

我自己就这样把自己闯进了我的RakeFile:

Rake::TestTask.new(:fast) do |t|
  files = if ENV['TEST_FILES']
    ENV['TEST_FILES'].split(',')
  else
    FileList["test/unit/**/*_test.rb", "test/functional/**/*_test.rb", "test/integration/**/*_test.rb"]
  end

  t.libs << 'test'
  t.verbose = true
  t.test_files = files
end
Rake::Task['test:fast'].comment = "Runs unit/functional/integration tests (or a list of files in TEST_FILES) in one block"
Run Code Online (Sandbox Code Playgroud)

然后我掀起了这个bash函数,它允许你rt使用任意测试文件列表进行调用.如果只有一个文件,则直接将其作为ruby运行(这为我的50k loc应用程序节省了8秒),否则它将运行rake任务.

function rt {
  if [ $# -le 1 ] ; then
    ruby -Itest $1
  else
    test_files = ""
    while [ "$1" != "" ]; do
      if [ "$test_files" == "" ]; then
        test_files=$1
      else
        test_files="$test_files,$1"
      fi
      shift
    done
    rake test:fast TEST_FILES=$test_files
  fi
}
Run Code Online (Sandbox Code Playgroud)