Skip to content
...

Повторный запуск

Плагин предоставляет атрибут #[Retry]#[Retry(int $maxAttempts = 3, bool $markFlaky = true)]Объявляет политику повторного запуска теста при падении. и интерцептор, которые перезапускают упавший тест указанное количество раз. Если тест проходит при повторной попытке, он помечается как нестабильный (flaky). Атрибут можно повесить на метод, функцию или целый класс — в последнем случае политика применяется ко всем тестам в классе.

Плагин не требует настройки.

#[Retry]

Объявляет политику повторного запуска теста при падении.

#[Retry(int $maxAttempts = 3, bool $markFlaky = true)]

Можно использовать на любом типе тестов: обычных, встроенных, бенчмарках. При размещении на классе (Test Case) применяется ко всем тестам внутри.

Параметры:

$maxAttempts
Максимальное количество попыток, включая первый запуск. Например, 3 означает не более двух повторных попыток после первого падения.
$markFlaky
Помечать ли тест как нестабильный (flaky), если он прошёл только при повторной попытке. По умолчанию true.

Примеры:

Перезапустить тест до 3 раз:

php
#[Retry]
public function flakyExternalService(): void
{
    $response = HttpClient::get('https://api.example.com/health');
    Assert::same(200, $response->statusCode);
}

На классе — все тесты внутри получат политику повторного запуска:

php
#[Retry(maxAttempts: 5, markFlaky: false)]
final class ExternalApiTest
{
    public function checkHealth(): void { /* ... */ }

    public function checkStatus(): void { /* ... */ }
}

Политика повторов на уровне Test Suite

Атрибут задаёт политику для конкретного теста или класса. Если нужно применить повторный запуск ко всему Test Suite, используйте интерцептор RetryPolicyRunInterceptor\Testo\Retry\Interceptor\RetryPolicyRunInterceptor напрямую — добавьте его в пайплайн через плагин:

php
return new ApplicationConfig(
    suites: [
        new SuiteConfig(
            name: 'Integration',
            location: ['tests/Integration'],
            plugins: [
                // ...
                new class implements PluginConfigurator {
                    #[\Override]
                    public function configure(Container $container): void
                    {
                        $container->get(InterceptorProvider::class)->addInterceptor(
                            $container->make(RetryPolicyRunInterceptor::class, [new Retry(maxAttempts: 3)]),
                        );
                    }
                },
            ],
        ),
    ],
);

В этом случае все тесты в Test Suite - Integration будут перезапускаться до 3 раз при падении, без необходимости расставлять атрибуты на каждом тесте.

Что будет, если задать политику повторов на нескольких уровнях?

При множественном определении политики повторов применяется только ближайшая к тесту. Например, если на Test Suite задано maxAttempts: 3, на классе — 2, а на методе — 5, тест будет повторяться до 5 раз. Политики не накапливаются.