TDD: Що відбувається перед першим тестом на одиницю?


17

Я в основному розумію теорію TDD, але не можу зрозуміти, як почати. Я сідаю, щоб написати одиничний тест для особистого проекту і реалізую. . . Я поняття не маю, що тестую. Які об’єкти, яка функціональність тощо

Скажімо, я хочу написати додаток, щоб допомогти нашій родині керувати своїми завданнями. Ось кілька запитань на мою думку: Як перейти від цієї ідеї до мого першого тесту? Скільки слід вирішити, перш ніж почати, і скільки я зрозуміти після того, як почну писати тести? Коли я приймаю рішення, як зберігати дані в текстовому файлі чи базі даних? Чи потрібно проходити тести прийняття користувача перед тим, як розпочати роботу? Чи повинен я створити інтерфейс користувача? Чи повинен у мене бути специфікація? (Я розумію, що принаймні деякі з цих прикладів питань, мабуть, знаходяться в "сірій області").

На додаток до основного питання про тест до першого тесту, можна також навести приклад того, як може виглядати тест першого блоку для такого проекту, як зразок проекту?


5
Я наполегливо рекомендую прочитати книгу GOOS Ната Прайса та Стіва Фрімана ... є чудова інформація про те, щоб пройти тест в кінці до "тонкого шматочка" функціональності.
пусте

Відповіді:


6

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

Подумайте над дизайном трохи, потім виберіть тестовий опис і починайте кодування: червоно-зелений-рефактор.

Повторюйте, поки не пройдуть всі тести.

Так, прийняття тестів слід розглядати як частину цього, прикріпленого до відповідної історії.


Мені подобається це. Це дуже чіткий процес, за яким я можу прослідкувати: перелічити функції, скласти під-список історій користувачів для кожної функції, скласти під-список тестів для кожної історії користувача. Я спробую цей процес.
Етел Еванс

Я приймаю це, тому що воно стосується того, що я особисто хотів знати, але рекомендую людям також читати відповідь Карла.
Етел Еванс

18

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

Розробники, які не використовують TDD, теж повинні задуматися над цим - але вони можуть "просто зануритися" і почати писати щось, що завгодно. Але "щось, що завгодно" не завжди стоїть на шляху до реалізації програми, яку ви думали, що збираєтесь написати. Що? Ну, як виглядала б ваша програма, якби вона працювала? Які тести він би пройшов?

Я хочу написати додаток, щоб допомогти нашій родині керувати своїми завданнями.

Класно. Якби ця програма працювала, що б це робило? Що ж, хору можна було б призначити особі, правда?

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

Там старт. Не місце, з якого ви повинні почати, не обов’язково найкраще місце для початку - але це місце. Ви хочете, щоб ваш код підтримував (хоча я впевнений, що ви можете придумати кращі імена). Починайте там, дивіться, як це не виходить. Нехай це проходить. Почистіть його. Натріть, промийте, повторіть.


Я не люблю приклад, але я згоден з цим припущенням; Тестові методики мають сенс лише тоді, коли ви вмієте і хочете зробити щонайменше якусь попередню конструкцію. Насправді вам справді потрібна модель доменного скелета або, принаймні, велика частина одного.
Aaronaught

5
Тут немає передньої конструкції. Жоден з класів тесту ще не існує. Конструкція буває в тесті, ТОГО вони створені для проходження тесту.
Torbjørn

Не могли б ви детальніше зупинитися на "Перед тим, як написати перший тест, ви повинні подумати про те, яким буде ваш перший біт функціональності, і як виглядала б ваша програма, якби ця функціональність працювала"? Скільки потрібно відпрацювати перед початком? У який момент я переосмислюю і втрачаю перевагу, щоб дозволити мої тестові одиниці керувати моїм дизайном? Я припускаю, що я не хочу діаграм класів, які повинні керуватися рефакторингом, правда? Але цей приклад звучить як "Майте ідею, вкладіть 15 секунд думки, а потім напишіть тест". Це справді все, що я хочу зробити?
Етел Еванс

2
@Ethel Так, це приблизно стільки думок, скільки я рекомендував би вкласти його (і в прикладі тут, і в цілому). З'ясуйте щось перевірене, що приведе вас до потрібного товару, а потім напишіть для нього тест.
Карл Манастер

