TDD: что происходит перед первым модульным тестом?

17

Я в основном понимаю теорию TDD, но не могу понять, с чего начать. Я сижу, чтобы написать модульное тестирование для личного проекта и понимаю. , , Я понятия не имею, что я тестирую. Какие объекты, какие функциональные возможности и т. Д.

Например, допустим, я хочу написать приложение, которое поможет нашей семье справляться с домашними заданиями. У меня есть несколько вопросов: как перейти от этой идеи к моему первому тесту? Сколько нужно определиться до того, как я начну, и сколько я выясню после того, как начну писать тесты? Когда я принимаю решение, например, хранить ли данные в текстовом файле или базе данных? Должны ли я пройти приемочные тесты перед началом работы? Должен ли я иметь разработанный интерфейс? Должен ли я иметь спецификацию? (Я понимаю, что, по крайней мере, некоторые из этих примеров вопросов, вероятно, находятся в «серой области»).

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

Этель Эванс
источник
5
Я настоятельно рекомендую прочитать книгу GOOS Нэта Прайса и Стива Фримена ... есть отличная информация о прохождении сквозного теста с «тонким срезом» функциональности.
пусто

Ответы:

6

Мне нравится начинать со списка функций, и для каждой функции писать пользовательские истории, а затем для каждой истории писать описания тестов.

Подумайте немного о дизайне, затем выберите описание теста и начните писать код: red-green-refactor.

Повторяйте, пока все тесты не пройдут.

Да, приемочные тесты должны рассматриваться как часть этого, приложенного к соответствующей истории.

Стивен А. Лоу
источник
Мне это нравится. Это очень четкий процесс, которому я могу следовать: перечислять функции, составлять подсписок пользовательских историй для каждой функции, составлять подсписок тестов для каждой пользовательской истории. Я попробую этот процесс.
Этель Эванс
Я принимаю это, потому что это касается того, что я лично хотел знать, но рекомендую, чтобы люди также прочитали (более одобренный) ответ от Карла.
Этель Эванс
18

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

Разработчики, которые не используют TDD, тоже должны подумать об этом - но они могут «просто погрузиться» и начать что-то писать, что угодно. Но «что-то, что угодно» не всегда на пути к реализации программы, которую, как вы думали, вы намереваетесь написать. Что? Ну, как бы выглядела ваша программа, если бы она работала? Какие тесты это пройдет?

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

Здорово. Если бы это приложение работало, что бы оно делало? Что ж, работа по дому может быть назначена человеку, верно?

Person fred = new Person("fred")
Chore mow = new Chore("mow the lawn");
mow.assignTo(fred);
assertEquals(fred, mow.whoIsAssigned());

Там есть начало. Не то место, с которого нужно начинать, не обязательно лучшее место для старта, но это место. Это то, что вы хотите, чтобы ваш код поддерживал (хотя я уверен, что вы можете придумать лучшие имена). Начни там, смотри как это не получится. Заставь это пройти. Приберись. Вспенить, промыть, повторить.

Карл Манастер
источник
Мне не нравится пример, но я согласен с предпосылкой; Методология test-first имеет смысл только тогда, когда вы можете и хотите сделать хотя бы какой -то предварительный дизайн. На самом деле, вам действительно нужна модель скелетного домена или, по крайней мере, значительная ее часть.
Ааронаут
5
Здесь нет предварительного дизайна. Ни один из классов в тесте еще не должен существовать. Проектирование происходит в тесте, затем они создаются для прохождения теста.
Торбьерн
Не могли бы вы уточнить «Перед тем, как написать свой первый тест, вы должны подумать о том, какой будет ваша первая функциональность и как будет выглядеть ваша программа, если бы эта функциональность работала».? Сколько я должен потренироваться перед началом? В какой момент я чрезмерно проектирую и теряю преимущество, которое позволяет моим модульным тестам управлять моим дизайном? Я предполагаю, что не хочу диаграмм классов, которые должны управляться рефакторингом, верно? Но этот пример звучит так: «Имейте идею, потратьте 15 секунд на размышления, а затем напишите тест». Это действительно все, что я хочу сделать?
Этель Эванс
2
@Ethel Да, это примерно столько, сколько я бы посоветовал (и в примере здесь, и в целом). Найдите что-нибудь пригодное для тестирования, которое приведет вас к желаемому продукту, а затем напишите тест для него.
Карл Манастер
1
Как это работает в команде - это большой и другой вопрос. Да и саму TDD нечего сказать о координации командной работы. В этом может помочь парное программирование и игра в планирование. в контексте того, что вы запланировали, TDD все еще применяется. jamesshore.com/Agile-Book/the_planning_game.html Scrum тоже есть, что сказать о том, как планировать работу команды.
Карл Манастер
5

