Оригинал: Writing PHPUnit Tests for PHP Projects

Перевод для канала Мы ж программист

Тестирование – важнейшая часть разработки программного обеспечения, которая обеспечивает надежность, сопровождаемость и безотказность кода.

PHPUnit – популярный фреймворк для тестирования на PHP, специально разработанный для модульного тестирования.

В этой статье мы рассмотрим, как писать тесты PHPUnit для проектов на PHP, сопровождая их примерами и объяснениями.

Что такое PHPUnit?

PHPUnit – это платформа тестирования для PHP, которая позволяет разработчикам писать и запускать модульные тесты. Она вдохновлена JUnit для Java и предлагает такие функции, как автоматизация тестирования, утверждения (assertions) и управление тест-кейсами.

Зачем использовать PHPUnit?

  1. Обеспечивает качество кода.
  2. Упрощает отладку, выявляя проблемы на ранней стадии.
  3. Повышает уверенность при рефакторинге.
  4. Поддерживает автоматизированное тестирование в конвейерах CI/CD.

Настройка PHPUnit

Шаг 1: установка PHPUnit

Самый простой способ установить PHPUnit – через Composer. Выполните следующую команду:

Bash
composer require --dev phpunit/phpunit

Шаг 2: проверка установки

После установки запустите:

Bash
vendor/bin/phpunit --version

Вы должны увидеть версию установленного PHPUnit.


Написание вашего первого теста

Давайте создадим простой PHP класс для тестирования.

Класс для тестирования: Calculator

PHP
<?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
<?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): Удостоверяется, что ожидаемый результат соответствует актуальному результату.

Запуск тестов

Чтобы запустить тесты, выполните:

Bash
vendor/bin/phpunit --testdox

Флаг --testdox выводит результаты тестов в человеко-читаемом виде:

Bash
Calculator
  Addition
  Subtraction

Дополнительные возможности PHPUnit

1. Поставщики данных

Поставщики (провайдеры) данных позволяют запускать тесты с наборами данных.

PHP
<?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
<?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 тестов

  1. Пишите тесты как можно раньше
    Применяйте подход Test-Driven Development (TDD), когда возможно.
  2. Фокусируйтесь на одной вещи
    Каждый тест должен проверять одно поведение.
  3. Используйте значимые названия
    Называйте тесты понятно, чтобы отразить, что они тестируют.
  4. Делайте тесты независимыми
    Избегайте зависимостей между тестами, чтобы обеспечить прогнозируемое выполнение.
  5. Запускайте тесты регулярно
    Интегрируйте тесты в свой конвейер CI/CD.