Це друга стаття із серії про розробку через тестування.
В попередній статті ми розібрали основний принцип TDD. Тепер поговоримо про інструменти для організації робочого процесу. \ Як я вже говорив, для тестів я використовую PHPStorm + localhost + PHPUnit
Налаштовуємо робоче місце
Необхідні пакети
Localhost \ Перш за все потрібно встановити локальний сервер, якщо він ще не встановлений.
- Для Windows я рекомендую OpenServer – проста у використанні й дуже функціональна програма, яка встановить все необхідне для localhost (в тому числі й командний рядок).
- Якщо ви користуєтеся Linux, то пакету LAMP буде достатньо.
PHPUnit
\
Існує окрема версія PHPUnit майже для кожної версії PHP, тому спочатку потрібно з'ясувати, яка у вас версія. Зробити це можна через командний рядок (php -v
) або вивівши phpinfo();
. В мене використовується PHP v7.0.
Тепер заходимо сюди й качаємо потрібний дистрибутив фреймворку PHPUnit. Якщо у вас інша версія PHP, перейдіть на відповідний дистрибутив у блоці Go here
(http://prntscr.com/jaobb4). Файл має мати розширення .phar
Налаштовуємо PHPStorm
Налаштування PHPStorm складається з 2-х кроків.
Крок перший. Налаштовуємо інтерпретатор:
- Для цього відкриваємо налаштування IDE:
File
->Settings
(або Ctrl+Alt+S) ->Languages & Frameworks
->PHP
(http://prntscr.com/jaove9), - Вибираємо версію PHP. У верхньому і нижньому полі має бути однакове значення. Якщо в нижньому селекті немає потрібної версії, її можна додати через
...
(http://prntscr.com/jaoy7t). Там потрібно вказати шлях, у вашій файловій системі до файлу інтерпретатора PHP потрібної вам версії, - Тиснемо
Apply
внизу вікна.
Крок другий. Налаштовуємо PHPUnit:
- Заходимо у
Languages & Frameworks
->Test Frameworks
(http://prntscr.com/jaoz7r) і натискаємо+
, - Вибираємо
PHPUnit Local
(http://prntscr.com/jaozfm), - В нас відкриється форма, в якій потрібно вибрати
Path to phpunit.phar
, - Відкриється ось таке поле (http://prntscr.com/jaozy6), де потрібно вказати шлях до файлу, який ми завантажили на початку статті,
- Натискаємо на 2 стрілочки, розміщені по колу (справа від поля) – червоний знак оклику має стати зеленим і біля нього має з'явитися версія PHPUnit.
Нюанси: ви отримаєте помилку, якщо у вас версія інтерпретатора не сумісна з версією PHPUnit і/або інтерпретатор не був налаштований коректно.
Якщо все зроблено правильно, то система для розробки через тестування готова.
Також ви можете зробити все те саме, але не завантажуючи файл .phar
, а використавши Composer
, в такому випадку вам потрібно буде вибрати Use Composer autoloader
і вказати шлях до vendor\\autoload.php
.
Стандарт найменування
Основні вимоги:
- Клас, який ви плануєте тестувати має бути доступний. Тобто вам потрібно під'єднати autoloader у тесткейс або під'єднати ваш клас напряму, через
require
. - Клас тесткейсу має наслідуватися від абстрактного класу
PHPUnit\\Framework\\TestCase
- Назва класу тесткейсу має завершуватися на
Test
(це більше як код-стандарт, ніж обов'язкова вимога, але стандартів потрібно дотримуватися) - Всі тестові методи в тесткейсі мають мати наступну структуру –
test
.{назва матоду}
.{додаткова інформація про те, що саме тестується в даному методі}
. Наприклад,userTest::test_subtract_rating_negative_value()
– тест-метод, який перевіряє методuser::subtract_rating()
з від'ємним значенням.
Для економії часу, я використовую IDE. Через контекстне меню, на потрібному файлі класу, створюю файл тесткейсу (http://prntscr.com/japfhh).
Інтерфейс
Я не буду розписувати весь інтерфейс, для цього є документація. \ Зупинюсь лише на найчастіше вживаних (на мою думку) методах:
-
$this->assertEquals()
– стверджує рівність лише значень двох змінних; -
$this->assertSame()
– стверджує рівність значень і типів двох змінних; -
$this->assertEmpty()
і$this->assertNotEmpty()
– стверджує, що значення порожнє і не порожнє; -
$this->assertTrue()
і$this->assertFalse()
– булеве ствердження; -
$this->assertFileExists()
$this->assertFileNotExists()
– стверджує доступності і недоступності файлу; -
$this->assertIsReadable()
і$this->assertIsWritable()
– стверджує доступності файлу/теки на читання і на запис; -
$this->assertContains()
і$this->assertNotContains()
– стверджує що змінна (рядок, масив тощо) містить і не містить потрібне значення; -
$this->assertInternalType()
– стверджує, що змінна є вказаного типу (string
,int
і тощо); -
$this->assertInstanceOf()
– стверджує, що об'єкт є екземпляром вказаного класу; -
$this->assertObjectHasAttribute()
– стверджує, що об'єкт має необхідну властивість.
Загалом перевага PHPStorm, що в нього є чудовий автокомплітер (CTRL
+Space
– http://prntscr.com/jaqg4h) і механізм вивчення коду (CRTL
+мишка
):
- При наведенні курсора на ім'я методу - підсвічує коментар: http://prntscr.com/jaqe70
- При натисканні на ім'я методу - перекидає на саме тіло функції, де можна вивчити, що і як виконується (http://prntscr.com/jaqety).
Анотації
Анотація вказується у коментарі до методу класу тесткейсу. Таким чином фреймворк буде розуміти, що у позначеного методу є спеціальне призначення. Документація.
Окремо зверну увагу лише на ці анотації:
-
@before
– позначений метод буде запускатися перед кожним тестовим методом, -
@after
– позначений метод буде запускатися після кожного тестового методу, -
@beforeClass
– позначений метод буде запускатися перед початком виконання тесткейсу, -
@afterClass
– позначений метод буде запускатися після завершення виконання тесткейсу, -
@dataProvider
- дозволяє виконувати один тест з багатьма варіантами вхідних даних, наприклад якщо ваш тест потрібно перевірити з вхідним параметром1
а також з2
і з0
, то не порібно писати 3 різних тесткейси, достатньо одного +@dataProvider
, -
@expectedException
- якщо ви тестуєте негативний сценарій і ваш метод має викинути виняток, то не потрібно використовувати конструкціюtry {} catch {}
, достатньо вказати в анотації, який виняток слід очікувати. Також є анотації, які додатково дозволяють проаналізувати код і текст винятка.
Анонс \ У наступній статті мова піде про покриття коду тестами – інструменти аналізу, про те, що потрібно, а що не варто покривати тестами.
Чистого коду і попутних завдань!
Ще немає коментарів