Как начать работать с TDD с Ruby on Rails? [закрыто]

167

Я знаком с концепциями (проходил тестовые занятия в колледже), но пока не уверен, как их реально использовать, поскольку никогда не работал над «настоящим» проектом TDD.

Я собираюсь начать разработку проекта с использованием Ruby on Rails (скорее всего, с использованием 2.3). Это приложение будет использоваться для управления данными, пользователями и некоторыми файлами. Поначалу это не будет слишком сложно, но в ближайшие 6 месяцев это может сильно измениться, поэтому я считаю, что сейчас самое время заняться TDD.

У меня есть основная идея, как это сделать, но мне все еще нужны некоторые советы и подсказки:

  • Какую статью по Ruby on Rails TDD 101 я должен прочитать?

  • Что мне нужно проверить?

  • Какой драгоценный камень / плагин я должен использовать?

  • Должен ли я использовать rspec ? Что-то другое?

  • Как только я получу все свои тестовые классы, как мне их развернуть? (например: Непрерывная интеграция)

  • Как много времени занимает TDD?

  • Нужно ли мне читать книгу об этом или я могу получить все, просто поиграв с ней и прочитав онлайн-уроки? Если мне нужно прочитать книгу, какую книгу?


Мне нравится учиться на примерах, поэтому кто-то может сказать мне, как я поступил бы и использовал подход TDD для решения этой проблемы:

У меня есть компании. У меня есть контакты. Контакт может быть связан с 1 компанией. Компания может иметь несколько контактов. Я хочу создать способы создания контактов, компаний и связи контактов с компаниями.

Вам не нужно использовать этот пример в своем ответе, но это поможет :)

marcgg
источник

Ответы:

202

Какую статью по Ruby on Rails TDD 101 я должен прочитать?

Начну с руководства по тестированию рельсовых приложений .

Также в Railscast есть несколько отличных скринкастов о том, как использовать различные инструменты тестирования.

Что мне нужно проверить?

Я начну с моделей, так как их легко проверить. Простое правило заключается в том, что вам нужно охватить каждый оператор if в своем тесте.

Вы должны проверить цель метода (чтобы убедиться, что он работает должным образом), а также все крайние случаи.

Также убедитесь, что вы не закончите тестирование.

Какой драгоценный камень / плагин я должен использовать? Должен ли я использовать rspec? Что-то другое?

Когда вы начинаете, просто используйте Test Unit. Вы можете использовать rspecили cucumberпосле ознакомления с основами.

Autotestэто хороший инструмент, если вы хотите по-настоящему тестировать. Но это «хорошее иметь» не требуется.

Как только я получу все свои тестовые классы, как мне их развернуть?

Не уверен насчет вопроса. Вы обычно не развертываете тесты. Когда у вас есть все классы тестирования, просто наберите 'rake test', чтобы запустить все ваши тесты.

Как много времени занимает TDD?

Это действительно экономит время. Если вам нравится лабиринтная головоломка, вы знаете, что решить ее почти всегда легче, если переходить от финиша к началу. То же самое с TDD. Без Test Driven вы постоянно думаете «что мне делать дальше». С помощью Test Driven тест скажет вам, что делать дальше (он ломается, если логики нет, поэтому вам просто нужно исправить сломанную деталь). Также у вас меньше ошибок, которые сэкономят вам много времени в долгосрочной перспективе.

Нужно ли мне читать книгу об этом или я могу получить все, просто поиграв с ней и прочитав онлайн-уроки? Если мне нужно прочитать книгу, какую книгу?

Вам не нужна книга. Самый эффективный способ научиться чему-либо - просто сделать это. Вернитесь к книге или онлайн-ресурсам, если у вас возникнут вопросы или проблемы. Это тоже ловко.

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

class CompanyTest <Test::Unit
    def test_relationship # test associations/relationships
        c = companies(:some_company)
        assert_equal [a list of contacts], c.contacts # make sure a company can have multiple contacts
    end
end

class ContactTest<Test::Unit
   def  test_relationships
        c = contact(:some_contact)
        assert_equal some_company, c.company # make sure the contact link to 1 company
   end

   def  test_create/add
        # test create contacts, here you need to make sure the contact is created correctly, and linked to company correctly
   end
end
эз.
источник
3
Ссылка на статью сломана, но не нашел его здесь: web.archive.org/web/20100325215651/http://bloritsch.d-haven.net/...
fivetwentysix
13

Я создал 6-серийный видеоклип, который летом 2010 года преподавал в открытом классе в Сан-Франциско. Материал посвящен тестированию и эффективности разработки в Rails 2.3 с использованием RSpec 1.3. Немного устаревший, но основные концепции применимы к Rails 3 с Rspec 2.x

http://www.rubyfocus.biz/class_video/2010/07/19/rails_tdd_class_1.html

Вольфрам Арнольд
источник
5

TDD - это прежде всего написание тестов. Это в основном заставляет вас написать свой собственный клиент, прежде чем писать код приложения. Цикл, как правило, состоит в том, чтобы написать тест для API, который не существует, запустить тест, ожидающий его сбой, написать код API, запустить тест снова и убедиться, что он прошел. Затем напишите свой следующий тест ... и так далее.

Вас также может заинтересовать это руководство по Rails .

Энди Гаскелл
источник
3

Какой драгоценный камень / плагин я должен использовать?

Я всегда наслаждался горчицей .

Как много времени занимает TDD?

Причина, по которой я всегда отдавал предпочтение разработке TDD, заключается в том, что она фокусируется на том, как я буду реализовывать определенный фрагмент кода. У меня складывается анекдотическое ощущение, что всякий раз, когда я сильнее придерживаюсь принципов TDD, я трачу меньше времени на доработку позже. Время, затраченное на то, насколько хорошо вы пишете модульные тесты. Если модульные тесты не фиксируют ожидаемое поведение, все время, потраченное на них, тратится впустую.

Патрик Робертсон
источник