Да, у TDD есть эта проблема. Вот почему я сейчас рекомендую Behavior Driven Development.

Начните вручную. Запишите что-то похожее на историю пользователя:

  • Как пользователь
  • Когда я выбираю Добавить в корзину, я хочу, чтобы продукт был добавлен прозрачно в фоновом режиме.
  • Так что я могу продолжать покупки без перерыва

Теперь, какие функции поддерживают эту цель (часть «Так что»)?

  • Когда товар добавлен в корзину
    • Корзина покупок для пользователя будет содержать новый товар
    • Общее количество товаров в корзине увеличится на один
    • Пользователь не должен быть перенаправлен
    • Опция проверки сейчас будет доступна
  • Когда в корзине есть два товара и пользователь выбирает оформить заказ
    • Пользователь будет перенаправлен на страницу оформления заказа
    • Оба элемента будут видны

Это все, что вы можете и должны проверить вручную.

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

.Net имеет WatiN для автоматизации веб-страниц или, если вы хотите протестировать API, я бы порекомендовал дополнение Subspec к xUnit или MSpec (вы также можете сделать это с любой средой тестирования, только они упрощают называть ваши тесты таким образом, чтобы что поддерживает этот стиль мышления).

Ruby имеет огурец для тестирования автоматизации и rspec для тестирования API более низкого уровня

В Javascript есть жасмин и qUnit.

точка точка точка

Джордж Мауэр
источник
Есть также клоны / альтернативы огурцам для .NET: посмотрите этот вопрос StackOverflow
Carson63000
@ Carson63000 Да, но я лично не вижу особого смысла. Ruby - это язык .Net в IronRuby. Просто создайте проект IronRuby и используйте настоящий огурец.
Джордж Мауэр
Я люблю BDD и использую StoryQ. Не забудьте упомянуть, что история может быть расширена до senarios с помощью Given / When / Then. Учитывая, что кое-что случилось, Когда я делаю это И это, Тогда я ожидаю это и это. Посмотрите выступление Дэвида Старра по этому вопросу на канале TechEd channel9.msdn.com/Events/TechEd/NorthAmerica/2010/DPR302, а также посмотрите на StoryQ, если вы используете .net storyq.codeplex.com
Bronumski
3

Как мне перейти от этой идеи к моему первому тесту? Сколько нужно определиться до того, как я начну, и сколько я выясню после того, как начну писать тесты?

Разбейте ваше приложение на кусочки. («Как пользователь, я хочу дважды щелкнуть по значку и запустить программу.» Или «Как пользователь, я хочу открыть свой браузер и перейти к программе.» Как угодно.)

Затем разбейте историю на несколько задач. (например, создайте проект в Eclipse, настройте хранилище кода). Когда вы приступите к задаче программирования, напишите свой первый тест.

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

Если вы не уверены, выберите какой-нибудь из них проще и сделайте это. (вероятно, текстовый файл) Если вы понимаете, что сделали ошибку, выполните рефакторинг. Если ваши тесты хорошо структурированы, вы сможете внести изменения в бэкэнд и уловить непреднамеренные побочные эффекты, которые возникают.

Кристофер Биббс
источник
3

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

Для получения дополнительной информации о TDD, я бы порекомендовал Test Driven Development By Example by Kent Beck. У него также есть скринкаст TDD, который следует за разработкой нетривиальной библиотеки в чистом стиле TDD с объяснениями Кента на каждом этапе процесса. Я думаю, что это отличный пример TDD на практике, даже если он (по необходимости) сделан в искусственной среде.

Рейн Хенрикс
источник
0

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

Промыть, повторить и т. Д.

Для меня важно думать о том, как вы бы это проверили, и это может повлиять на ваш дизайн.

пустой
источник