Приложение уже сохраняет книги, проверяет ввод и показывает список. Но после перестройки легко сломать правило разбора года или подписи, не заметив этого сразу. Автоматический тест запускает код с известными данными и сравнивает результат с ожидаемым.

Ставим PHPUnit для разработки

Добавьте PHPUnit в зависимости только для разработки:

composer require --dev phpunit/phpunit

Composer выберет версию, совместимую с указанной версией PHP проекта. Перед обновлением сверяйтесь с таблицей требований PHPUnit. Тестовая библиотека не нужна на рабочем сервере приложения.

Проверяем правило разбора года

Сохраните функцию parseYear() в src/functions.php и подключите этот файл в автозагрузке Composer или явно в тесте. Создайте tests/YearTest.php:

<?php
declare(strict_types=1);

require dirname(__DIR__) . '/src/functions.php';

final class YearTest extends \PHPUnit\Framework\TestCase
{
    public function test_valid_year_is_returned_as_an_integer(): void
    {
        self::assertSame(1965, parseYear('1965'));
    }

    public function test_non_numeric_input_is_rejected(): void
    {
        $this->expectException(InvalidArgumentException::class);
        parseYear('не год');
    }
}

assertSame() проверяет и значение, и тип. Если функция вернёт строку '1965' вместо числа 1965, тест обнаружит отличие. expectException() говорит PHPUnit, что этот сценарий должен завершиться исключением.

Запускаем тесты

vendor/bin/phpunit tests

В Windows исполняемый файл обычно находится по пути vendor\bin\phpunit. Успешный запуск показывает, сколько тестов прошло. Если тест падает, сообщение содержит место ожидания и фактический результат.

Тестируйте поведение, а не строки кода

Тест не должен подтверждать, что внутри функции есть конкретный if. Проверьте смысл: корректный год принят, неправильный отклонён, подпись книги содержит нужные части. Тогда код можно переписать, сохранив проверку внешнего поведения.

Для SQLite можно добавить интеграционный тест: создать временную базу, сохранить книгу через репозиторий, прочитать её и сравнить результат. Временное хранилище изолирует тест от реального каталога.

Короткая команда через Composer

Добавьте скрипт в composer.json:

{
  "scripts": {
    "test": "phpunit tests"
  }
}

Теперь composer test запускает тот же набор. Эту команду можно выполнять перед публикацией изменений и в автоматической сборке.

Сколько тестов нужно

Начните с правил, от которых зависит сохранность данных: валидация, переход статуса, повреждённый JSON, сохранение и чтение книги. Проверяйте ошибки и граничные значения. Важнее покрыть ключевые решения приложения, чем стремиться проверить каждую строку.

В финальной части подготовим каталог к запуску: отделим настройки от кода, настроим публичный корень и пройдём короткий список перед выкладкой.

Часть 15 из 16.

← Часть 14: PDO и SQLite в PHP: база и подготовленные запросы · Часть 16: Публикуем PHP-приложение: настройки и чек-лист для продакшена →

Документация