17

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

rake test:units
rake test:functionals

我也喜欢运行单独的测试文件或单独的测试:

ruby -Itest test/unit/file_test.rb
ruby -Itest test/unit/file_test.rb -n '/some context Im working on/'

还有:

rake test TEST=test/unit/file_test.rb

我什至在我的 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

我还没有弄清楚如何在命令行运行多个临时测试。换句话说,我怎样才能将 test_files 注入到 rake 任务中。就像是:

rake test TEST=test/unit/file_test.rb,test/functional/files_controller_test.rb

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

4

4 回答 4

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}"
于 2013-03-16T23:28:16.217 回答
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"

然后我启动了这个 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
}
于 2011-07-11T22:20:54.067 回答
2

有一个parallel_tests gem可以让你并行运行多个测试。一旦你把它放在你的 Gemfile 中,你就可以运行...

bundle exec parallel_test integration/test_*.rb

对我来说,我设置了一个简短的 rake 任务来只运行我想要的测试。

于 2012-02-13T21:36:12.563 回答
0

Bash 脚本

RUBY_MULTI_TEST="/tmp/ruby_multi_test.rb"

function suitup-multi-test-prepare {
  sudo rm $RUBY_MULTI_TEST 2> /dev/null
}

function suitup-multi-test-add {
  WORK_FOLDER=`pwd`
  echo "require '$WORK_FOLDER/$1' " >> $RUBY_MULTI_TEST
}

function suitup-multi-test-status {
  cat $RUBY_MULTI_TEST 2> /dev/null
}

function suitup-multi-test-run {
  suitup-multi-test-status
  ruby -I test/ $RUBY_MULTI_TEST
}

ery@tkpad:rails_app:$ suitup-multi-test-prepare
ery@tkpad:rails_app:$ suitup-multi-test-add test/functional/day_reports_controller_test.rb
ery@tkpad:rails_app:$ suitup-multi-test-add test/functional/month_reports_controller_test.rb
ery@tkpad:rails_app:$ suitup-multi-test-run
于 2013-07-31T09:53:32.677 回答