1
Як це працює над командою - це питання велике та інше. І сам TDD не має багато що сказати про координацію роботи команди. Пара програмування та гра планування можуть допомогти у цьому; в контексті того, що ви планували, TDD все ще застосовується. jamesshore.com/Agile-Book/the_planning_game.html Scrum теж має що сказати про те, як планувати роботу команди.
Карл Манастер

5

Так, TDD має цю проблему. Ось чому я зараз рекомендую розвиток, керований поведінкою.

Почніть вручну. Запишіть щось схоже на історію користувача:

  • Як користувач
  • Коли я вибираю Додати в кошик, я хочу, щоб продукт був доданий прозоро у фоновому режимі
  • Так що я можу продовжувати свій покупок безперервно

Тепер, які функції підтримують цю мету (частина "Так що")?

  • Коли товар додається в кошик для покупок
    • Кошик для користувача буде містити новий товар
    • Загальна кількість товарів у кошику збільшиться на одиницю
    • Користувача не слід переадресовувати
    • Буде доступний варіант перевірки зараз
  • Коли в кошику для покупок є два предмети, і користувач вирішує перевірити
    • Користувача буде переспрямовано на сторінку перевірки
    • Обидва елементи будуть видні

Це все, що можна, і слід перевірити вручну.

Зробіть це ненадовго. Тоді, як хороший розробник, починайте шукати способи автоматизації зайвих деталей. Це залежатиме від залежності від вашої платформи, але у більшості доступні гідні рамки.

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

У Ruby є огірок для автоматичного тестування та rspec для тестування API нижчого рівня

У Javascript є жасмін і qUnit.

крапка крапка


Є також клони огірків / альтернативи для .NET також: дивіться це запитання щодо
StackOverflow

@ Carson63000 Так, але я особисто не бачу сенсу. Ruby - це .Net мова в IronRuby. Просто створіть проект IronRuby і використовуйте фактичний огірок.
Джордж Мауер

Я люблю BDD і використовую StoryQ. Не забудьте відзначити, що історію можна розширити на сенаріуми за допомогою Дано / Коли / Тоді. Враховуючи те, що трапилось, коли я це роблю, і це. Тоді я очікую цього і цього. Перегляньте про це Девіда Старра на TechEd каналі9.msdn.com/Events/ TechEd/ NorthAmerica/2010/DPR302, а також подивіться на StoryQ, якщо ви використовуєте .net storyq.codeplex.com
Bronumski

3

Як перейти від цієї ідеї до мого першого тесту? Скільки слід вирішити, перш ніж почати, і скільки я зрозуміти після того, як почну писати тести?

Розбийте свою програму на історію розміру. ("Як користувач, я хочу двічі клацнути по значку та запустити програму." Або "Як користувач, я хочу відкрити свій браузер і перейти до програми. Що б там не було."

Потім розбийте розповідь на деякі завдання. (наприклад, Створіть проект у Eclipse, налаштуйте сховище коду) Коли ви перейдете до завдання кодування, напишіть свій перший тест.

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

Якщо ви не впевнені, виберіть те, що вам здається простіше, і зробіть це. (можливо, текстовий файл) Якщо ви зрозуміли, що помилилися, рефактор. Якщо ваші тести добре структуровані, ви повинні мати змогу змінити зворотній кінець і зафіксувати ненавмисні побічні ефекти, які виникають.


3

Я здивований, що жодна з відповідей не містить згадки про те, що ви робите прямо перед тим, як написати свій перший тест, а саме створити список тестів . Тестовий список інформується на етапах написання історії та проектування, згаданих в інших відповідях, і є прямим попередником написання тесту, який, здається, ви шукаєте.

Для отримання додаткової інформації про TDD я рекомендую розробити тестові розробки за прикладом від Кента Бека. У нього також є скріншот TDD, який слідкує за розвитком нетривіальної бібліотеки в чистому стилі TDD з поясненнями Кента на кожному кроці процесу. Я думаю, що це чудовий приклад TDD на практиці, навіть якщо це робиться (за необхідності) у надуманому середовищі.


0

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

Промийте, повторіть тощо.

Для мене це важливе мислення про те, як би ви протестували його, і це те, що може керувати вашим дизайном.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.