Как запустить все тесты с помощью minitest?
Я загрузил исходный код для проекта, нашел ошибку и исправил ее.
Теперь я хочу запустить тесты, чтобы узнать, что я что-то сломал.
Тесты находятся в минимальном DSL.
Как мне запустить их сразу?
Я искал применимые задачи rake и т.д., но я не нашел их.
Ответы
Ответ 1
Здесь ссылка на Rake:: TestTask.
На странице есть пример, чтобы вы начали.
Я отправлю еще один, который я использую прямо сейчас для драгоценного камня:
require 'rake/testtask'
Rake::TestTask.new do |t|
t.pattern = "spec/*_spec.rb"
end
Как вы можете видеть, я предполагаю, что мои файлы находятся в /lib
и что мои спецификации находятся в /spec
и называются whatever_spec.rb
Надеюсь, что это поможет.
Ответ 2
Ответы на блокировки лучше, но я также хотел указать, что вы также можете запустить minitest непосредственно из команды, как с помощью команды ruby. Для запуска тестов в файле spec/calculator_spec.rb выполните:
$ ruby spec/calculator_spec.rb
Не забудьте включить следующий код в файл calculator_spec.rb:
require 'minitest/spec'
require 'minitest/autorun'
Чтобы запустить все тесты в каталоге spec/, используйте следующую команду (см. это сообщение для более подробной информации Globbing не работает с Minitest - выполняется только один файл)
$ for file in spec/*.rb; do ruby $file; done
Ответ 3
Это то, что Rake::TestTask
работает под капотом, более или менее:
ruby -Ilib -e 'ARGV.each { |f| require f }' ./test/test*.rb
Примечание: lib
и test/test*.rb
(см. выше) являются значениями по умолчанию, но более типичны test
и test/*_test.rb
.
Источник: rake/testtask.rb в строке c34d9e0 169
Если вы используете JRuby и хотите не платить стоимость запуска дважды (один раз для Rake, а затем один раз для подпроцесса, который запускает Rake), просто используйте эту команду.
Ответ 4
Вот мой весь rakefile
, который я поместил в свою верхнюю директорию:
task :default => :test
task :test do
Dir.glob('./test/*_test.rb').each { |file| require file}
end
Чтобы запустить все мои тестовые файлы сразу, я просто набираю rake
. Что это!
Убедитесь, что require 'minitest/autorun'
находится в верхней части каждого из ваших файлов Minitest. Dir.glob определенно работает с Minitest.
Чтобы получить красивую, цветную версию Minitest с именами всех моих тестовых методов, у меня есть файл minitest_helper.rb
в каталоге my/test. (Требуется установить миниатюрный репортер):
require 'minitest/reporters'
Minitest::Reporters.use!(Minitest::Reporters::SpecReporter.new)
require 'minitest/autorun'
Мне просто нужно было require_relative './minitest_helper'
в верхней части каждого из моих тестовых файлов.
Ответ 5
Это также можно сделать с помощью Makefile.
default:
echo "Dir.glob('./test/*_test.rb').each { |file| require file}" | ruby
running make
выполнит все ваши тесты.
Ответ 6
Другой способ сделать это, используя только стандартную библиотеку Ruby, - Dir.glob
. Изнутри рубинового файла это будет выглядеть так:
require "minitest/autorun"
Dir.glob("**/*Test.rb") { |f| require_relative(f) }
Или из командной строки вы можете использовать эту команду:
ruby -I . -e "require 'minitest/autorun'; Dir.glob('**/*Test.rb') { |f| require(f) }"
Dir.glob('**/*Test.rb')
рекурсивно ищет текущий каталог для любого файла, который соответствует *Test.rb
, поэтому мы просто берем все эти файлы и require
или require_relative
их. Из командной строки require_relative
завершается сбой, поэтому мы используем require
, но сначала добавим текущий каталог в $LOAD_PATH
через -I .
Ответ 7
$ rake test
закончилось окно с рельсами 5.0.
Ответ 8
Если у вас нет грабли, попробуйте следующее:
http://blog.gingergriffis.com/post/85871430778/ruby-how-to-run-all-tests-in-a-directory
# run_all_tests.rb
require 'find'
require 'optparse'
options = {
:exclude => [],
}
OptionParser.new do |opts|
opts.on('--exclude Comma Separated String',
'Test scripts to exclude') do |css|
options[:exclude] = css.split(',')
end
end.parse!
commands = []
Find.find(File.dirname(__FILE__)) do |path|
Find.prune if path =~ /#{__FILE__}$/
if !File.directory?(path) && (path =~ /(.*)\.rb$/)
if options[:exclude].none? {|e| path.include?(e)}
commands << "ruby #{path}"
end
end
end
command_string = commands.join(" && ")
exec(command_string)