Skip to content
...

Встроенные тесты

Встроенные тесты позволяют писать тесты прямо на тестируемом методе с помощью атрибута #[TestInline]#[TestInline(array $arguments, mixed $result = null)]Объявляет встроенный тест на методе или функции.. При этом отдельная тестовая функция не нужна.

Класс плагина: InlineTestPlugin\Testo\Inline\InlineTestPlugin. Входит в SuitePlugins\Testo\Application\Config\Plugin\SuitePlugins по умолчанию.

Настройка

Рекомендуется создать отдельный Test Suite для inline тестов, настроенный на папку src: встраивать тесты, скорее всего, вы будете в код приложения, а не в tests/.

#[TestInline]

Объявляет встроенный тест на методе или функции.

#[TestInline(array $arguments, mixed $result = null)]

Атрибут можно использовать многократно — каждый атрибут создаёт отдельный тест.

Встроенные тесты хорошо подходят для:

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

Для больших наборов тестов (10+ случаев) или тестов, требующих пояснений, лучше писать отдельные тесты с использованием провайдеров из плагина Data.

Параметры:

$arguments
Массив значений, передаваемых в метод. Поддерживаются именованные аргументы.
$result
Ожидаемое возвращаемое значение. Может принимать Closure(mixed $result)\Closure(mixed $result), тогда вместо сравнения с конкретным значением будет выполняться произвольная проверка внутри замыкания.

Примеры:

Работает с публичными и приватными методами, а также с функциями:

php
#[TestInline([1, 1], 2)]
#[TestInline([40, 2], 42)]
#[TestInline([-5, 5], 0)]
private static function sum(int $a, int $b): int
{
    return $a + $b;
}
php
#[TestInline([1, 1], 2)]
#[TestInline([40, 2], 42)]
#[TestInline([-5, 5], 0)]
function sum(int $a, int $b): int
{
    return $a + $b;
}

Используйте именованные аргументы для лучшей читаемости:

php
#[TestInline(['price' => 100.0, 'discount' => 0.1, 'tax' => 0.2], 108.0)]
#[TestInline(['price' => 50.0, 'discount' => 0.0, 'tax' => 0.1], 55.0)]
private static function calculateFinalPrice(
    float $price,
    float $discount,
    float $tax
): float {
    return $price * (1 - $discount) * (1 + $tax);
}

Сложные проверки

Доступно в PHP 8.5+ (замыкания в атрибутах)

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

php
#[TestInline(
    arguments: ['john.doe@example.com'],
    result: function (User $user) {
        Assert::same('john.doe@example.com', $user->email);
        Assert::true($user->isActive);
        Assert::notNull($user->createdAt);
    }
)]
public function createUser(string $email): User
{
    // ...
}

В PHP 8.6 это станет ещё элегантнее благодаря partial application:

php
#[TestInline([10, 3], Assert::greaterThan(3, ?))]
public function divide(int $a, int $b): float
{
    return $a / $b;
}