Как запустить несколько модульных тестов Rails одновременно - PullRequest
17 голосов
/ 12 июля 2011

Я часто запускаю различные тестовые группы, такие как:

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

Тогда я мог бы запустить функцию оболочки, принимающую произвольные параметры, и запустить быстрый одиночный тест ruby -Itest или задачу rake, если существует более одного файла.

Ответы [ 4 ]

17 голосов
/ 17 марта 2013

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}"

12 голосов
/ 12 июля 2011

В итоге я взломал это в свой 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 ​​напрямую (это экономит 8 секунд для моего приложения 50k loc), в противном случае он запускает задачу 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
}
2 голосов
/ 14 февраля 2012

Существует гем parallel_tests , который позволит вам запускать несколько тестов параллельно.После того, как он у вас есть в вашем Gemfile, вы можете просто запустить его как ...

bundle exec parallel_test integration/test_*.rb

Для меня я настроил задачу с короткими граблями, чтобы запускать только те тесты, которые мне нужны.

0 голосов
/ 31 июля 2013

Bash Script

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
...