Существует ли консенсус относительно тестовых платформ для Ruby 1.9.x?
Два партера с быстрым вступлением. Intro: Я прихожу к Ruby из Perl, и я немного потерян среди вариантов тестовых рамок. Я понимаю, что, вероятно, нет единого, универсального лучшего выбора, но я не могу даже получить четкое представление о игровом поле.
Итак, во-первых, MiniTest или Test:: Unit? Я только понял, что 1.9.1 по умолчанию стоит MiniTest. Я не заметил, так как все старые обучающие программы Test:: Unit все еще работают нормально. Если вы require test/unit
, вы фактически получаете MiniTest в качестве эмулятора Test:: Unit (!). Моя первоначальная мысль состояла в том, чтобы пойти с выбором MiniTest по умолчанию (как только я это понял), но даже очень недавние книги, похоже, не заинтересованы в его обучении. Ruby Best Practices говорит: "Между ними существуют существенные различия", но он решил не заниматься с ними. Он также выполняет все свои тесты через Test:: Unit (плюс некоторые пользовательские дополнения). У нового Pickaxe также очень мало о MiniTest как таковом, и в главе по тестированию они также используют версию эмуляции Test:: Unit MiniTest. Чтобы прояснить мой первый вопрос, стоит ли: MiniTest - это бедный первый вариант? Должен ли я по умолчанию использовать эмулятор Test:: Unit?
Во-вторых, помимо встроенных параметров есть Rspec, Cucumber и компания для тестов, управляемых поведением. Является ли сообщество сильно склоняющимся к этому стилю и этим рамкам? Должен ли я начинать с Rspec?
Я сыграю немного со всеми тремя, но мне любопытно узнать, какой консенсус (если есть) формируется вокруг тестирования в Ruby 1.9.
(Быстрое наблюдение, как напоминание для меня и для всех, кто интересуется. См. эту ссылку для полезного обзора различных вызовов для теста:: Unit и MiniTest в разных рубинах от 1.8 до 1.9.1.)
Ответы
Ответ 1
Есть ли консенсус? Я бы сказал, нет. Там сильный голос сообщества для использования TDD/BDD, но даже тогда он не универсален. Структура, вероятно, менее важна, чем применение практики в первую очередь.
Я считаю, что minitest - это замена 1.9 для Test:: Unit, которая существует только как обертка вокруг новой библиотеки для обратной совместимости. Я предполагаю, что использование маршрута с наименьшим количеством будет более перспективным.
RSpec - это несколько другое понятие: менее очевидно, внедренное "традиционными" структурами, основанными на xUnit. Стоит потратить некоторое время, чтобы посмотреть, предпочитаете ли вы это.
Там также Shoulda. хотя я не знаю, как это протестировано на 1.9: это больше обертки/расширения для Test:: Unit, поэтому, вероятно, это будет работать.
Конечно, забава здесь не прекращается: как только вы выбрали тестовую структуру, вам понадобится какой-то насмешливый движок. Или замену данных.
Во всех случаях я бы сказал, что любая инфраструктура, для которой вы можете найти доказательства регулярных обновлений, открытого, заполненного сообщества и API, который вы не ненавидите, будет выполнять эту работу. Это маловероятно, что вас позовут позже, если вы сделаете любой выбор.
Ответ 2
Я использую Rspec в течение года или около того. Я переключился с Test:: Unit специально, потому что я мог печатать по-человечески читаемому способу тестирования.
Он читается как проза. Это большой плюс для меня. Но как и все результаты будут меняться.
describe Model do
it "should do what I want" do
this.should == that
it.should be_nil
that.should_not be_true
end
end
Также, независимо от тестовой среды, вы также должны подумать о инструменте покрытия, например RCov. Он интегрируется с rspec и расскажет вам, где ваш код не испытывает тестирования.
Ответ 3
RSpec является консенсусом популярных книг Rails, таких как "The Rails Way". Плюсы IMHO - это тесты, которые читаются как английский, выходные форматы, которые читаются как английский, и на лету. Минусы медленны, и библиотека иногда кажется "волшебной", то есть слишком чуждой для кодеров, которые более знакомы с Ruby и модульными тестами. RSpec также предлагает Cucumber и Gherkin, которые являются способами написания историй пользователей, которые являются полезными приемом клиентов.
MiniTest встроен в Ruby 1.9. Плюсы IMHO - это быстрая скорость, очень удобная для чтения/записи для кодеров других языков и тесты, которые используют тот же стиль кода, который вы использовали бы в своем реальном коде. MiniTest имеет гораздо больше, чем большинство людей знают, например, MiniTest Spec имеет BDD-сокеты, похожие на RSpec, MiniTest Mock - издевательская система, а MiniTest Benchmark - для профилирования производительности.
В моем личном опыте люди, которые создают приложения Rails, стремятся к RSpec, а люди, которые строят чистый код Ruby, имеют тенденцию к MiniTest Unit, Spec, Mock, Benchmark и т.д.
Ответ 4
Я лично передаю rspec. Я обнаружил, что сосредоточение моих тестов на поведении действительно помогло мне обойти то, что я пытался сделать.
С помощью rspec перейдите и получите что-то вроде Factory Girl or Machinist для генерации ваших тестовых данных, не используйте светильники.
Что касается того, что сказал Майк, проект rspec достаточно активен, так как новые версии выпускаются нормально с каждой версией рельсов, чтобы помочь ему идти в ногу с разработкой структуры.
Ответ 5
RSpec хорош, но я думаю, что в последнее время было много разговоров и движений за Minitest, который поставляется с Ruby 1.9.x. У этого есть много тонкостей RSpec, но он намного более компактный и сжатый.