ruby on rails - test - Cómo ejecutar múltiples pruebas unitarias de Rails a la vez
test controller rails rspec (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
}
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
A menudo corro los diferentes grupos de prueba como:
rake test:units
rake test:functionals
También me gusta ejecutar archivos de prueba individuales o pruebas individuales:
ruby -Itest test/unit/file_test.rb
ruby -Itest test/unit/file_test.rb -n ''/some context Im working on/''
También hay:
rake test TEST=test/unit/file_test.rb
E incluso he creado agrupaciones personalizadas en mi 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
Lo que aún no he descubierto es cómo ejecutar varias pruebas ad hoc en la línea de comandos. En otras palabras, ¿cómo puedo inyectar archivos de prueba en la tarea de rake? Algo como:
rake test TEST=test/unit/file_test.rb,test/functional/files_controller_test.rb
Entonces podría ejecutar una función de shell tomando parámetros arbitrarios y ejecutar la prueba rápida de prueba de ruby -Itest
, o una tarea de rake
si hay más de un archivo.
Hay una gema de pruebas de paralelismo que te permitirá ejecutar varias pruebas en paralelo. Una vez que lo tengas en tu Gemfile, puedes correr como ...
bundle exec parallel_test integration/test_*.rb
Para mi configuré una tarea de rake corto para ejecutar solo las pruebas que quiero.
Terminé hackeando esto en mi RakeFile de la misma manera:
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"
Luego activé esta función de bash que te permite llamar a rt
con una lista arbitraria de archivos de prueba. Si solo hay un archivo, se ejecuta como ruby directamente (esto ahorra 8 segundos para mi aplicación de 50k loc), de lo contrario ejecuta la tarea de 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
}
bundle exec ruby -I.:test -e "ARGV.each{|f| require f}" file1 file1
o:
find test -name ''*_test.rb'' | xargs -t bundle exec ruby -I.:test -e "ARGV.each{|f| require f}"