TDD в PHP, ч. 2: інструменти для написання Unit-тестів

5 хв. читання

Це друга стаття із серії про розробку через тестування.

В попередній статті ми розібрали основний принцип 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.

Стандарт найменування

Основні вимоги:

  1. Клас, який ви плануєте тестувати має бути доступний. Тобто вам потрібно під'єднати autoloader у тесткейс або під'єднати ваш клас напряму, через require.
  2. Клас тесткейсу має наслідуватися від абстрактного класу PHPUnit\\Framework\\TestCase
  3. Назва класу тесткейсу має завершуватися на Test (це більше як код-стандарт, ніж обов'язкова вимога, але стандартів потрібно дотримуватися)
  4. Всі тестові методи в тесткейсі мають мати наступну структуру – 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+Spacehttp://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 {}, достатньо вказати в анотації, який виняток слід очікувати. Також є анотації, які додатково дозволяють проаналізувати код і текст винятка.

Анонс \ У наступній статті мова піде про покриття коду тестами – інструменти аналізу, про те, що потрібно, а що не варто покривати тестами.

Чистого коду і попутних завдань!

Помітили помилку? Повідомте автору, для цього достатньо виділити текст з помилкою та натиснути Ctrl+Enter
Codeguida 5.8K
Приєднався: 8 місяців тому
Коментарі (0)

    Ще немає коментарів

Щоб залишити коментар необхідно авторизуватися.

Вхід / Реєстрація