Статья

📘 Глава 26. Тестирование кода в PHP. Введение в PHPUnit

🤔 Зачем тестировать код?

  • Надёжность — можно быть уверенным, что всё работает как задумано

  • Безопасные изменения — ты можешь менять код, не ломая старое

  • Автоматическая проверка — экономит время


✅ Что такое Unit-тест?

Unit-тест (модульный тест) — это маленький тест, который проверяет работу одной функции или метода.

Пример: проверить, что sum(2, 3) действительно возвращает 5.


🔧 Установка PHPUnit через Composer

composer require --dev phpunit/phpunit

Это добавит PHPUnit только для разработки.


📁 Пример структуры проекта с тестами

project/
├── src/
│   └── Calculator.php
├── tests/
│   └── CalculatorTest.php
├── composer.json
├── vendor/
└── phpunit.xml

📦 Класс, который мы будем тестировать

src/Calculator.php:

namespace App;

class Calculator {
    public function add(int $a, int $b): int {
        return $a + $b;
    }

    public function divide(int $a, int $b): float {
        if ($b === 0) {
            throw new \InvalidArgumentException("Division by zero");
        }

        return $a / $b;
    }
}

🧪 Создание теста

tests/CalculatorTest.php:

use PHPUnit\Framework\TestCase;
use App\Calculator;

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

    public function testDivide() {
        $calc = new Calculator();
        $this->assertEquals(2.0, $calc->divide(4, 2));
    }

    public function testDivideByZero() {
        $this->expectException(\InvalidArgumentException::class);

        $calc = new Calculator();
        $calc->divide(4, 0);
    }
}

📄 Конфигурация: phpunit.xml

Создай файл phpunit.xml в корне проекта:

<?xml version="1.0" encoding="UTF-8"?>
<phpunit bootstrap="vendor/autoload.php">
    <testsuites>
        <testsuite name="My Test Suite">
            <directory>tests</directory>
        </testsuite>
    </testsuites>
</phpunit>

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

vendor/bin/phpunit

📚 Основные методы TestCase

  • assertEquals($expected, $actual)

  • assertTrue($condition)

  • assertFalse($condition)

  • assertInstanceOf(ClassName::class, $object)

  • expectException(SomeException::class)

  • assertCount($count, $array)

Полный список: https://phpunit.de/manual


🧠 Полезные советы

  • Пиши тесты на ключевые участки логики

  • Не пиши тесты ради количества

  • Запускай тесты автоматически (например, через GitHub Actions)

  • Покрытие кода тестами — это не цель, а инструмент


✅ Что ты усвоил:

  • Что такое unit-тесты и зачем они нужны

  • Как установить и настроить PHPUnit

  • Как писать простые тесты и запускать их


⏭ В следующей главе:

Поговорим о современных возможностях PHP 8–8.5: аттрибутах, union types, named arguments, match, readonly, nullsafe и других вкусностях.

PHP
Для ответа вы можете авторизоваться