CodeSOD: Жди дольше Заметка
The Daily WTF на русском

CodeSOD: Жди дольше

Карен столкнулась с нестабильностью в своих спецификационных тестах, которые давали сбой несколько раз на тысячу запусков. Эти сложные, чувствительные ко времени тесты иногда завершались неудачей, несмотря на щедрые временные окна и успешно пройденные модульные тесты. Проблема заключалась в функции setTimeout в JavaScript, которая, вопреки своей документации, предполагающей, что она может ждать дольше, на самом деле может вызывать колбэки до истечения указанного времени в Node.js. Простая функция ожидания Карен изначально использовала setTimeout для внесения задержек. После обширной отладки она обнаружила, что эта временная несогласованность является основной причиной ее нестабильных тестов. Чтобы решить эту проблему, она переписала функцию ожидания, чтобы она непрерывно проверяла прошедшее время каждую миллисекунду. Эта новая функция гарантирует, что операция завершится только после достижения целевой продолжительности, предотвращая преждевременные тайм-ауты. Хотя это решение эффективно, оно считается неэффективным и подчеркивает проблемную временную чувствительность функциональных тестов. Оно также указывает на недостаток гарантий планирования в среде выполнения Node.js. Автор выражает сожаление по поводу необходимости такого обходного пути.