Автоматически повторно запускайте набор тестов с помощью Protractor.

Поскольку на этой неделе у меня было немного свободного времени, чтобы попытаться довести наш набор тестов до нуля, я начал думать о том, как мы могли бы побудить себя писать тесты на более ранних этапах процесса. Одна из наших проблем заключалась в том, что тесты добавлялись (если они вообще были) только после разработки и контроля качества функций и ошибок. Это очень заманчиво, потому что разработка с горячей перезагрузкой настолько намного быстрее и проще в отладке, чем запуск набора тестов при каждом изменении файла. Но мы должны знать и делать лучше. Я подумал, что должен попытаться найти способ совместить скорость разработки горячей перезагрузки с практикой написания тестов до и во время разработки фактической функции. (Примечание: пока я использую Webpack, использование этой концепции с другими упаковщиками должно быть довольно тривиальным).

Повторный запуск вашего набора тестов при изменении файла не так уж и сложен — просмотрите свои тестовые файлы, подключитесь к событию изменения из вашего сборщика и повторно запустите транспортир. Единственная проблема заключается в том, что он относительно медленный: транспортиру необходимо перезапустить и закрыть браузер между тестами, выполнить некоторые действия по начальной загрузке, войти в систему и т. д. Это не такая большая проблема, когда вы запускаете весь набор тестов, но если вы просто хотите повторно запустить один тест, это быстро становится неприятностью (и от него легко отказаться). Если мы хотим, чтобы это было быстро, мы хотим избежать следующих шагов: браузер должен оставаться открытым, пользователь должен оставаться в системе и так далее.

Получение строительных блоков

Пара вещей, которые нам нужны здесь от Protractor: ConfigParser для анализа файла конфигурации транспортира, Runner для настройки среды тестирования и адаптер Jasmine, который запускает тесты для нас. . Нам также нужен наблюдатель, в этом случае мы просто используем библиотеку наблюдения Webpack watchpack. (Я также включил плагины, которые представляют собой API плагинов Protractor, но я не уверен, что он нам действительно нужен.)

Создание тест-раннера

Нам нужен тест-раннер, который а) открывает браузер, б) запускает заданные тесты в любое время, в) держит браузер открытым. Есть три ошибки:

  • Jasmine использует require() для включения спецификаций (через describe()). Из-за кеша require это означает, что после включения теста его нельзя включить снова. Чтобы смягчить эту проблему, мы удаляем включенные спецификации из кеша require.
  • jasminewd2 — это небольшая библиотека, которая изменяет методы jasmine для более плавной работы с потоком управления веб-драйвера (думаю, обещания). Однако этого не происходит, когда тест запускается во второй раз и тесты завершаются неудачно, потому что jasmine больше не ждет, пока обещание будет разрешено. Мы снова должны удалить jasminewd2 из кэша, чтобы методы jasmine могли работать с промисами.
  • После завершения тестов процесс закрывается. Чтобы сохранить процесс открытым и гарантировать, что браузер не закроется, мы говорим браузеру подождать, пока не начнется следующий тест.

Запуск тестов при изменении файлов

Наконец, мы должны повторно запустить набор тестов при изменении тестового файла или при обновлении пакета. Когда тестовый файл изменяется, мы сохраняем путь и запускаем тесты. При изменении пакета мы запускаем последний измененный тест. И вот оно: сверхбыстрая и сверхлегкая перезагрузка, которая, мы надеемся, облегчит нам написание наших тестов сначала.