Керована тестами розробка (КТР), Розробка через тестування (англ. Test-driven development (TDD)) — технологія розробки програмного забезпечення, яка використовує короткі ітерації розробки, що починаються з попереднього написання тестів, які визначають необхідні покращення або нові функції. Кожна ітерація має на меті розробити код, який пройде ці тести. Нарешті, програміст або група вдосконалюють код для погодження змін. Один із ключових моментів TDD полягає у тому, що підготовка тестів перед написанням самого коду пришвидшує процес внесення змін. Варто зауважити, що керована тестами розробка є методологією розробки програмного забезпечення, а не його тестування.
Test-Driven Development відноситься до концепції екстремального програмування, яка стверджує, що спершу потрібно писати тести, а вже потім код, яка веде свій початок з 1999 року, однак, останнім часом спостерігається загальніший інтерес до даної методології.
Програмісти також використовують дану методологію для вдосконалення і зневадження сирцевого коду, раніше написаного з використанням інших методологій розробки.
Вимоги
Керована тестами розробка вимагає від розробника створення автоматизованих модульних тестів, які визначають вимоги до коду безпосередньо перед написанням самого коду. Тест містить перевірки умов, які можуть або виконуватися, або ні. Коли вони виконуються, кажуть, що тест пройдено. Проходження тесту підтверджує поведінка, передбачувана програмістом. Розробники часто використовують програмні каркаси для тестування (англ. testing frameworks) для створення та автоматизації запуску наборів тестів. На практиці модульні тести покривають критичні та нетривіальні ділянки коду. Це може бути код, схильний до частих змін, код, від роботи якого залежить працездатність великої кількості іншого коду, або код з великою кількістю залежностей.
Середовище розробки повинно швидко реагувати на невеликі модифікації коду. Архітектура програми повинна базуватися на використанні безлічі сильно пов’язаних компонентів, які слабо залежать одне від одного , завдяки чому тестування коду спрощується.
TDD не тільки пропонує перевірку коректності, а й впливає на дизайн програми. Спираючись на тести, розробники можуть швидше уявити, яка функціональність необхідна користувачеві. Таким чином, деталі інтерфейсу з'являються задовго до остаточної реалізації рішення.
Зрозуміло, що до тестів застосовуються такі ж вимоги щодо якості коду, як і до основного коду.
Три закони TDD
- Не можна писати жодного вихідного коду, доки спершу не написано падаючого юніт-тесту (англ. unit test).
- Не можна писати більше юніт-тесту ніж необхідно для падіння (непроходження тесту). Помилка компіляції - це також падіння (англ. failing).
- Не можна писати більше вихідного коду, ніж необхідно для проходження впалого юніт-тесту.
Цикл розробки за методологією TDD
Усе нижчевказане базується на книзі , котру багато хто вважає канонічним текстом про дану концепцію у її сучасному вигляді.
1. Додати тест
У розробці через тестування, реалізація кожної нової функції розпочинається з написання тесту. Цей тест звісно ж не буде проходити, адже він написаний до того, як було реалізовано даний функціонал. Для того, щоб написати тест, розробник повинен чітко розуміти майбутні специфікацію та вимоги до нового функціоналу. Це основна відмінність розробки через тестування від більш класичного підходу написання тестів після того, як написано сам код: це змушує розробника фокусуватись на специфікаціях перед написанням коду.
2. Запустити усі тести, і подивитись, чи вони пройшли
Це підтверджує, що усі тести працюють коректно, і, що нові тести помилково не проходять, не вимагаючи при цьому ніякого нового коду.
Нові тести також не повинні проходити з відомої причини. Цей етап є тестуванням самих тестів на те, чи дають вони негативний результат: це виключає можливість того, що новий тест буде завжди проходити, а, отже, буде марним.
3. Написати код
Наступним кроком є написання коду, який змусить тест пройти. Новий код, написаний на даному етапі не буде досконалим, і може, наприклад, змушувати тест проходити у некоректний спосіб. Це є допустимим. тому що на наступних кроках даний код буде поліпшуватись і відточуватись.
Дуже важливим моментом є те, що код написаний виключно для того, щоб проходили тести; ніякої додаткової (а отже і не протестованої) функціональності на даному етапі вносити не дозволяється.
4. Запустити автоматичні тести, і подивитись, чи пройшли вони успішно
Якщо усі тести успішно проходять, програміст може бути впевненим у тому, що його код відповідає усім вимогам, які перевіряються тестами. Це гарна точка, з якої можна перейти на фінальний етап циклу розробки.
5. Удосконалити код
Тепер код при необхідності може бути "вичищений". Шляхом перезапуску усіх тестів, розробник може впевнитись у тому, що рефакторинг коду не порушив його відповідність специфікаціям. Концепція вилучення з коду дублікатів є важливим аспектом будь-якого дизайну програмного забезпечення.
Стиль розробки
Керована тестами розробка тісно пов'язана з такими принципами як «роби простіше, дурник» (англ. keep it simple, stupid, KISS) і «вам це не знадобиться» (англ. you ain't gonna need it, YAGNI). Дизайн може бути чистіше і ясніше при написанні лише того коду, який необхідний для проходження тесту. Кент Бек також пропонує принцип «підроби, поки не зробиш» (англ. fake it till you make it).
Тести повинні писатися для тестованої функціональності. Вважається, що це має дві переваги. Це допомагає переконатися, що застосунок придатний для тестування, оскільки розробнику доведеться з самого початку обдумати те, як застосунок буде тестуватися. Це також сприяє тому, що тестами буде покрита вся функціональність. Коли функціональність пишеться до тестів, розробники та організації схильні переходити до реалізації наступної функціональності, ще не протестувавши існуючу.
Ідея перевіряти, що тільки написаний тест не проходить, допомагає переконатися, що тест реально щось перевіряє. Тільки після цієї перевірки слід приступати до реалізації нової функціональності. Цей прийом, відомий як «червоний / зелений / рефакторинг», називають «мантрою розробки через тестування». Під червоним тут розуміють тести, які не пройшли, а під зеленим - які пройшли тестування.
Відпрацьовані практики розробки через тестування призвели до створення техніки «Керована приймальними тестами розробка» (англ. Acceptance Test-driven development, ATDD), в якому критерії описані замовником автоматизуються в приймальні тести, що використовуються потім в звичайному процесі керованої модульними тестами розробки (англ. unit test-driven development, UTDD). Цей процес дозволяє гарантувати, що застосунок задовольняє сформульованим вимогам. При керованій приймальними тестами розробці, команда розробників сконцентрована на чіткій задачі: задовольнити приймальні тести, які відображають відповідні вимоги користувача.
Приймальні (функціональні) тести (англ. customer tests, acceptance tests) - тести, що перевіряють функціональність програми на відповідність вимогам замовника. Приймальні тести проходять на стороні замовника. Це допомагає йому бути впевненим у тому, що він отримає всю необхідну функціональність.
Видимість коду
Набір тестів повинен мати доступ до коду що тестується. З іншого боку, принципи інкапсуляції та приховування даних не повинні порушуватися. Тому модульні тести зазвичай пишуться в тому ж модулі або проекті, що і тестований код.
З коду тесту може не бути доступу до private полів і методів. Тому при модульному тестуванні може знадобитися додаткова робота. В Java, розробник може використовувати (англ. reflection), щоб звертатися до полів, позначеним як private. Модульні тести можна реалізувати у внутрішніх класах, щоб вони мали доступ до членів зовнішнього класу. В . NET Framework можуть застосовуватися колективні класи (англ. partial classes) для доступу з теста до private полів і методів.
Важливо, щоб фрагменти коду, призначені виключно для тестування, не залишалися у випущеному коді. В Сі для цього можуть бути використані директиви умовної компіляції. Однак це означатиме, що код, який випускається, не повністю збігається з протестованим.
Не існує єдиної думки серед програмістів, які застосовують розробку через тестування, про те, наскільки це осмислено тестувати private- і protected- методи і дані. Одні переконані, що достатньо протестувати будь-який клас тільки через його public-інтерфейс, оскільки private-члени - це всього лише деталь реалізації, яка може змінюватися, і її зміни не повинні відображатися на наборі тестів. Інші стверджують, що важливі аспекти функціональності можуть бути реалізовані в private-методах і тестування їх неявно через public-інтерфейс лише ускладнить ситуацію: модульне тестування передбачає тестування найменших можливих модулів функціональності.
Згідно концепції TDD, тести "ведуть" розробника до певної реалізації. Проходження впалого тесту досягається завдяки трансформації вихідного коду. Часом, можна трансформувати код таким чином, що подальше тестування буде вкрай ускладнене і вимагатиме переосмислення реалізації значної частини або, навіть, усього юніта (функції, методу класу). Тобто при невірному використанні TDD може завести недосвідченого розробника в "глухий кут", або привести до неоптимальної реалізації алгоритму. Для допомоги розробникам було запропоновано принцип пріоритету трансформацій. Він полягає в тому, що потрібно завжди віддавати перевагу простішим трансформаціям над складнішими. Дотримання цього принципу може допомогти уникати "глухих кутів" та розробляти оптимальніші алгоритми виконання.
Fake-, mock-об'єкти та інтеграційні тести
Модульні тести тестують кожен модуль окремо. Не важливо, чи містить модуль сотні тестів або тільки п'ять. Тести, які використовуються при розробці через тестування, не повинні перетинати кордони процесу, використовувати мережеві з'єднання. В іншому випадку проходження тестів буде займати великий час, і розробники будуть рідше запускати набір тестів цілком. Введення залежності від зовнішніх модулів або даних також перетворює модульні тести в інтеграційні. При цьому якщо один модуль в ланцюжку веде себе неправильно, може бути не відразу зрозуміло який саме.
Коли код що розробляється використовує бази даних, вебсервіси або інші зовнішні процеси, має сенс виділити частину тестування, що покривається. Це робиться в два кроки:
- Скрізь, де вимагається доступ до зовнішніх ресурсів, повинен бути оголошений інтерфейс, через який цей доступ буде здійснюватися.
- Інтерфейс повинен мати дві реалізації. Перша надає доступ до ресурсу, і друга, що є або . Все, що роблять fake-об'єкти, це додають повідомлення виду «Об'єкт person збережений» в лог, щоб потім перевірити правильність поведінки. Mock-об'єкти відрізняються від fake-тим, що самі містять твердження (англ. assertion), які перевіряють поведінку тестованого коду. Методи fake- і mock-об'єктів, які повертають дані, можна налаштувати так, щоб вони повертали при тестуванні одні й ті ж правдоподібні дані. Вони можуть емулювати помилки так, щоб код обробки помилок міг бути ретельно протестований. Іншими прикладами fake-служб, корисними при розробці через тестування, можуть бути: служба кодування, що не кодує дані, генератор випадкових чисел, який завжди видає одиницю. Fake-або mock-реалізації є прикладами (англ. dependency injection).
Використання fake-і mock-об'єктів для представлення зовнішнього світу призводить до того, що справжня база даних та інший зовнішній код не будуть протестовані в результаті процесу розробки через тестування. Щоб уникнути помилок, необхідні тести реальних реалізацій інтерфейсів, описаних вище. Ці тести можуть бути відокремлені від інших модульних тестів і реально є інтеграційними тестами. Їх необхідно менше, ніж модульних, і вони можуть запускатися рідше. Проте, найчастіше вони реалізуються використовуючи ті ж бібліотеки для тестування (англ. testing framework), що і модульні тести.
Інтеграційні тести, які змінюють дані в базі даних, повинні відкочувати стани бази даних до того, яке було до запуску тесту, навіть якщо тест не пройшов. Для цього часто застосовуються такі техніки:
- Метод
TearDown
, присутній в більшості бібліотек для тестування. Try ... catch ... finally
структури обробки винятків, там де вони доступні.- Транзакції баз даних.
- Створення знімка (англ. snapshot) бази даних перед запуском тестів і відкат до нього після закінчення тестування.
- Скидання бази даних у чистий стан перед тестом, а не після них. Це може бути зручно, якщо цікаво подивитися стан бази даних, що залишився після непройденого тесту.
Існують бібліотеки Moq, jMock, NMock, EasyMock, Typemock, jMockit, Unitils, Mockito, Mockachino, PowerMock or Rhino Mocks, призначені спростити процес створення mock-об'єктів.
Переваги
Дослідження 2005 року показало, що використання розробки через тестування передбачає написання більшої кількості тестів; у свою чергу, програмісти, які пишуть більше тестів, схильні бути більш продуктивними. Гіпотези, які зв'язують якість коду з TDD були непереконливими.
Програмісти, які використовують TDD на нових проектах, відзначають, що вони рідше відчувають необхідність використовувати зневаджувач. Якщо деякі з тестів несподівано перестають проходити, відкат до останньої версії, яка проходить всі тести, може бути продуктивнішим, ніж зневадження.
Керована тестами розробка пропонує більше, ніж просто перевірку коректності, вона також впливає на дизайн програми. З самого початку сфокусувавшись на тестах, простіше уявити, яка функціональність необхідна користувачеві. Таким чином, розробник продумує деталі інтерфейсу до реалізації. Тести змушують робити свій код більш пристосованим для тестування. Наприклад, відмовлятися від глобальних змінних, одиничних предметів (singletons), робити класи менш пов'язаними і легкими для використання. Сильно пов'язаний код або код, який вимагає складної ініціалізації, буде значно важче протестувати. Модульне тестування сприяє формуванню чітких і невеликих інтерфейсів. Кожен клас буде виконувати певну роль, як правило невелику. Як наслідок - залежності між класами будуть зменшуватися, а зачеплення підвищуватися. (англ. design by contract) доповнює тестування, формуючи необхідні вимоги через (англ. assertions).
Незважаючи на те, що при розробці через тестування потрібно написати більшу кількість коду, загальний час, витрачений на розробку, зазвичай виявляється менше. Тести захищають від помилок. Тому час, що витрачається на зневадження, зменшується в рази. Велика кількість тестів допомагає зменшити кількість помилок в коді. Усунення дефектів на більш ранньому етапі розробки перешкоджає появі хронічних помилок, що призводять до тривалого та виснажливого зневадження в майбутньому.
Тести дозволяють робити рефакторинг коду без ризику його зламати. При внесенні змін в добре протестований код, ризик появи нових помилок значно нижче. Якщо нова функціональність призводить до помилок, тести, якщо вони звичайно є, одразу ж це покажуть. При роботі з кодом, на якому немає тестів, помилку можна виявити через значний час, коли з кодом працювати буде набагато складніше. Добре протестований код легко переносить рефакторінг. Впевненість у тому, що зміни не зламають існуючу функціональність, надає впевненість розробникам і збільшує ефективність їх роботи. Якщо існуючий код добре покритий тестами, розробники будуть відчувати себе набагато вільніше при внесенні архітектурних рішень, які покликані поліпшити дизайн коду.
Керована тестами розробка сприяє більш модульному і гнучкому коду. Це пов'язано з тим, що при цій методології розробнику необхідно думати про програму, як про безліч невеликих модулів, які написані і протестовані незалежно і лише потім з'єднані разом. Це призводить до менших, більш спеціалізованих класів, зменшенню пов'язаності і чистіших інтерфейсів. Використання також вносить вклад в модулярізацію коду, оскільки вимагає наявності простого механізму для перемикання між mock- і звичайними класами.
Оскільки пишеться лише той код, що необхідний для проходження тесту, автоматизовані тести покривають всі шляхи виконання. Наприклад, перед додаванням нового умовного оператора, розробник повинен написати тест, мотивуючий додавання цього умовного оператора.
Тести можуть використовуватися як документація. Хороший код розповість про те, як він працює, краще за будь-яку документацію. Документація і коментарі в коді можуть застарівати. Це може збивати з пантелику розробників, які вивчають код. А так як документація, на відміну від тестів, не може сказати, що вона застаріла, такі ситуації, коли документація не відповідає дійсності - не рідкість.
Слабкі місця
- Головним недоліком TDD є те, що до нього тяжко звикнути.
- Існують завдання, які неможливо (принаймні, на поточний момент) вирішити тільки за допомогою тестів. Зокрема, TDD не дозволяє механічно продемонструвати адекватність розробленого коду в області безпеки даних і взаємодії між процесами. Безумовно, безпека заснована на коді, в якому не повинно бути дефектів, проте вона заснована також на участі людини у процедурах захисту даних. Тонкі проблеми, що виникають у сфері взаємодії між процесами, неможливо з упевненістю відтворити, просто запустивши деякий код.
- Розробку через тестування складно застосовувати в тих випадках, коли для тестування необхідно проходження функціональних тестів. Прикладами може бути: розробка інтерфейсів користувача, програм, що працюють з базами даних, а також того, що залежить від специфічної конфігурації мережі. Керована тестами розробка не передбачає великого обсягу роботи з тестування такого роду речей. Вона зосереджується на тестуванні окремо взятих модулів, використовуючи mock-об'єкти для представлення зовнішнього світу.
- Потрібно більше часу на розробку і підтримку, а схвалення з боку керівництва дуже важливо. Якщо в організації немає впевненості в тому, що керована тестами розробка поліпшить якість продукту, то час, витрачений на написання тестів, може розглядатися як витрачений даремно.
- Модульні тести, створювані при розробці через тестування, звичайно пишуться тими ж, хто пише тестований код. Якщо розробник неправильно витлумачив вимоги до застосунку, і тест, і тестований модуль будуть містити помилку.
- Велика кількість використовуваних тестів можуть створити помилкове відчуття надійності, що призводить до меншої кількості дій з контролю якості.
- Тести самі по собі є джерелом накладних витрат. Погано написані тести, наприклад, містять жорстко вшиті рядки з повідомленнями про помилки або схильні до помилок. Щоб спростити підтримку тестів слід повторно використовувати повідомлення про помилки з тестованого коду.
- Рівень покриття тестами, що отримується в результаті розробки через тестування, не може бути легко отриманий згодом. Вихідні тести стають все більш цінними з плином часу. Якщо невдалі архітектура, дизайн або стратегія тестування призводять до великої кількості не пройдених тестів, важливо їх всі виправити в індивідуальному порядку. Просте видалення, відключення або поспішна зміна їх може призвести до прогалин у покритті тестами.
Джерела інформації
- "Extreme Programming", Computerworld (online), December 2001, webpage: Computerworld-appdev-92 [ 2011-06-05 у Wayback Machine.].
- Newkirk, JW and Vorontsov, AA. Test-Driven Development in Microsoft .NET, Microsoft Press, 2004.
- Feathers, M. Working Effectively with Legacy Code, Prentice Hall, 2004
- Beck, K. Test-Driven Development by Example, Addison Wesley, 2003
- Koskela, L. «Test Driven: TDD and Acceptance TDD for Java Developers», Manning Publications, 2007
- Burton, Ross (11/12/2003). . O'Reilly Media, Inc. Архів оригіналу за 27 липня 2009. Процитовано 12 серпня 2009.
- Newkirk, James (7 червня 2004). . Microsoft Corporation. Архів оригіналу за 30 червня 2009. Процитовано 12 серпня 2009.
- Stall, Tim (1 березня 2005). . CodeProject. Архів оригіналу за 3 вересня 2009. Процитовано 12 серпня 2009.
- Erdogmus, Hakan; Morisio, Torchiano. On the Effectiveness of Test-first Approach to Programming. Proceedings of the IEEE Transactions on Software Engineering, 31(1). January 2005. (NRC 47445). Архів оригіналу за 27 серпня 2011. Процитовано 14 січня 2008.
We found that test-first students on average wrote more tests and, in turn, students who wrote more tests tended to be more productive.
- Proffitt, Jacob. TDD Proven Effective! Or is it?. Архів оригіналу за 27 серпня 2011. Процитовано 21 лютого 2008.
So TDD's relationship to quality is problematic at best. Its relationship to productivity is more interesting. I hope there's a follow-up study because the productivity numbers simply don't add up very well to me. There is an undeniable correlation between productivity and the number of tests, but that correlation is actually stronger in the non-TDD group (which had a single outlier compared to roughly half of the TDD group being outside the 95% band).
- Llopis, Noel (20 лютого 2005). . Games from Within. Архів оригіналу за 22 лютого 2005. Процитовано 1 листопада 2007.
Comparing [TDD] to the non-test-driven development approach, you're replacing all the mental checking and debugger stepping with code that verifies that your program does exactly what you intended it to do.
- Müller, Matthias M.; Padberg, Frank. (PDF). Universität Karlsruhe, Germany. с. 6. Архів оригіналу (PDF) за 11 червня 2007. Процитовано 1 листопада 2007.
- Loughran, Steve (November 6th, 2006). (PDF). HP Laboratories. Архів оригіналу (PDF) за 20 лютого 2009. Процитовано 12 серпня 2009.
Вікіпедія, Українська, Україна, книга, книги, бібліотека, стаття, читати, завантажити, безкоштовно, безкоштовно завантажити, mp3, відео, mp4, 3gp, jpg, jpeg, gif, png, малюнок, музика, пісня, фільм, книга, гра, ігри, мобільний, телефон, android, ios, apple, мобільний телефон, samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, ПК, web, Інтернет
U Vikipediyi ye statti pro inshi znachennya cogo termina TDD Kerovana testami rozrobka KTR Rozrobka cherez testuvannya angl Test driven development TDD tehnologiya rozrobki programnogo zabezpechennya yaka vikoristovuye korotki iteraciyi rozrobki sho pochinayutsya z poperednogo napisannya testiv yaki viznachayut neobhidni pokrashennya abo novi funkciyi Kozhna iteraciya maye na meti rozrobiti kod yakij projde ci testi Nareshti programist abo grupa vdoskonalyuyut kod dlya pogodzhennya zmin Odin iz klyuchovih momentiv TDD polyagaye u tomu sho pidgotovka testiv pered napisannyam samogo kodu prishvidshuye proces vnesennya zmin Varto zauvazhiti sho kerovana testami rozrobka ye metodologiyeyu rozrobki programnogo zabezpechennya a ne jogo testuvannya Test Driven Development vidnositsya do koncepciyi ekstremalnogo programuvannya yaka stverdzhuye sho spershu potribno pisati testi a vzhe potim kod yaka vede svij pochatok z 1999 roku odnak ostannim chasom sposterigayetsya zagalnishij interes do danoyi metodologiyi Programisti takozh vikoristovuyut danu metodologiyu dlya vdoskonalennya i znevadzhennya sircevogo kodu ranishe napisanogo z vikoristannyam inshih metodologij rozrobki VimogiKerovana testami rozrobka vimagaye vid rozrobnika stvorennya avtomatizovanih modulnih testiv yaki viznachayut vimogi do kodu bezposeredno pered napisannyam samogo kodu Test mistit perevirki umov yaki mozhut abo vikonuvatisya abo ni Koli voni vikonuyutsya kazhut sho test projdeno Prohodzhennya testu pidtverdzhuye povedinka peredbachuvana programistom Rozrobniki chasto vikoristovuyut programni karkasi dlya testuvannya angl testing frameworks dlya stvorennya ta avtomatizaciyi zapusku naboriv testiv Na praktici modulni testi pokrivayut kritichni ta netrivialni dilyanki kodu Ce mozhe buti kod shilnij do chastih zmin kod vid roboti yakogo zalezhit pracezdatnist velikoyi kilkosti inshogo kodu abo kod z velikoyu kilkistyu zalezhnostej Seredovishe rozrobki povinno shvidko reaguvati na neveliki modifikaciyi kodu Arhitektura programi povinna bazuvatisya na vikoristanni bezlichi silno pov yazanih komponentiv yaki slabo zalezhat odne vid odnogo zavdyaki chomu testuvannya kodu sproshuyetsya TDD ne tilki proponuye perevirku korektnosti a j vplivaye na dizajn programi Spirayuchis na testi rozrobniki mozhut shvidshe uyaviti yaka funkcionalnist neobhidna koristuvachevi Takim chinom detali interfejsu z yavlyayutsya zadovgo do ostatochnoyi realizaciyi rishennya Zrozumilo sho do testiv zastosovuyutsya taki zh vimogi shodo yakosti kodu yak i do osnovnogo kodu Tri zakoni TDDNe mozhna pisati zhodnogo vihidnogo kodu doki spershu ne napisano padayuchogo yunit testu angl unit test Ne mozhna pisati bilshe yunit testu nizh neobhidno dlya padinnya neprohodzhennya testu Pomilka kompilyaciyi ce takozh padinnya angl failing Ne mozhna pisati bilshe vihidnogo kodu nizh neobhidno dlya prohodzhennya vpalogo yunit testu Cikl rozrobki za metodologiyeyu TDDGrafichna reprezentaciya ciklu rozrobki TDD Use nizhchevkazane bazuyetsya na knizi kotru bagato hto vvazhaye kanonichnim tekstom pro danu koncepciyu u yiyi suchasnomu viglyadi 1 Dodati test U rozrobci cherez testuvannya realizaciya kozhnoyi novoyi funkciyi rozpochinayetsya z napisannya testu Cej test zvisno zh ne bude prohoditi adzhe vin napisanij do togo yak bulo realizovano danij funkcional Dlya togo shob napisati test rozrobnik povinen chitko rozumiti majbutni specifikaciyu ta vimogi do novogo funkcionalu Ce osnovna vidminnist rozrobki cherez testuvannya vid bilsh klasichnogo pidhodu napisannya testiv pislya togo yak napisano sam kod ce zmushuye rozrobnika fokusuvatis na specifikaciyah pered napisannyam kodu 2 Zapustiti usi testi i podivitis chi voni projshli Ce pidtverdzhuye sho usi testi pracyuyut korektno i sho novi testi pomilkovo ne prohodyat ne vimagayuchi pri comu niyakogo novogo kodu Novi testi takozh ne povinni prohoditi z vidomoyi prichini Cej etap ye testuvannyam samih testiv na te chi dayut voni negativnij rezultat ce viklyuchaye mozhlivist togo sho novij test bude zavzhdi prohoditi a otzhe bude marnim 3 Napisati kod Nastupnim krokom ye napisannya kodu yakij zmusit test projti Novij kod napisanij na danomu etapi ne bude doskonalim i mozhe napriklad zmushuvati test prohoditi u nekorektnij sposib Ce ye dopustimim tomu sho na nastupnih krokah danij kod bude polipshuvatis i vidtochuvatis Duzhe vazhlivim momentom ye te sho kod napisanij viklyuchno dlya togo shob prohodili testi niyakoyi dodatkovoyi a otzhe i ne protestovanoyi funkcionalnosti na danomu etapi vnositi ne dozvolyayetsya 4 Zapustiti avtomatichni testi i podivitis chi projshli voni uspishno Yaksho usi testi uspishno prohodyat programist mozhe buti vpevnenim u tomu sho jogo kod vidpovidaye usim vimogam yaki pereviryayutsya testami Ce garna tochka z yakoyi mozhna perejti na finalnij etap ciklu rozrobki 5 Udoskonaliti kod Teper kod pri neobhidnosti mozhe buti vichishenij Shlyahom perezapusku usih testiv rozrobnik mozhe vpevnitis u tomu sho refaktoring kodu ne porushiv jogo vidpovidnist specifikaciyam Koncepciya viluchennya z kodu dublikativ ye vazhlivim aspektom bud yakogo dizajnu programnogo zabezpechennya Stil rozrobkiKerovana testami rozrobka tisno pov yazana z takimi principami yak robi prostishe durnik angl keep it simple stupid KISS i vam ce ne znadobitsya angl you ain t gonna need it YAGNI Dizajn mozhe buti chistishe i yasnishe pri napisanni lishe togo kodu yakij neobhidnij dlya prohodzhennya testu Kent Bek takozh proponuye princip pidrobi poki ne zrobish angl fake it till you make it Testi povinni pisatisya dlya testovanoyi funkcionalnosti Vvazhayetsya sho ce maye dvi perevagi Ce dopomagaye perekonatisya sho zastosunok pridatnij dlya testuvannya oskilki rozrobniku dovedetsya z samogo pochatku obdumati te yak zastosunok bude testuvatisya Ce takozh spriyaye tomu sho testami bude pokrita vsya funkcionalnist Koli funkcionalnist pishetsya do testiv rozrobniki ta organizaciyi shilni perehoditi do realizaciyi nastupnoyi funkcionalnosti she ne protestuvavshi isnuyuchu Ideya pereviryati sho tilki napisanij test ne prohodit dopomagaye perekonatisya sho test realno shos pereviryaye Tilki pislya ciyeyi perevirki slid pristupati do realizaciyi novoyi funkcionalnosti Cej prijom vidomij yak chervonij zelenij refaktoring nazivayut mantroyu rozrobki cherez testuvannya Pid chervonim tut rozumiyut testi yaki ne projshli a pid zelenim yaki projshli testuvannya Vidpracovani praktiki rozrobki cherez testuvannya prizveli do stvorennya tehniki Kerovana prijmalnimi testami rozrobka angl Acceptance Test driven development ATDD v yakomu kriteriyi opisani zamovnikom avtomatizuyutsya v prijmalni testi sho vikoristovuyutsya potim v zvichajnomu procesi kerovanoyi modulnimi testami rozrobki angl unit test driven development UTDD Cej proces dozvolyaye garantuvati sho zastosunok zadovolnyaye sformulovanim vimogam Pri kerovanij prijmalnimi testami rozrobci komanda rozrobnikiv skoncentrovana na chitkij zadachi zadovolniti prijmalni testi yaki vidobrazhayut vidpovidni vimogi koristuvacha Prijmalni funkcionalni testi angl customer tests acceptance tests testi sho pereviryayut funkcionalnist programi na vidpovidnist vimogam zamovnika Prijmalni testi prohodyat na storoni zamovnika Ce dopomagaye jomu buti vpevnenim u tomu sho vin otrimaye vsyu neobhidnu funkcionalnist Vidimist koduNabir testiv povinen mati dostup do kodu sho testuyetsya Z inshogo boku principi inkapsulyaciyi ta prihovuvannya danih ne povinni porushuvatisya Tomu modulni testi zazvichaj pishutsya v tomu zh moduli abo proekti sho i testovanij kod Z kodu testu mozhe ne buti dostupu do private poliv i metodiv Tomu pri modulnomu testuvanni mozhe znadobitisya dodatkova robota V Java rozrobnik mozhe vikoristovuvati angl reflection shob zvertatisya do poliv poznachenim yak private Modulni testi mozhna realizuvati u vnutrishnih klasah shob voni mali dostup do chleniv zovnishnogo klasu V NET Framework mozhut zastosovuvatisya kolektivni klasi angl partial classes dlya dostupu z testa do private poliv i metodiv Vazhlivo shob fragmenti kodu priznacheni viklyuchno dlya testuvannya ne zalishalisya u vipushenomu kodi V Si dlya cogo mozhut buti vikoristani direktivi umovnoyi kompilyaciyi Odnak ce oznachatime sho kod yakij vipuskayetsya ne povnistyu zbigayetsya z protestovanim Ne isnuye yedinoyi dumki sered programistiv yaki zastosovuyut rozrobku cherez testuvannya pro te naskilki ce osmisleno testuvati private i protected metodi i dani Odni perekonani sho dostatno protestuvati bud yakij klas tilki cherez jogo public interfejs oskilki private chleni ce vsogo lishe detal realizaciyi yaka mozhe zminyuvatisya i yiyi zmini ne povinni vidobrazhatisya na nabori testiv Inshi stverdzhuyut sho vazhlivi aspekti funkcionalnosti mozhut buti realizovani v private metodah i testuvannya yih neyavno cherez public interfejs lishe uskladnit situaciyu modulne testuvannya peredbachaye testuvannya najmenshih mozhlivih moduliv funkcionalnosti Prioritet transformacijZgidno koncepciyi TDD testi vedut rozrobnika do pevnoyi realizaciyi Prohodzhennya vpalogo testu dosyagayetsya zavdyaki transformaciyi vihidnogo kodu Chasom mozhna transformuvati kod takim chinom sho podalshe testuvannya bude vkraj uskladnene i vimagatime pereosmislennya realizaciyi znachnoyi chastini abo navit usogo yunita funkciyi metodu klasu Tobto pri nevirnomu vikoristanni TDD mozhe zavesti nedosvidchenogo rozrobnika v gluhij kut abo privesti do neoptimalnoyi realizaciyi algoritmu Dlya dopomogi rozrobnikam bulo zaproponovano princip prioritetu transformacij Vin polyagaye v tomu sho potribno zavzhdi viddavati perevagu prostishim transformaciyam nad skladnishimi Dotrimannya cogo principu mozhe dopomogti unikati gluhih kutiv ta rozroblyati optimalnishi algoritmi vikonannya Fake mock ob yekti ta integracijni testiModulni testi testuyut kozhen modul okremo Ne vazhlivo chi mistit modul sotni testiv abo tilki p yat Testi yaki vikoristovuyutsya pri rozrobci cherez testuvannya ne povinni peretinati kordoni procesu vikoristovuvati merezhevi z yednannya V inshomu vipadku prohodzhennya testiv bude zajmati velikij chas i rozrobniki budut ridshe zapuskati nabir testiv cilkom Vvedennya zalezhnosti vid zovnishnih moduliv abo danih takozh peretvoryuye modulni testi v integracijni Pri comu yaksho odin modul v lancyuzhku vede sebe nepravilno mozhe buti ne vidrazu zrozumilo yakij same Koli kod sho rozroblyayetsya vikoristovuye bazi danih vebservisi abo inshi zovnishni procesi maye sens vidiliti chastinu testuvannya sho pokrivayetsya Ce robitsya v dva kroki Skriz de vimagayetsya dostup do zovnishnih resursiv povinen buti ogoloshenij interfejs cherez yakij cej dostup bude zdijsnyuvatisya Interfejs povinen mati dvi realizaciyi Persha nadaye dostup do resursu i druga sho ye abo Vse sho roblyat fake ob yekti ce dodayut povidomlennya vidu Ob yekt person zberezhenij v log shob potim pereviriti pravilnist povedinki Mock ob yekti vidriznyayutsya vid fake tim sho sami mistyat tverdzhennya angl assertion yaki pereviryayut povedinku testovanogo kodu Metodi fake i mock ob yektiv yaki povertayut dani mozhna nalashtuvati tak shob voni povertali pri testuvanni odni j ti zh pravdopodibni dani Voni mozhut emulyuvati pomilki tak shob kod obrobki pomilok mig buti retelno protestovanij Inshimi prikladami fake sluzhb korisnimi pri rozrobci cherez testuvannya mozhut buti sluzhba koduvannya sho ne koduye dani generator vipadkovih chisel yakij zavzhdi vidaye odinicyu Fake abo mock realizaciyi ye prikladami angl dependency injection Vikoristannya fake i mock ob yektiv dlya predstavlennya zovnishnogo svitu prizvodit do togo sho spravzhnya baza danih ta inshij zovnishnij kod ne budut protestovani v rezultati procesu rozrobki cherez testuvannya Shob uniknuti pomilok neobhidni testi realnih realizacij interfejsiv opisanih vishe Ci testi mozhut buti vidokremleni vid inshih modulnih testiv i realno ye integracijnimi testami Yih neobhidno menshe nizh modulnih i voni mozhut zapuskatisya ridshe Prote najchastishe voni realizuyutsya vikoristovuyuchi ti zh biblioteki dlya testuvannya angl testing framework sho i modulni testi Integracijni testi yaki zminyuyut dani v bazi danih povinni vidkochuvati stani bazi danih do togo yake bulo do zapusku testu navit yaksho test ne projshov Dlya cogo chasto zastosovuyutsya taki tehniki Metod TearDown prisutnij v bilshosti bibliotek dlya testuvannya Try catch finally strukturi obrobki vinyatkiv tam de voni dostupni Tranzakciyi baz danih Stvorennya znimka angl snapshot bazi danih pered zapuskom testiv i vidkat do nogo pislya zakinchennya testuvannya Skidannya bazi danih u chistij stan pered testom a ne pislya nih Ce mozhe buti zruchno yaksho cikavo podivitisya stan bazi danih sho zalishivsya pislya neprojdenogo testu Isnuyut biblioteki Moq jMock NMock EasyMock Typemock jMockit Unitils Mockito Mockachino PowerMock or Rhino Mocks priznacheni sprostiti proces stvorennya mock ob yektiv PerevagiDoslidzhennya 2005 roku pokazalo sho vikoristannya rozrobki cherez testuvannya peredbachaye napisannya bilshoyi kilkosti testiv u svoyu chergu programisti yaki pishut bilshe testiv shilni buti bilsh produktivnimi Gipotezi yaki zv yazuyut yakist kodu z TDD buli neperekonlivimi Programisti yaki vikoristovuyut TDD na novih proektah vidznachayut sho voni ridshe vidchuvayut neobhidnist vikoristovuvati znevadzhuvach Yaksho deyaki z testiv nespodivano perestayut prohoditi vidkat do ostannoyi versiyi yaka prohodit vsi testi mozhe buti produktivnishim nizh znevadzhennya Kerovana testami rozrobka proponuye bilshe nizh prosto perevirku korektnosti vona takozh vplivaye na dizajn programi Z samogo pochatku sfokusuvavshis na testah prostishe uyaviti yaka funkcionalnist neobhidna koristuvachevi Takim chinom rozrobnik produmuye detali interfejsu do realizaciyi Testi zmushuyut robiti svij kod bilsh pristosovanim dlya testuvannya Napriklad vidmovlyatisya vid globalnih zminnih odinichnih predmetiv singletons robiti klasi mensh pov yazanimi i legkimi dlya vikoristannya Silno pov yazanij kod abo kod yakij vimagaye skladnoyi inicializaciyi bude znachno vazhche protestuvati Modulne testuvannya spriyaye formuvannyu chitkih i nevelikih interfejsiv Kozhen klas bude vikonuvati pevnu rol yak pravilo neveliku Yak naslidok zalezhnosti mizh klasami budut zmenshuvatisya a zacheplennya pidvishuvatisya angl design by contract dopovnyuye testuvannya formuyuchi neobhidni vimogi cherez angl assertions Nezvazhayuchi na te sho pri rozrobci cherez testuvannya potribno napisati bilshu kilkist kodu zagalnij chas vitrachenij na rozrobku zazvichaj viyavlyayetsya menshe Testi zahishayut vid pomilok Tomu chas sho vitrachayetsya na znevadzhennya zmenshuyetsya v razi Velika kilkist testiv dopomagaye zmenshiti kilkist pomilok v kodi Usunennya defektiv na bilsh rannomu etapi rozrobki pereshkodzhaye poyavi hronichnih pomilok sho prizvodyat do trivalogo ta visnazhlivogo znevadzhennya v majbutnomu Testi dozvolyayut robiti refaktoring kodu bez riziku jogo zlamati Pri vnesenni zmin v dobre protestovanij kod rizik poyavi novih pomilok znachno nizhche Yaksho nova funkcionalnist prizvodit do pomilok testi yaksho voni zvichajno ye odrazu zh ce pokazhut Pri roboti z kodom na yakomu nemaye testiv pomilku mozhna viyaviti cherez znachnij chas koli z kodom pracyuvati bude nabagato skladnishe Dobre protestovanij kod legko perenosit refaktoring Vpevnenist u tomu sho zmini ne zlamayut isnuyuchu funkcionalnist nadaye vpevnenist rozrobnikam i zbilshuye efektivnist yih roboti Yaksho isnuyuchij kod dobre pokritij testami rozrobniki budut vidchuvati sebe nabagato vilnishe pri vnesenni arhitekturnih rishen yaki poklikani polipshiti dizajn kodu Kerovana testami rozrobka spriyaye bilsh modulnomu i gnuchkomu kodu Ce pov yazano z tim sho pri cij metodologiyi rozrobniku neobhidno dumati pro programu yak pro bezlich nevelikih moduliv yaki napisani i protestovani nezalezhno i lishe potim z yednani razom Ce prizvodit do menshih bilsh specializovanih klasiv zmenshennyu pov yazanosti i chistishih interfejsiv Vikoristannya takozh vnosit vklad v modulyarizaciyu kodu oskilki vimagaye nayavnosti prostogo mehanizmu dlya peremikannya mizh mock i zvichajnimi klasami Oskilki pishetsya lishe toj kod sho neobhidnij dlya prohodzhennya testu avtomatizovani testi pokrivayut vsi shlyahi vikonannya Napriklad pered dodavannyam novogo umovnogo operatora rozrobnik povinen napisati test motivuyuchij dodavannya cogo umovnogo operatora Testi mozhut vikoristovuvatisya yak dokumentaciya Horoshij kod rozpovist pro te yak vin pracyuye krashe za bud yaku dokumentaciyu Dokumentaciya i komentari v kodi mozhut zastarivati Ce mozhe zbivati z panteliku rozrobnikiv yaki vivchayut kod A tak yak dokumentaciya na vidminu vid testiv ne mozhe skazati sho vona zastarila taki situaciyi koli dokumentaciya ne vidpovidaye dijsnosti ne ridkist Slabki miscyaGolovnim nedolikom TDD ye te sho do nogo tyazhko zviknuti Isnuyut zavdannya yaki nemozhlivo prinajmni na potochnij moment virishiti tilki za dopomogoyu testiv Zokrema TDD ne dozvolyaye mehanichno prodemonstruvati adekvatnist rozroblenogo kodu v oblasti bezpeki danih i vzayemodiyi mizh procesami Bezumovno bezpeka zasnovana na kodi v yakomu ne povinno buti defektiv prote vona zasnovana takozh na uchasti lyudini u procedurah zahistu danih Tonki problemi sho vinikayut u sferi vzayemodiyi mizh procesami nemozhlivo z upevnenistyu vidtvoriti prosto zapustivshi deyakij kod Rozrobku cherez testuvannya skladno zastosovuvati v tih vipadkah koli dlya testuvannya neobhidno prohodzhennya funkcionalnih testiv Prikladami mozhe buti rozrobka interfejsiv koristuvacha program sho pracyuyut z bazami danih a takozh togo sho zalezhit vid specifichnoyi konfiguraciyi merezhi Kerovana testami rozrobka ne peredbachaye velikogo obsyagu roboti z testuvannya takogo rodu rechej Vona zoseredzhuyetsya na testuvanni okremo vzyatih moduliv vikoristovuyuchi mock ob yekti dlya predstavlennya zovnishnogo svitu Potribno bilshe chasu na rozrobku i pidtrimku a shvalennya z boku kerivnictva duzhe vazhlivo Yaksho v organizaciyi nemaye vpevnenosti v tomu sho kerovana testami rozrobka polipshit yakist produktu to chas vitrachenij na napisannya testiv mozhe rozglyadatisya yak vitrachenij daremno Modulni testi stvoryuvani pri rozrobci cherez testuvannya zvichajno pishutsya timi zh hto pishe testovanij kod Yaksho rozrobnik nepravilno vitlumachiv vimogi do zastosunku i test i testovanij modul budut mistiti pomilku Velika kilkist vikoristovuvanih testiv mozhut stvoriti pomilkove vidchuttya nadijnosti sho prizvodit do menshoyi kilkosti dij z kontrolyu yakosti Testi sami po sobi ye dzherelom nakladnih vitrat Pogano napisani testi napriklad mistyat zhorstko vshiti ryadki z povidomlennyami pro pomilki abo shilni do pomilok Shob sprostiti pidtrimku testiv slid povtorno vikoristovuvati povidomlennya pro pomilki z testovanogo kodu Riven pokrittya testami sho otrimuyetsya v rezultati rozrobki cherez testuvannya ne mozhe buti legko otrimanij zgodom Vihidni testi stayut vse bilsh cinnimi z plinom chasu Yaksho nevdali arhitektura dizajn abo strategiya testuvannya prizvodyat do velikoyi kilkosti ne projdenih testiv vazhlivo yih vsi vipraviti v individualnomu poryadku Proste vidalennya vidklyuchennya abo pospishna zmina yih mozhe prizvesti do progalin u pokritti testami Dzherela informaciyi Extreme Programming Computerworld online December 2001 webpage Computerworld appdev 92 2011 06 05 u Wayback Machine Newkirk JW and Vorontsov AA Test Driven Development in Microsoft NET Microsoft Press 2004 Feathers M Working Effectively with Legacy Code Prentice Hall 2004 Beck K Test Driven Development by Example Addison Wesley 2003 Koskela L Test Driven TDD and Acceptance TDD for Java Developers Manning Publications 2007 Burton Ross 11 12 2003 O Reilly Media Inc Arhiv originalu za 27 lipnya 2009 Procitovano 12 serpnya 2009 Newkirk James 7 chervnya 2004 Microsoft Corporation Arhiv originalu za 30 chervnya 2009 Procitovano 12 serpnya 2009 Stall Tim 1 bereznya 2005 CodeProject Arhiv originalu za 3 veresnya 2009 Procitovano 12 serpnya 2009 Erdogmus Hakan Morisio Torchiano On the Effectiveness of Test first Approach to Programming Proceedings of the IEEE Transactions on Software Engineering 31 1 January 2005 NRC 47445 Arhiv originalu za 27 serpnya 2011 Procitovano 14 sichnya 2008 We found that test first students on average wrote more tests and in turn students who wrote more tests tended to be more productive Proffitt Jacob TDD Proven Effective Or is it Arhiv originalu za 27 serpnya 2011 Procitovano 21 lyutogo 2008 So TDD s relationship to quality is problematic at best Its relationship to productivity is more interesting I hope there s a follow up study because the productivity numbers simply don t add up very well to me There is an undeniable correlation between productivity and the number of tests but that correlation is actually stronger in the non TDD group which had a single outlier compared to roughly half of the TDD group being outside the 95 band Llopis Noel 20 lyutogo 2005 Games from Within Arhiv originalu za 22 lyutogo 2005 Procitovano 1 listopada 2007 Comparing TDD to the non test driven development approach you re replacing all the mental checking and debugger stepping with code that verifies that your program does exactly what you intended it to do Muller Matthias M Padberg Frank PDF Universitat Karlsruhe Germany s 6 Arhiv originalu PDF za 11 chervnya 2007 Procitovano 1 listopada 2007 Loughran Steve November 6th 2006 PDF HP Laboratories Arhiv originalu PDF za 20 lyutogo 2009 Procitovano 12 serpnya 2009