Перейти до вмісту

Скоротила набір тестів від шести тестів, що перевищували ліміт у шістдесят секунд, до 135 успішних за 8,9 секунди, профілюючи головний потік і прибравши два виклики, у яких він перебував 3 989 із 4 017 вибірок.

8.9 секунд для набору, що раніше тривав шістдесят

Ситуація. Набір тестів мав ліміт у шістдесят секунд, і шість тестів його перевищували. Набір, який виконується довше хвилини, перестають запускати перед кожною зміною, а набір, який не запускають перед кожною зміною, — це вже звіт про минуле. Перше бажання в такій ситуації — підняти ліміт, але саме так набір і розростається до десяти хвилин.

Завдання. Час треба було знайти, а не закласти в бюджет, тобто профілювати набір, а не розмірковувати, які тести здаються ресурсоємними.

Дія. Профіль головного потоку знімали під час виконання набору, і результат спростував здогад. У 3 989 відліках із 4 017 головний потік перебував усередині двох викликів — тож повільними були не ті тести, які виконували найбільше роботи, а майже кожен тест проходив через ті самі два місця. Перше — фіксоване очікування, щоб асинхронна робота встигла завершитися до перевірки результату, — по суті, пауза (sleep), за яку платив кожен тест, що зачіпав шлях подій, незалежно від того, чи робота вже завершилася. Його замінили очікуванням самої умови з тайм‑аутом, тож тест, готовий за п’ять мілісекунд, триває п’ять мілісекунд, і повний час очікування витрачає лише той тест, який справді завис. Друге — підготовка перед кожним тестом, яка щоразу заново будувала дорогу фікстуру, хоча фікстура була доступна лише для читання й могла будуватися один раз для всього набору. Жодне з цих місць не було в тесті, який хтось назвав би повільним; обидва були на спільному шляху, і саме тому повільним був увесь набір рівномірно, а не кілька тестів, що вибивалися б із загальної картини.

Результат. Було шість тестів, що перевищували шістдесят секунд, — 74 секунди реального часу, — а стало 135 тестів, які проходять за 8,9 секунди, і цього досить, щоб набір запускався під час кожного збереження. Застереження в тому, що спільна фікстура лише для читання тепер стала точкою зв’язності: тест, який її змінить, спричинить збій в іншому тесті, а швидкість набору залежить від дисципліни, дотримання якої компілятор не забезпечує.

Одна частина довшого переліку — і він увесь на цьому сайті.

Кожен запис написано однаково: ситуація, завдання, що ми зробили і що змінилося.

Переглянути весь перелік