Основи unit тестування в php за допомогою phpunit
Знайома ситуація: ви розробляєте додаток, вирішуєте проблеми і, іноді, виникає відчуття, що ви ходите по колу. Керуєте один баг і відразу з'являється інший. Іноді це той, який ви поправили 30 хвилин назад, іноді - новий. Налагодження стає дуже складною, але є хороший і простий вихід з цієї ситуації. Юніт тести можуть не тільки зменшити біль при розробці, але і допоможуть писати код, який легше супроводжувати і легше змінювати.
Для розуміння того, що таке модульне тестування, необхідно визначити поняття «модуля». Модуль (або unit) - це частина функціоналу додатка результат роботи якої ми можемо перевірити (або протестувати). Модульне тестування - це, власне перевірка, що даний модуль працює саме так як ожідается.Напісав один раз тести, всякий раз коли ви внесете зміни в код, вам залишиться тільки запустити тести, для перевірки, що все правильно. Таким чином ви завжди будете впевнені, що своїми змінами ви не зламаєте систему.
Міфи про юніт тестуванні
Не дивлячись на всю користь юніт тестування, не всі розробники ним користуються. Чому? Є кілька відповідей на це питання, але всі вони - не дуже хороші виправдання. Розглянемо найбільш поширені причини і спробуємо розібратися чому вони не виправдані.
Написання тестів займає надто багато часу
Не треба тестів - код і так працює!
Ще одне виправдання розробників: додаток працює - немає необхідності в тестуванні. Вони знають додаток і знають його слабкі місця, і зможуть поправити все, що треба, іноді за кілька секунд. Але уявіть, що для розробки програми притягнути нового розробника, який поняття не має як влаштований код. Новачок може зробити будь-які зміни, які можуть зламати будь-що. Юніт тести допоможуть уникнути подібних ситуацій.
Це не цікаво
І ще одина причина чому розробники не люблять тести - це нецікаво. Розробники по натурі своїй люблять вирішувати проблеми. Написання коду - це як створення чогось з порожнечі, створення порядку з хаосу, створення чогось корисного. В результаті написання тестів стає нудним заняттям, справою яке можна зробити після основної роботи. І тестування відходить на задній план. Але подивіться на це з іншого боку: ловити будь-якої неприємний баг годинами - теж невесело.
Приступимо до практики. У наших прикладах ми будемо використовувати бібліотеку PHPUnit. Найпростіший спосіб встановити PHPUnit - затягнути з PEAR каналу.
Якщо все пройде добре, то всі необхідні інструменти будуть встановлені. Якщо ви хочете встановити PHPUnit вручну - інструкцію ви знайдете тут.
перший тест
Використовуючи PHPUnit, ви будете писати тестові класи, що містять тестові методи і все це повинно відповідати таким угодам:
- У більшості випадків ви будете наслідувати клас PHPUnit_Framework_TestCase. що надасть вам доступ до вбудованих методів, наприклад, setUp () і tearDown ().
- Ім'я тестирующего класу утворюється додаванням слова Test до імені тестованого класу. Наприклад, ви тестируете клас RemoteConnect. значить ім'я тестирующего - RemoteConnectTest.
- Імена тестують методів завжди повинні починатися з "test" (наприклад, testDoesLikeWaffles ()). Методи повинні бути публічними. Ви можете використовувати приватні методи в своїх тестах, але вони не будуть запускатися як тести через PHPUnit.
- Тестуючі методи не приймають параметрів. Ви повинні писати тестуючі методи максимально незалежними і самодостатніми. іноді це незручно, але ви отримаєте більш чисті та ефективні тести.
Напишемо невеликий клас для тестування RemoteConnect.php:
Якщо ми хочемо протестувати функціонал для з'єднання з віддаленим сервером, то ми повинні написати подібний тест:
Тестуючий клас успадковує базовий PHPUnit клас, а значить і всю необхідну функціональність. Перші два методи - setUp і tearDown - приклад цієї вбудованої функціональності. Це допоміжні функції, які є частиною кожного тесту. Вони виконуються до запуску всіх тестів і після відповідно. Але зараз нас цікавить метод testConnectionIsValid. Цей метод створює об'єкт типу RemoteConnect. і викликає метод connectToServer.
Ми викликаємо ще одну допоміжну функцію assertTrue в нашому тесті. Ця функція визначає найпростіше твердження (assertion): вона перевіряє чи є передане значення істиною. Інші допоміжні функції виконують перевірки властивостей об'єктів, існування файлів, наявності ключів в масиві, або відповідності регулярному виразу. У нашому випадку ми хочемо переконатися в правильності підключення до віддаленого сервера, тобто в тому, що функція connectToServer повертає true.
запуск тестів
Запускаються тести простим викликом команди phpunit із зазначенням вашого php файлу з тестами:
PHPUnit запускає всі тести і збирає трохи статистики: успішно завершився тест чи ні, кількість тестів і тверджень (assertions) і виводить все це. Приклад виведення:
Для кожного виконаного тесту буде виведений результат: «.» Якщо тест завершився успішно, "F" якщо тест не пройдений, "I" якщо тест неможливо завершити і "S" якщо тест був пропущений.
У нашому прикладі тест завершився успішно, значить тестована функція працює як очікується. Але перевірки функції тільки на правильність роботи недостатньо, необхідно так само перевірити роботу функції при неправильному використанні.
У PHPUnit передбачений набір базових перевірок, які покривають більшість можливих ситуацій. Звичайно, іноді доведеться писати хитрі тести, які тестують нетривіальну функціональність вашого застосування. Але в основному використовуються базові функції PHPUnit:
Перевірка переданих значень на рівність true / false
Наприклад є функція, яка повертає об'єкт (returnSampleObject) і ми хочемо переконатися в тому, що повертається об'єкт буде потрібного нам типу:
Один тест - одне твердження (assert)
Як і у всіх областях розробки програмного забезпечення, в тестуванні є кращі практики. Одна з них - «один тест - одне твердження» (one test, one assertion). Це правило допоможе писати невеликі і легко Новомосковскемие тести. Але іноді виникають думки: «Раз вже ми тут перевіряємо це, то і дещо інше заодно перевіримо!». наприклад:
Test-driven Development (розробка через тестування)
Було б недобре, кажучи про тестування не згадати про поширену техніці розробки - розробці через тестування (test driven development). TDD - це техніка, яка використовується при розробці програмного забезпечення. Основна ідея цієї техніки полягає в тому, що спочатку пишуться тести і тільки після написання тестів пишеться код додатка, який пройде ці тести.
Дивіться також
- Юніт тестування в PHP за допомогою PHPUnit. Вникаємо в assert-методи.

- Юніт тестування за допомогою PHPUnit. Анотації та mock-об'єкти.

- Реєстрація в один клік від Google

- Команди для роботи по протоколу SSH

- Регулярні вирази в Java. Частина 1.

- Кілька корисних регулярних виразів для веб-розробки.

- Читання записів Google+ за допомогою PHP і Google+ API

- Проста система реєстрації на PHP і MySql
