Привет! Я разработчик программного обеспечения в Freshworks, в основном работаю над Ember.js. Пристегнитесь, потому что я собираюсь поговорить о:

  1. Тестирование
  2. Миграция

Мы начали использовать Ember около 3 лет назад. В то время казалось, что Mocha опережает QUnit по функциональным возможностям. Кроме того, он был похож на RSpec, что значительно упростило наш переход. Поэтому мы выбрали Mocha в качестве среды тестирования. Но с тех пор многое изменилось.

  • QUnit не только догнал Mocha, но и вырвался вперед.
  • Наша кодовая база росла в геометрической прогрессии с тысячами тестовых случаев, медленно, но неуклонно вводя нестандартные тесты. В какой-то момент было очень трудно увидеть зеленую сборку, поскольку некоторые тесты почти всегда случайным образом завершались ошибкой.

Прежде чем ситуация вышла из-под контроля, мы придумали решение для стабилизации конвейера тестирования в CI. Введите QUnit.

QUnit - это мощный и простой в использовании фреймворк для модульного тестирования JavaScript. Производительность: QUnit - это не только просто, но и быстро. Отзывчивый и компактный API, но расширяемый.

Почему QUnit?

  • Ember-QUnit - это набор помощников по умолчанию для модульного тестирования для Ember, что означает, что новые функции вводятся в ember-qunit быстрее, чем в ember-mocha.
  • Тесты в QUnit проходят быстрее, чем мокко.
  • ember-exc не только лучше интегрируется с QUnit, но и некоторые дополнительные функции, такие как --load-balance, доступны только с QUnit.
  • Проблемы тестирования, такие как асинхронные утечки и глобальные мутации, лучше решать с помощью QUnit.

Переход с Mocha на QUnit

# ШАГ 1. Настройте стенд

Наша база кода для тестирования огромна. У нас было более 5000 тестов, и разработчики добавляли к этому количеству каждый божий день. Поэтому нам нужно было найти способ беспрепятственно перенести существующие тестовые примеры. Поэтому мы написали надстройку in-repo (скоро откроется!), которая позволит одновременно запускать тесты Mocha и QUnit в нашем CI.

# ШАГ 2. Создайте инструменты

Сообщество Ember имеет довольно неплохую коллекцию codemods, но, к сожалению, не нашлось ни одного, чтобы преобразовать Mocha в QUnit (хотя был доступен обратный вариант).

# 2.1 Прежде чем мы перешли к написанию codemods, мы хотели проанализировать существующие тестовые утверждения, написанные с использованием Chai, и получить список уникальных expect операторов. Итак, мы написали этот JS-инструмент для крошечных узлов:



# 2.2 Получив список уникальных утверждений в Chai, мы начали отображать соответствующие альтернативы в утверждениях QUnit. Однако в QUnit есть очень простой набор утверждений, особенно по сравнению с чем-то вроде chai. Итак, мы написали этот аддон Ember для обработки пользовательских утверждений:



# 2.3 Наконец, мы начали писать собственно преобразование codemod, которое автоматически преобразует все тесты в QUnit - mocha-to-qunit. Во время пилотных запусков мы заметили, что у нас было много асинхронных утечек в наших тестовых наборах, что привело к этой ошибке:

Ошибка утверждения: вы включили режим тестирования, в котором отключен автозапуск цикла выполнения. Вам нужно будет обернуть любой код с асинхронными побочными эффектами в Ember.run.

Поэтому мы написали еще одно преобразование codemod, чтобы исправить это - async-leaks.



# ШАГ 3. Поэтапная миграция

Благодаря параллельной настройке испытательного стенда и инструментарию мы могли переносить код модуль за модулем без каких-либо блокировщиков или зависимостей. Мы написали рецепт «как перейти с Mocha на QUnit» вместе с «руководством по передовым методам написания тестов с использованием QUnit» и поделились им между командами.

Спустя месяц и 5000 тестовых случаев мы готовы предложить больше стабильных тестов и зеленых сборок.