Frame 121.jpg

Мы все уже привыкли к PHPUnit, в котором используется понятный ООПшный подход (классы и методы) для описания тестов. Есть даже атрибуты. Местами выглядит просроченным, но в целом, вроде, всё прекрасно.

Однако, возникают ситуации, когда нам нужно что-то расширять и кастомизировать.

Например, в Spiral Testing мы должны предоставить тулинг для тестирования всего. И в Spiral есть такие штуки, как Container Scope. А ещё мы хотим поддерживать удобные атрибуты прямо на методах тестов. В Temporal PHP SDK мне нужно запускать приёмочные тесты очень по-разному:

Как расширять PHPUnit?

Раньше мы переопределяли метод TestCase::runTest(), который хоть и был помечен аннотацией @internal, но он многие годы существует и семантически не меняется. Т.е. в целом это было окей:

protected function runTest() {
   // ...
   parent::runTest();
   // ...
}

Прекрасная точка для расширения.

Однако в версии 11, 12 и в 10.5.46 этот метод стал private. Там даже Тейлор отметился, мол, дед, выпей таблетки, напиши предупреждение и не подсерай людям.

image.png

Но всё тщетно: Себастиан просто забивает на закрытые ишуи.

”Это не та точка расширения, которую я собираюсь предоставлять”, говорит Дед Себастиан. Я понял, что у деда свой план, и забил на это: просто зафиксировал PHPUnit на версии 10.5.45 в ожидании той точки расширения, которую он предоставит.

Доколе можно?

С тех пор прошло почти 3 года, и вот я захотел окончательно выкинуть из головы этот вопрос, ибо PHPUnit вроде как обновляется, а мы вынуждены сидеть на старом.

Идеально, если бы phpunit сразу поддерживал interceptors (перехватчики), либо это было в виде отельного пакета. Но раз этого нет, надо что-то делать.