Пример тестирования на PHPUnit

PHPUnit - это фреймворк для модульного тестирования (юнит-тестирования) на языке программирования PHP.

Структура файлов тестов обычно повторяет структуру файлов проекта, но к названиям файлов добавляется постфикс Test. Приведём пример, где файлы проекта лежат в директории src, а тесты в директории tests.

src --- Controller ------ BaseController.php --- Service ------ Mail.php --- Module.php tests --- Controller ------ BaseControllerTest.php --- Service ------ MailTest.php --- ModuleTest.php

Установка

Установим PHPUnit через composer. Другие варианты установки в официальной документации.

composer require --dev phpunit/phpunit ^6.5


Файл конфигурации phpunit.xml

 

Простой тест

Протестируем простой метод add() класса Calculator, который складывает два числа и возвращает результат.
Код класса Calculator:

<?php
// src/ExampleProject/Calculator.php
namespace ExampleProject;

class Calculator
{
    /**
     * @param mixed $a
     * @param mixed $b
     * @return mixed
     */
    public function add($a, $b)
    {
        return $a + $b;
    }
}
            

Класс теста нужно называть также как тестируемый класс, но с постфиксом Test. Тестовые методы нужно называть с префиксом test. Названия лучше давать такие, чтобы любому сразу было понятно, что проверяет тест.

Код теста:

<?php
// tests/ExampleProject/CalculatorTest.php
namespace Tests\ExampleProject;

use PHPUnit\Framework\TestCase;
use ExampleProject\Calculator;

class CalculatorTest extends TestCase
{
    public function testAdd()
    {
        $calculator = new Calculator();
        $this->assertEquals(4, $calculator->add(2, 2));
    }
}
            

Запуск теста:

./vendor/phpunit/phpunit/phpunit tests/ExampleProject/CalculatorTest.php

Результат выполнения:

PHPUnit 6.5.7 by Sebastian Bergmann and contributors.

.......                                                             1 / 1 (100%)

Time: 1.85 seconds, Memory: 4.00MB

OK (1 tests, 1 assertions)
            

Тест прошёл успешно, выполнен 1 тест, 1 проверка и т.д.

Метод assertEquals(mixed $expected, mixed $actual[, string $message = '']) проверяет, что $actual равна $expected. Если это не так, то тест падает и выводит сообщение $message, если оно передано. Этим методом мы заявляем, что тест будет пройден, если $actual равна $expected.

У PHPUnit множество методов проверки (assertions).
Например:

  • assertFalse(bool $condition[, string $message = '']) - проверяет, что $condition равна false
  • assertInstanceOf($expected, $actual[, $message = '']) - проверяет, что $actual является экземпляром $expected
  • assertCount($expectedCount, $haystack[, string $message = '']) - проверяет, что $haystack содержит $expectedCount элементов.

Также есть множество других методов, с ними можно ознакомиться в официальной документации PHPUnit.

Запускать можно сразу все тесты:

./vendor/phpunit/phpunit/phpunit tests