Как настроить MiniTest? - PullRequest
       32

Как настроить MiniTest?

47 голосов
/ 16 июля 2011

Я довольно начинающий тестировщик, но пытался стать лучше в TDD в Rails.

RSpec работает отлично, но мои тесты довольно медленные. Я слышал, что MiniTest намного быстрее, а MiniTest / Spec DSL выглядит очень похоже на то, как я привык работать с RSpec, поэтому я решил попробовать.

Тем не менее, я не смог найти в Интернете ничего, что предоставило бы пошаговое руководство по настройке и запуску Minitest. Я научился тестировать из книги RSpec, и я понятия не имею, как должны работать Test :: Unit или MiniTest. У меня есть драгоценный камень в моем gemfile, я написал несколько простых тестов, но я понятия не имею, где их поставить или как их запустить. Я полагаю, что это одна из тех вещей, которые настолько очевидны, что никто не удосужился записать это ...

Может кто-нибудь объяснить мне, как настроить некоторые файлы Minitest / spec и запустить их, чтобы я мог сравнить производительность с Rspec?

EDIT

В частности, это те основы, которые мне больше всего нужно знать:

  1. Вам нужен файл test_helper (например, spec_helper) и если да, то как его создать?
  2. Как вы запускаете мини-тест? Кажется, что нет эквивалента rspec spec или rspec path/to/file_spec.rb, что мне не хватает?

Спасибо!

Ответы [ 7 ]

40 голосов
/ 06 декабря 2011

Этот вопрос похож на Как запустить все тесты с помощью minitest?

Используя Ruby 1.9.3 и Rake 0.9.2.2, с учетом макета каталога, подобного этому:

Rakefile
lib/alpha.rb
spec/alpha_spec.rb

Вот как alpha_spec.rb может выглядеть:

require 'minitest/spec'
require 'minitest/autorun'  # arranges for minitest to run (in an exit handler, so it runs last)

require 'alpha'

describe 'Alpha' do
  it 'greets you by name' do
    Alpha.new.greet('Alice').must_equal('hello, Alice')
  end
end

А вот и Rakefile

require 'rake'
require 'rake/testtask'

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

Вы можете запустить

  • все тесты: rake test
  • один тест: ruby -Ilib spec/alpha_spec.rb

Я не знаю, является ли использование spec_helper.rb с минимальным тестом распространенным или нет. По-видимому, нет удобного способа загрузки. Добавьте это в Rakefile:

require 'rake'
require 'rake/testtask'

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

Тогда spec/spec_helper.rb может содержать различные избыточные вещи:

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

И spec/alpha_spec.rb заменяет избыточные части на:

require 'spec_helper'
  • все тесты: rake test
  • один тест: ruby -Ilib -Ispec spec/alpha_spec.rb
4 голосов
/ 07 октября 2011

Обратите внимание, что watchr или spork не являются требованиями для запуска тестов.Они удобны для проведения автотестов.Но самый простой способ запустить набор тестов MiniTest - это сам Ruby:

$ ruby myfileoftests.rb
4 голосов
/ 29 августа 2011

Какую версию Ruby вы используете?

В моем понимании 1.9 представил MiniTest, который полностью заменяет Test::Unit, с обратно совместимым API.Так что, если вы на 1.9 и ваше приложение Rails ссылается на Test::Unit, оно уже использует MiniTest.

Посмотрите на ваш источник Ruby - test/unit.rb для 1.9.2 имеет следующие требования:

require 'minitest/unit'
require 'test/unit/assertions'
require 'test/unit/testcase'

И test/unit/assertions включает в себя MiniTest::Assertions.


Получение тестов для ускорения работы - это совсем другое темное искусство.Взгляните на spork и watchr .Первый сохраняет ваше приложение инициализированным, перезагружает измененные файлы и разветвляется перед каждым запуском вашего набора тестов.Последний следит за изменениями в вашем репозитории и автоматически запускает связанные с ними тестовые случаи.

Вместе они дают довольно простую настройку TDD.Вы пишете тестовый пример для своей новой модели, и он автоматически запускается и дает сбой.Затем, когда вы сохраняете связанную модель, этот тестовый сценарий запускается очень быстро.Вы получаете почти мгновенный отзыв о том, красный ли вы или зеленый.

Они оба немного сложны в настройке и ведут себя хорошо вместе, так что если вы застряли, проверьте еще несколько вопросов.

Удачи!

3 голосов
/ 27 июля 2012

Проверьте это видео о начале работы для minitest-rails . В нем описан процесс настройки приложения Minitest для Rails.

http://www.youtube.com/watch?v=xA2f2zBNvsc

В пошаговом руководстве показано, как создать вспомогательный файл, а также как запустить тесты с помощью задачи rake. Если вы хотите запустить определенный тест, вы можете сделать это с помощью следующего:

ruby -Itest test/models/user_test.rb
1 голос
/ 14 мая 2014

Вот все мои rakefile, которые я положил в свой главный каталог:

task :default => :test
task :test do
  Dir.glob('./test/*_test.rb').each { |file| require file}
end

Чтобы запустить все мои файлы Minitest одновременно, я просто набираю rake.Вот и все!

Убедитесь, что в верхней части каждого файла Minitest стоит require 'minitest/autorun'.Dir.glob определенно работает с Minitest.

Чтобы получить симпатичный цветной вывод Minitest с именами всех моих методов тестирования, у меня есть файл minitest_helper.rb в моем каталоге / test.(Пришлось установить gem minitest-reporters):

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

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

1 голос
/ 20 мая 2012

Более новые версии RSpec (начиная с версии 2.8, выпущенной в январе 2012 года) имеют резкое увеличение скорости. Здесь - исследование различий в производительности и сравнение с MiniTest.

Кроме того, я нашел этот показ Райана Бейтса отличным введением в MiniTest.Обратите внимание, что это одно из профессиональных видео, и вам нужно будет подписаться, чтобы посмотреть его.

0 голосов
/ 09 июля 2018

Патрик написал действительно хорошее объяснение и пример.Для будущих читателей просто имейте в виду, что глобальные ожидания в настоящее время обесцениваются и будут удалены в Minitest 6. Это требует почти тривиального изменения в упаковке объекта, который вы тестируете, в вызове expect.

require 'minitest/spec'
require 'minitest/autorun'  # arranges for minitest to run (in an exit handler, so it runs last)

require 'alpha'

describe 'Alpha' do
  it 'greets you by name' do
    expect(Alpha.new.greet('Alice')).must_equal('hello, Alice')
  end
end
...