Оригинал: Writing PHPUnit Tests for PHP Projects
Перевод для канала Мы ж программист
Тестирование – важнейшая часть разработки программного обеспечения, которая обеспечивает надежность, сопровождаемость и безотказность кода.
PHPUnit – популярный фреймворк для тестирования на PHP, специально разработанный для модульного тестирования.
В этой статье мы рассмотрим, как писать тесты PHPUnit для проектов на PHP, сопровождая их примерами и объяснениями.
Что такое PHPUnit?
PHPUnit – это платформа тестирования для PHP, которая позволяет разработчикам писать и запускать модульные тесты. Она вдохновлена JUnit для Java и предлагает такие функции, как автоматизация тестирования, утверждения (assertions) и управление тест-кейсами.
Зачем использовать PHPUnit?
- Обеспечивает качество кода.
- Упрощает отладку, выявляя проблемы на ранней стадии.
- Повышает уверенность при рефакторинге.
- Поддерживает автоматизированное тестирование в конвейерах CI/CD.
Настройка PHPUnit
Шаг 1: установка PHPUnit
Самый простой способ установить PHPUnit – через Composer. Выполните следующую команду:
composer require --dev phpunit/phpunit
Шаг 2: проверка установки
После установки запустите:
vendor/bin/phpunit --version
Вы должны увидеть версию установленного PHPUnit.
Написание вашего первого теста
Давайте создадим простой PHP класс для тестирования.
Класс для тестирования: Calculator
<?php
class Calculator
{
public function add($a, $b)
{
return $a + $b;
}
public function subtract($a, $b)
{
return $a - $b;
}
}
Класс Calculator
имеет два метода: add
и subtract
.
Создание тест-кейса
Тесты PHPUnit пишутся в классах, которые наследуют PHPUnit\Framework\TestCase
.
<?php
use PHPUnit\Framework\TestCase;
class CalculatorTest extends TestCase
{
public function testAddition()
{
$calculator = new Calculator();
$result = $calculator->add(2, 3);
// Утверждение, что результат равен 5
$this->assertEquals(5, $result);
}
public function testSubtraction()
{
$calculator = new Calculator();
$result = $calculator->subtract(5, 3);
// Утверждение, что результат равен 2
$this->assertEquals(2, $result);
}
}
Составляющие теста
1. Наследование TestCase
Класс CalculatorTest
наследует PHPUnit\Framework\TestCase
, который предоставляет доступ ко всем методам PHPUnit.
2. Методы тестирования
Каждый метод тестирования начинается с префикса test
. Например, testAddition
проверяет поведение метода add
.
3. Утверждения (assertions)
PHPUnit предоставляет большой спектр утверждающих методов для валидации поведения.
assertEquals(expected, actual)
: Удостоверяется, что ожидаемый результат соответствует актуальному результату.
Запуск тестов
Чтобы запустить тесты, выполните:
vendor/bin/phpunit --testdox
Флаг --testdox
выводит результаты тестов в человеко-читаемом виде:
Calculator
✔ Addition
✔ Subtraction
Дополнительные возможности PHPUnit
1. Поставщики данных
Поставщики (провайдеры) данных позволяют запускать тесты с наборами данных.
<?php
class CalculatorTest extends TestCase
{
/**
* @dataProvider additionProvider
*/
public function testAddition($a, $b, $expected)
{
$calculator = new Calculator();
$this->assertEquals($expected, $calculator->add($a, $b));
}
public function additionProvider()
{
return [
[1, 2, 3],
[0, 0, 0],
[-1, -1, -2],
];
}
}
2. Имитация зависимостей
Для классов с зависимостями функция имитации (mock) помогает симулировать поведение.
<?php
use PHPUnit\Framework\TestCase;
class UserServiceTest extends TestCase
{
public function testGetUserName()
{
$userRepository = $this->createMock(UserRepository::class);
$userRepository->method('findUserById')->willReturn(['id' => 1, 'name' => 'John Doe']);
$userService = new UserService($userRepository);
$this->assertEquals('John Doe', $userService->getUserName(1));
}
}
Порядок написания PHPUnit тестов
- Пишите тесты как можно раньше
Применяйте подход Test-Driven Development (TDD), когда возможно. - Фокусируйтесь на одной вещи
Каждый тест должен проверять одно поведение. - Используйте значимые названия
Называйте тесты понятно, чтобы отразить, что они тестируют. - Делайте тесты независимыми
Избегайте зависимостей между тестами, чтобы обеспечить прогнозируемое выполнение. - Запускайте тесты регулярно
Интегрируйте тесты в свой конвейер CI/CD.