2011-01-24 4 views
59

Я загрузил исходный код для проекта, нашел ошибку и исправил ее.Как запустить все тесты с помощью minitest?

Теперь я хочу запустить тесты, чтобы узнать, не сломал ли я что-либо.

Тесты находятся в миниатюре DSL.

Как мне запустить все сразу?

Я искал применимые задачи рейка и т. Д., Но я не нашел их.

+1

Проводили ли вы какие-либо индивидуальные тесты? Если да, то как? –

ответ

84

Вот ссылка на Rake::TestTask.

На странице есть пример, чтобы вы начали.
я выложу еще одно, что я использую сейчас для гема:

require 'rake/testtask' 

Rake::TestTask.new do |t| 
    t.pattern = "spec/*_spec.rb" 
end 

Как вы можете видеть, я полагаю, что мои файлы находятся в /lib и что мои данных в /spec и названы whatever_spec.rb

Надеюсь, это поможет.

+0

Спасибо, замки. Это то, что я искал. – guai

+3

Помещение того, что вы нажимаете @locks в Rakefile, позволит вам просто запустить «rake test» – Nick

22

Ответы на блокировки лучше, но я также хотел указать, что вы также можете запустить minitest непосредственно из команды, как с помощью команды ruby. Для запуска тестов в спецификации файла/calculator_spec.rb перспективе:

$ ruby spec/calculator_spec.rb 

Не забудьте включить следующий код в файле calculator_spec.rb:

require 'minitest/spec' 
require 'minitest/autorun' 

Для запуска всех тестов в спецификации каталога/используйте следующую команду (см этот пост для более подробной информации Globbing doesn't work with Minitest - Only one file is run)

$ for file in spec/*.rb; do ruby $file; done 
16

Это то, что делает Rake::TestTask под капотом, более или менее:

ruby -Ilib -e 'ARGV.each { |f| require f }' ./test/test*.rb 

Примечание: lib & test/test*.rb (выше), по умолчанию, но test & test/*_test.rb, соответственно, более типичны.

Источник: rake/testtask.rb at c34d9e0 line 169

Если вы используете JRuby и хотите, чтобы избежать оплаты стоимости запуска дважды (один раз для Rake, а затем один раз для подпроцесса, что Rake начинается), просто использовать эту команду.

+0

. Ссылка на документацию здесь сломана. –

13

Вот мой весь 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. (Если бы установить камень MiniTest-репортер):

require 'minitest/reporters' 
Minitest::Reporters.use!(Minitest::Reporters::SpecReporter.new) 
require 'minitest/autorun' 

Я просто должен был require_relative './minitest_helper' в верхней части каждого из моих тестовых файлов.

+0

Это хорошо, за исключением факта, если вы используете bundler ... в этом случае каждая инструкция require будет заполняться, потому что драгоценные камни не будут на '$ LOAD_PATH'. –

-1

Если у вас нет грабли, попробуйте это:

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) 
+0

Это очень дорого, поскольку для каждого теста, который вы хотите запустить, требуется рубиновый интерпретатор. Также очень много кода для выполнения очень простой вещи. Посмотрите на решение Тео. Он делает то же самое, более эффективно, и вам также не нужно «грабли». – Overbryd

4

Это также может быть сделано с помощью Makefile.

default: 
    echo "Dir.glob('./test/*_test.rb').each { |file| require file}" | ruby 

make будет выполнять все ваши испытания.

1

Другой способ сделать это с использованием стандартной библиотеки 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 .

1

$ rake test выбежал из рельсов 5.0 коробки.

+0

Это не запускает мои системные тесты, а только тесты компонентов. –

Смежные вопросы