Тестування PHP-застосунків
Pest і PHPUnit, тестові дані, мутаційне тестування, тести на легасі-код і що робити з повільним CI.
НАЙНОВІША
ТЕСТУВАННЯ
30 вересня 2026
Покриття коду: яке число має сенс і чому 100% не ціль
Один прогін дає три різні відсотки: рядки, гілки, шляхи. Розбираємо, що саме рахує php-code-coverage, чому загальне покриття на проєкті з історією нікого не рятує, і як поставити поріг у CI, щоб він ловив недотестований новий код, а не змушував писати тести на геттери.
РP
Редакція phpukraine
·
7 хв читання
9
статей
ТЕСТУВАННЯ
30 вересня 2026
Покриття коду: яке число має сенс і чому 100% не ціль
Один прогін дає три різні відсотки: рядки, гілки, шляхи. Розбираємо, що саме рахує php-code-coverage, чому загальне покриття на проєкті з історією нікого не рятує, і як поставити поріг у CI, щоб він ловив недотестований новий код, а не змушував писати тести на геттери.
РP
Редакція phpukraine
·
7 хв
·Покриття
·PHPUnit
·Pest
ТЕСТУВАННЯ
27 вересня 2026
Тести для легасі без тестів: з чого почати і що фіксувати першим
У проєкті нуль тестів, і завтра треба правити розрахунок цін. Unit-тести тут не працюють як перший крок: щоб ізолювати клас, його спершу треба відрефакторити, а рефакторити без тестів ви й не хотіли. Порядок дій інший: характеризаційні тести на HTTP, golden master для розрахунків, шви для залежностей, і лише потім unit.
РP
Редакція phpukraine
·
8 хв
·Легасі
·Характеризаційні тести
ТЕСТУВАННЯ
13 вересня 2026
Час, випадковість і зовнішні API в тестах: як зробити їх передбачуваними
Тест, який падає раз на тиждень о 00:59 або коли packagist.org відповідає повільно, нічого не перевіряє. Розбираємо три джерела недетермінізму і три способи їх прибрати: порт Clock замість now(), джерело випадковості за інтерфейсом і фейк порту замість Http::fake у кожному тесті.
РP
Редакція phpukraine
·
7 хв
·Тестування
·Clock
·Fakes
ТЕСТУВАННЯ
13 вересня 2026
Мутаційне тестування з Infection: що воно знаходить у зелених тестах
Зелений сьют і 100% покриття кажуть лише те, що рядки виконувались. Infection ламає код навмисно й показує, які зміни ваші тести пропускають. Розбираємо перший запуск, читання вижилих мутантів і те, як не втопити CI.
РP
Редакція phpukraine
·
4 хв
·Infection
·Мутаційне тестування
·Pest
ТЕСТУВАННЯ
13 вересня 2026
Що саме охороняти архітектурними тестами: сім правил, які окупаються
Заборона Illuminate у домені - це перше правило, а не весь набір. Сім конкретних arch-правил на Pest, які ловлять реальні поломки: витік Eloquent у use case, цикл між контекстами, мутабельний value object і unit-тести, що непомітно ходять у базу.
РP
Редакція phpukraine
·
6 хв
·Pest
·Архітектура
·Шари
ТЕСТУВАННЯ
4 вересня 2026
CI на 20 хвилин: що прискорювати першим у PHP-проєкті
Коли пайплайн триває 20 хвилин, розробники перестають чекати на зелений білд і мержать наосліп. Розбираємо, у якому порядку різати цей час у типовому Laravel-проєкті: від безкоштовних налаштувань раннера до паралельного запуску, який має йти останнім, а не першим.
РP
Редакція phpukraine
·
6 хв
·CI
·PHPUnit
·Продуктивність тестів
ТЕСТУВАННЯ
4 вересня 2026
Feature-тести HTTP у Pest: перевіряти сторінку, а не реалізацію
Feature-тест має відповідати на питання «що отримає браузер і краулер», а не «які методи викликав контролер». Розбираємо на реальних тестах phpukraine: canonical, meta robots, JSON-LD і sitemap — що перевіряти в HTTP-тесті, що винести в юніт і як не переписувати тести після кожного рефакторингу вʼю.
РP
Редакція phpukraine
·
7 хв
·Pest
·Feature-тести
·Laravel
ТЕСТУВАННЯ
4 вересня 2026
Фейки замість моків: як тестувати use case без бази
Мок, який знає про кожен виклик репозиторію, ламається від будь-якого рефакторингу і при цьому не перевіряє стан. Показуємо, як in-memory реалізація порту на 20 рядків і FrozenClock замінюють десяток shouldReceive і роблять unit-тести use case швидкими та детермінованими.
РP
Редакція phpukraine
·
7 хв
·Unit-тести
·DDD
·Фейки
ТЕСТУВАННЯ
1 вересня 2026
Архітектурні тести в Pest: як заборонити Illuminate у домені й перестати про це сперечатись
Домовленості про шари живуть у README, доки хтось не імпортує фасад у value object. Показуємо, як phpukraine тримає межі модульного моноліту шістьма тестами, що падають на code review, а не в продакшені.
МЛ
Михайло Левицький
·
4 хв
·Pest
·Архітектура
·DDD