Skip to content
...

PHP-фреймворк для тестирования со вкусом хинкали

Или пельменей. Хлебобулочные тесты, сочный контроль над тестовой средой.

Testo Logo
Beta-тестирование открыто!
Beta-тестирование открыто!

Начните тестировать с Testo уже сегодня и помогите сделать его лучше к релизу!

Продуманный API ассертов

Функции проверок разбиты на семантические группы:

  • Фасад Assert\Testo\Assert — утверждения, выполняются сразу
  • Фасад Expect\Testo\Expect — ожидания, откладываются до завершения теста

Пайповый синтаксис с группировкой по типу делает код лаконичным и типобезопасным.

php
use Testo\Assert;

// Пайповые ассерты — группировка по типу
Assert::string($email)->contains('@');
Assert::int($age)->greaterThan(18);
Assert::file('config.php')->exists();

Assert::array($order->items)
    ->allOf(Item::class)
    ->hasCount(3);

Разные способы объявления тестов

Пишите тесты так, как удобно вам.

  • Тестами могут быть классы, функции или даже атрибуты прямо в продуктовом коде (Inline Tests).
  • Классы не нужно наследовать от базового тестового класса. Код остаётся чистым.
  • Обнаружение тестов по соглашениям об именовании или по явным атрибутам.
php
// Явное объявление теста в методе с атрибутом #[Test]

final class OrderTest
{
    #[Test]
    public function createsOrderWithItems(): void
    {
        $order = new Order();
        $order->addItem(new Product('Bread'));

        Assert::int($order->itemCount())->equals(1);
    }
}

Полноценная интеграция с IDE

Нативный плагин для PhpStorm и IntelliJ IDEA.

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

Get Plugin 4.1 280

Бенчмарки одним атрибутом

Добавьте атрибут #[Bench]#[Bench(array $callables, array $arguments = [], int $warmup = 1, int $calls = 1_000, int $iterations = 10)]Объявляет бенчмарк для сравнения производительности метода с альтернативными реализациями. к методу, и Testo покажет, какая из реализаций работает быстрее. Со статистикой, фильтрацией выбросов и рекомендациями по стабильности.

php
// Эталонный метод с атрибутом #[Bench]
#[Bench(
    callables: ['sumInCycle' => [self::class, 'sumInCycle']],
    arguments: [1, 5_000],
)]
public static function sumInArray(int $a, int $b): int
{
    return \array_sum(\range($a, $b));
}
php
// Альтернативная реализация
public static function sumInCycle(int $a, int $b): int
{
    $result = 0;
    for ($i = $a; $i <= $b; ++$i) {
        $result += $i;
    }
    return $result;
}