Мы на работе пишем много часто меняющейся бизнес-логики на JS (стартап же). Даже слишком много. И всё это хочется по старой привычке тестировать, но как-нибудь побыстрее, чтобы тесты особо не мешали говнокодить, когда это нужно, и не подгонять под тесты особенно сильно структуру модулей. В какой-то момент пришла мысль, что можно это еще и автоматизировать как-то с помощью простенького babel-плагина, чтобы он для начала все приватные переменные и методы выворачивал в тестовой среде, а в продакшене не трогал. Это оказалось довольно просто и увлекательно. Так появился Introscope, которым мы теперь тестируем всё более-менее сложное.
Сдав проект, я отвлёкся на несколько месяцев на улучшение деплоя и мониторинга, отдохнул, Хабр почитал, а когда понадобилось снова что-то потестировать, то прямо пришел в восторг от собственной тулзы! Это со мной не часто бывает. Точнее, никогда еще не было. Так что, думаю, что штука работает. Надеюсь, вам тоже пригодится.
Коротко, что оно умеет?
- Оборачивает весь модуль в factory function, чтобы можно было создавать столько новых модулей во время тестирования, сколько надо. Это избавляет от необходимости делать unmock.
- Так как модуль обернут, тулза точно знает, какие переменные модуль импортирует и может по их типу генерировать моки. Очень хорошо это работает для более-менее функционального стиля.
- Умеет логгировать обращения и аргументы к функциям из внешних модулей и складывать это всё в лог, который затем красиво сериализуется для снепшотов (если вы используете Jest, то всё прямо сразу заведётся).
- Киллер фича: умеет сохранять результат вызова внешней функции и при дальнейшем тестировании использовать его. Очень удобно при тестировании запросов к внешним сервисам, которые мы раньше руками вбивали в моки.
- В комбинации с Jest тесты обновляются нажадием одной (я не шучу) кнопки U, которая обновляет снепшоты. Golden test подход во всей красе.
- Работает в продакшене почти год.
В результате
Тесты начали писать люди, которые раньше про них даже слышать не хотели, ведь надо только вызвать функцию с нужными параметрами и сохранить лог того, что в этой функции происходило одной кнопкой. Вот прям захотелось что-ньть еще потестировать…
Ссылочка: Introscope (там есть еще гифки-скринкастики!). Буду очень рад конструктивной критике и ссылкам на то же самое, но сделанное гораздо лучше :D