
Мы все уже привыкли к PHPUnit, в котором используется понятный ООПшный подход (классы и методы) для описания тестов. Есть даже атрибуты. Местами выглядит просроченным, но в целом, вроде, всё прекрасно.
Однако, возникают ситуации, когда нам нужно что-то расширять и кастомизировать.
Например, в Spiral Testing мы должны предоставить тулинг для тестирования всего. И в Spiral есть такие штуки, как Container Scope. А ещё мы хотим поддерживать удобные атрибуты прямо на методах тестов. В Temporal PHP SDK мне нужно запускать приёмочные тесты очень по-разному:
Автовайринг аргументов в методы тестов.
Если аргумент — WorkflowStub:
#[Worker(pipelineProvider: [WorkerServices::class, 'interceptors'])]
class DynamicUpdateTest extends TestCase
{
#[Test]
public function addUpdateMethodWithoutValidation(
#[Client(timeout: 15.0)]
#[Stub('Extra_Update_DynamicUpdate', args: ['foo', 'bar'])]
WorkflowStubInterface $stub,
): void {
// ...
}
}
Кастомные атрибуты на классе и методе для настройки воркера и всего остального.
Раньше мы переопределяли метод TestCase::runTest(), который хоть и был помечен аннотацией @internal, но он многие годы существует и семантически не меняется.
Т.е. в целом это было окей:
protected function runTest() {
// ...
parent::runTest();
// ...
}
Прекрасная точка для расширения.
Однако в версии 11, 12 и в 10.5.46 этот метод стал private. Там даже Тейлор отметился, мол, дед, выпей таблетки, напиши предупреждение и не подсерай людям.

Но всё тщетно: Себастиан просто забивает на закрытые ишуи.
”Это не та точка расширения, которую я собираюсь предоставлять”, говорит Дед Себастиан. Я понял, что у деда свой план, и забил на это: просто зафиксировал PHPUnit на версии 10.5.45 в ожидании той точки расширения, которую он предоставит.
С тех пор прошло почти 3 года, и вот я захотел окончательно выкинуть из головы этот вопрос, ибо PHPUnit вроде как обновляется, а мы вынуждены сидеть на старом.
Идеально, если бы phpunit сразу поддерживал interceptors (перехватчики), либо это было в виде отельного пакета. Но раз этого нет, надо что-то делать.