Как я могу автоматизировать как E2E, так и модульные тесты с помощью Yeoman и AngularJS?

Я использую Yeoman и generator-angular для управления приложениями AngularJS, но у меня возникают проблемы с автоматическим тестированием.

Запуск grunt test запустит модульные тесты один раз. Я могу запустить тесты E2E после модульных тестов, изменив блок конфигурации karma в Gruntfile.js, добавив e2e:

karma: {
  //...
  e2e: {
    configFile: 'karma-e2e.conf.js',
    singleRun: true
  }
},

Отлично: теперь, когда я набираю grunt test, все тесты запускаются. Но они запускаются только один раз, и есть большие накладные расходы (запуск компаса, запуск сервера, запуск процессов Chrome и т. д.). Вместо этого процессы сервера и Chrome должны оставаться запущенными, и при сохранении теста тесты должны запускаться повторно.

Я могу добиться этого, изменив karma.conf.js и karma-e2e.conf.js и установив singleRun = true, затем запустив karma start в одной панели терминала и karma start karma-e2e.conf.js в другой. Если ни один из портов в конфигурации кармы не конфликтует (что они делают по умолчанию), это работает. Теперь я обхожу Grunt и просто занимаюсь своими делами (что кажется немного глупым, так как Grunt должен упростить задачу).

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

Как я могу запустить одну команду для просмотра моих тестовых файлов и повторного запуска тестов соответствующим образом?

Бонусный вопрос: почему эта функциональность не предоставляется как есть? Это просто вопрос того, что у разработчика (ов) генератора-углового не хватает времени для реализации этого материала? Я спрашиваю, потому что я только начинаю изучать Angular/Yeoman/Karma (как вы, наверное, заметили) и чувствую, что автоматическое тестирование как E2E, так и модульных тестов имеет решающее значение для рабочего процесса.


person Jamie Schembri    schedule 24.05.2013    source источник
comment
Самое чистое решение, которое я пока придумал, — использовать Node Foreman для запуска двух экземпляров карма в том же окне. Этот подход используется Year of Moo . У меня есть ощущение, что лучшее решение может включать что-то вроде этого, но я все еще озадачен тем, почему это не включено в угловой генератор.   -  person Jamie Schembri    schedule 27.05.2013
comment
Оба этих типа тестов тоже предоставляют html-репортер, верно? Предполагая, что это правда, вы можете создать простую веб-страницу с двумя фреймами, содержащими каждый тестовый отчет. Затем пакетная программа может запускать оба типа тестов, запускать браузер и указывать на созданную вами веб-страницу. Эти два типа тестов используют совершенно разные средства запуска тестов (jasmine и angular-scenario), поэтому вполне логично, что karma не может запускать оба одновременно из коробки. Я согласен, однако, что функциональность должна быть обеспечена.   -  person robbymurphy    schedule 31.05.2013
comment
@robbymurphy Это хорошая идея! Я не уверен, как бы я это реализовал, и возможно ли это на самом деле (хотя звучит так, как будто это должно быть). Кроме того, Node Foreman — это достаточно быстрое решение, поэтому я не уверен, что выгода будет стоить дополнительной настройки.   -  person Jamie Schembri    schedule 31.05.2013
comment
Я бы предложил попробовать PhantomJS вместо Chrome, сохраняет открытие окна.   -  person Terry    schedule 04.06.2013


Ответы (4)


Как я уже упоминал в комментарии к вашему вопросу, PhantomJS избавляет от многих хлопот. Кроме того, я считаю, что вы можете справиться со всем из своего Gruntfile и просто продолжать запускать grunt test, чтобы запустить все это.

grunt-karma позволяет полностью настроить параметры вашей кармы с помощью некоторых удобных дополнений.

Из документов:

....

Вы можете напрямую переопределить любые настройки файла конфигурации:

karma: {   
  unit: {
    configFile: 'karma.conf.js',
    runnerPort: 9999,
    singleRun: true,
    browsers: ['PhantomJS']   
  }
}

Совместное использование конфигураций

Если у вас есть несколько целей, может быть полезно поделиться между ними общими настройками конфигурации. Grunt-karma поддерживает это с помощью свойства options:

karma: {
  options: {
    configFile: 'karma.conf.js',
    runnerPort: 9999,
    browsers: ['Chrome', 'Firefox']
  },
  continuous: {
    singleRun: true
    browsers: ['PhantomJS']
  },
  dev: {
    reporters: 'dots'
  }
}

Кроме того, вы можете покопаться в коде генератора-углового файла Grunt от Yeoman. чтобы увидеть, что еще может быть доступно или, по крайней мере, издевательски.

person Terry    schedule 27.06.2013
comment
С тех пор я отошел от Angular, поэтому не могу подтвердить, что это решает проблему. Похоже, что общие конфигурации — это то, что нужно, поэтому я соглашусь с этим. - person Jamie Schembri; 27.06.2013
comment
Как будет выглядеть конфигурация, если у вас есть как e2e, так и модульные тесты, и вы хотите, чтобы они имели разные конфигурации для разработки и сборки? например при использовании как e2e, так и модуля в dev вы хотите использовать Chrome и заставить карму прослушивать изменения файлов без перезапуска браузера, а во время сборки вы хотите использовать PhantomJS и singleRun: true - person Igor Malyk; 14.10.2013

Вы можете попробовать это, чтобы запустить только тесты e2e

grunt karma:e2e
person Artem Kashin    schedule 28.07.2013
comment
это дает мне эту ошибку ИНФОРМАЦИЯ [PhantomJS 1.9.2 (Mac OS X)]: подключен к сокету iFpamoP1eO3ongWLY4Xi PhantomJS 1.9.2 (Mac OS X): выполнено 0 из 0 ОШИБКА (0,356 сек/0 сек) - person climboid; 06.12.2013

В файле karma.conf.js (приблизительно строка: 38) найдите autoWatch = false; и измените его на истинное.

Теперь, если вы запустите grunt karma:unit, вы обнаружите, что он оставляет тестовый сервер работающим, и любые изменения в файлах проекта немедленно запускают тесты снова.

person Dan Quirk    schedule 22.10.2013

person    schedule
comment
Промежуточное тестирование здесь не является проблемой, хотя это означает запуск еще одного набора тестов. - person Jamie Schembri; 07.06.2013