Розробка через тестування (tdd)

Тестування коду дратує, але приносить величезну користь при роботі над проектом. Сьогодні ми будемо використовувати TDD, щоб писати і тестувати код більш ефективно.

Що таке TDD?

З самого початку комп'ютерної ери програмісти і помилки боролися за владу. Це неминуче явище. Кожен програміст ставав жертвою помилок. Код небезпечний. Ось чому ми проводимо тести.

Розробка через тестування (test-driven development) - техніка програмування, при якій модульні тести для програми або її фрагмента пишуться до самої програми (test-first development) і, по суті, керують її розробкою.

Як це працює?

Розробка через тестування або TDD є короткий повторюваний цикл розвитку:

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

Розробка через тестування (tdd)

Відмінно, але чим це краще регулярного тестування?

Ви не проводили тестування програми з кількох причин:

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

Довгий час нічого не відбувається, і ви перенесли ваш продукт на виробництво. Але іноді після того як продукт перенесений на виробництво, все відбувається не так.


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

Як провести тести?

Існує багато фреймворків для тестування PHP скриптів. Одним з найбільш широко використовуваних є PHPUnit.

PHPUnit це відмінний фреймворк для тестування, який можна легко інтегрувати в свої проекти або інші проекти, створені за допомогою популярних PHP фреймворків.

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

Розглянемо розробку і тестування гостьової книги, в якій кожен користувач може додати, а також переглядати повідомлення. Припустимо, що розмітка вже зроблена, і ми просто робимо клас, який містить логіку гостьової книги, яка включає в себе читання і запис з бази даних. Метод читання цього класу - це те, що ми збираємося розробити і протестувати.

Крок 1. Налаштування SimpleTest

Завантажте SimpleTest тут і розпакуйте в будь-яку папку. Все повинно виглядати так:

Розробка через тестування (tdd)

Index.php буде підключати guestbook.php, і викликати метод виведення записів. В папці classes буде знаходитися guestbook.php, а в папці test знаходиться розпакований SimpleTest.

Крок 2. Плануйте свої дії

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

Давайте встановимо схему роботи для нашої гостьової книги:

Крок 3. Напишіть тест

Тепер ми можемо написати перший тест. Для початку створимо файл з ім'ям guestbook_test.php в папці test.

Потім, давайте реалізуємо наші вимога з кроку 2.

Як ви можете тут бачити, ми перевіряємо висновок гостьової книги з записами та без. Ми перевіряємо чи задовольняють ці дві функції критеріям, встановленим в кроці 2. Кожна з наших випробувальних функцій починається зі слова 'test'. Ми зробили це для того, бо SimpleTest при запуску цього класу буде шукати функції починаються зі слова 'test' і запускати їх.

У нашому випробувальному класі ми використовували деякі методи перевірки: assertTrue, assertIsA, і assertEquals. Функція assertTrue перевіряє, чи є значення істинним. assertIsA перевіряє тип змінної. І нарешті, функція assertEquals перевіряє дорівнює змінна певному значенню.

Є інші методи перевірки, які надаються SimpleTest:

Невдача, якщо $ x == false

Крок 4. Програш

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

Щоб запустити тест, ви повинні відкрити guestbook_test.php в браузері. Ви побачите:

Так як ми ще не створили наш клас guestbook, ми зазнали провал. Щоб це виправити створіть файл guestbook.php в папці classes. Клас буде містити методи які ми планували, але вони нічого містити не будуть. Пам'ятайте, ми пишемо тести раніше, ніж написати код продукту.
Так як ми ще не створили наш клас guestbook, ми зазнали провал. Щоб це виправити створіть файл guestbook.php в папці classes. Клас буде містити методи які ми планували, але вони нічого містити не будуть. Пам'ятайте, ми пишемо тести раніше, ніж написати код продукту.

Коли ви запустити тест наступного разу, ви побачите:

Коли ви запустити тест наступного разу, ви побачите:

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

Крок 5. Написання коду продукту

Тепер, коли у нас є тест, ми можемо приступати до написання коду. Відкрийте файл guestbook.php і почніть писати:

У класі guestbook.php є деякі помилки, які ми допустили навмисно, тепер ми перевіримо проходить наш код тест чи ні:

Перевірка показує нам, що тест містить помилки. За допомогою діагностичних повідомлень легко визначити місце перевірки, яке призводить до помилки:

Це говорить нам, що повертається масив не мав правильного ключа. Грунтуючись на цьому, ми знаємо яка частина нашого коду не працює належним чином:

Зараз, коли запустимо тест, ми побачимо:

Крок 6. Рефакторинг і вдосконалення коду

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

Крок 7. Повторіть

В остаточному підсумку, коли необхідні нові функції, ви повинні будете написати нові тести. Це легко! Повторіть всі кроки, починаючи з кроку 2 (так як ваші файл SimpleTest повинні бути вже налаштовані), і почніть цикл знову і знову.

висновок

Ми розглянули використання SimpleTest для розробки продуктів. Ми охопили не весь функціонал SimpleTest. Додаткову інформацію можна знайти, використовуючи документацію (англ.) Або статтю Вікіпедії (англ.).

Тестування - невід'ємна частина циклу розвитку, але зазвичай, це перша річ, яку скорочують при стислих термінах розробки. Хотілося б сподіватися, що після прочитання цієї статті, ви будите цінувати розробку через тестування.

Схожі статті