Как запускать сразу несколько единичных тестов Rails
Я часто запускаю различные тестовые группы, например:
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
, если имеется более одного файла.
Ответы
Ответ 1
Я в конечном итоге взломал это в свой 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
с произвольным списком тестовых файлов. Если есть только один файл, он запускает его как рубин напрямую (это экономит 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
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}"
Ответ 3
Там parallel_tests gem, который позволит вам запускать несколько тестов параллельно. После того, как вы получите его в своем Gemfile, вы можете просто запустить...
bundle exec parallel_test integration/test_*.rb
Для меня я настраиваю короткую задачу rake для запуска только тех тестов, которые я хочу.
Ответ 4
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
}
[email protected]:rails_app:$ suitup-multi-test-prepare
[email protected]:rails_app:$ suitup-multi-test-add test/functional/day_reports_controller_test.rb
[email protected]:rails_app:$ suitup-multi-test-add test/functional/month_reports_controller_test.rb
[email protected]:rails_app:$ suitup-multi-test-run