Skip to content

Testing

github-actions[bot] edited this page Jul 15, 2026 · 1 revision

🧪 Тестирование

Главная · Сравнение

Как тестировать код, генерирующий идентификаторы

Внедряйте фабрики через конструктор и подменяйте их зависимости:

use CloudCastle\Clock\MockClock;
use CloudCastle\Uuid\Contract\RandomSourceInterface;
use CloudCastle\Uuid\UuidFactory;

// детерминированная случайность для теста
final class FixedRandom implements RandomSourceInterface
{
    public function bytes(int $length): string
    {
        return str_repeat("\xAB", $length);
    }
}

$factory = new UuidFactory(
    clock: MockClock::from('2026-01-01 00:00:00', 'UTC'),
    random: new FixedRandom(),
);

$factory->uuid7()->toString();   // одна и та же строка в каждом прогоне

Проверка кода, принимающего идентификаторы, — без моков:

Uuid::isValid($ввод);            // bool, не бросает
Uuid::fromString($ввод);         // InvalidIdentifierException при мусоре

Качество самого пакета

Актуальные пороги (значения подставляются из конфигов автоматически):

Сгенерировано из конфигов проекта — правьте infection.json.dist / phpmd.xml / tools/coverage-check.php / composer.json, не таблицу.

Порог Значение
Mutation MSI (minMsi) ≥ 98%
Mutation Covered MSI (minCoveredMsi) ≥ 98%
Mutation timeout 120 с
Покрытие строк — проект ≥ 98%
Покрытие строк — каждый файл ≥ 98%
Класс: цикломатическая сложность ≤ 50
Класс: полей ≤ 15
Класс: методов ≤ 25
Класс: public-методов ≤ 20
PHP (runtime) ≥ 8.1
PHP (CI-матрица) 8.1–8.5

Пять тестовых сьютов:

Сьют Что проверяет
unit Каждый класс: happy-path и все пути отказа, вектора RFC 9562
integration Детерминизм с MockClock, взаимная совместимость с 5 аналогами
security Злые входы, log-injection, битовые инварианты, несмещённость NanoID
load Уникальность и монотонность на объёме, стабильность памяти
performance Бюджеты горячих путей с многократным запасом

Запуск:

composer test              # все сьюты
composer test:coverage     # с покрытием и порогом на каждый файл
composer infection         # мутационное тестирование
composer ci                # полный конвейер (как в CI)

Clone this wiki locally