Мы на работе пишем много часто меняющейся бизнес-логики на JS (стартап же). Даже слишком много. И всё это хочется по старой привычке тестировать, но как-нибудь побыстрее, чтобы тесты особо не мешали говнокодить, когда это нужно, и не подгонять под тесты особенно сильно структуру модулей. В какой-то момент пришла мысль, что можно это еще и автоматизировать как-то с помощью простенького babel-плагина, чтобы он для начала все приватные переменные и методы выворачивал в тестовой среде, а в продакшене не трогал. Это оказалось довольно просто и увлекательно. Так появился Introscope, которым мы теперь тестируем всё более-менее сложное.


Сдав проект, я отвлёкся на несколько месяцев на улучшение деплоя и мониторинга, отдохнул, Хабр почитал, а когда понадобилось снова что-то потестировать, то прямо пришел в восторг от собственной тулзы! Это со мной не часто бывает. Точнее, никогда еще не было. Так что, думаю, что штука работает. Надеюсь, вам тоже пригодится.


Коротко, что оно умеет?


  1. Оборачивает весь модуль в factory function, чтобы можно было создавать столько новых модулей во время тестирования, сколько надо. Это избавляет от необходимости делать unmock.
  2. Так как модуль обернут, тулза точно знает, какие переменные модуль импортирует и может по их типу генерировать моки. Очень хорошо это работает для более-менее функционального стиля.
  3. Умеет логгировать обращения и аргументы к функциям из внешних модулей и складывать это всё в лог, который затем красиво сериализуется для снепшотов (если вы используете Jest, то всё прямо сразу заведётся).
  4. Киллер фича: умеет сохранять результат вызова внешней функции и при дальнейшем тестировании использовать его. Очень удобно при тестировании запросов к внешним сервисам, которые мы раньше руками вбивали в моки.
  5. В комбинации с Jest тесты обновляются нажадием одной (я не шучу) кнопки U, которая обновляет снепшоты. Golden test подход во всей красе.
  6. Работает в продакшене почти год.

В результате


Тесты начали писать люди, которые раньше про них даже слышать не хотели, ведь надо только вызвать функцию с нужными параметрами и сохранить лог того, что в этой функции происходило одной кнопкой. Вот прям захотелось что-ньть еще потестировать…


Ссылочка: Introscope (там есть еще гифки-скринкастики!). Буду очень рад конструктивной критике и ссылкам на то же самое, но сделанное гораздо лучше :D


image

Комментарии (2)


  1. worldxaker
    22.01.2019 17:06

    а с typescript работать будет?


    1. JPEG Автор
      22.01.2019 20:23

      Будет, но только если вы его препроцессите бабелем. Тут всё завязано на плагин для бабеля. Хотя, при желании, некоторые части можно и отдельно использовать. Но это не настолько «вау» как интересно :)