Как я могу автоматизировать тесты E2E и unit с помощью Yeoman & AngularJS?
Я использую Yeoman и generator-angular для управления приложениями AngularJS, но у меня возникают проблемы с автоматическим тестированием.
Запуск grunt test
будет запускать единичные тесты один раз. Я могу получить тесты E2E для запуска после модульных тестов, изменив конфигурационный блок кармы в 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, не имеющего достаточно времени для реализации этого материала? Я спрашиваю, потому что я просто вхожу в Angular/Yeoman/Karma (как вы, вероятно, заметили), и чувствуете, что автоматическое тестирование как E2E, так и модульных тестов имеет решающее значение для рабочего процесса.
Ответы
Ответ 1
Как я упоминал в комментарии к вашему вопросу - PhantomJS экономит много хлопот. В стороне, я считаю, вы можете обрабатывать все изнутри вашего Gruntfile и просто продолжать запускать grunt test
, чтобы начать все это.
grunt-karma позволяет полностью настраивать параметры вашей кармы с помощью некоторых удобных надстроек.
Из документов:
....
Вы можете переопределить любые настройки файла конфигурации напрямую:
karma: {
unit: {
configFile: 'karma.conf.js',
runnerPort: 9999,
singleRun: true,
browsers: ['PhantomJS']
}
}
Общие настройки
Если у вас несколько целей, может быть полезно поделиться общими настройки конфигурации между ними. Grunt-карма поддерживает это используя свойство options:
karma: {
options: {
configFile: 'karma.conf.js',
runnerPort: 9999,
browsers: ['Chrome', 'Firefox']
},
continuous: {
singleRun: true
browsers: ['PhantomJS']
},
dev: {
reporters: 'dots'
}
}
Кроме того, вам может понадобиться отслеживать файл Yeoman generator- angular Gruntfile, чтобы узнать, что еще может быть доступно или хотя бы макет.
Ответ 2
Вы можете попробовать это для запуска только тестов e2e
grunt karma:e2e
Ответ 3
В файле karma.conf.js(приблизительно строка: 38) найдите autoWatch = false; и измените его на true.
Теперь, если вы запустите grunt karma: unit, вы обнаружите, что он покидает тестовый сервер, и любые изменения в файлах проекта сразу же запускают тесты снова.
Ответ 4
//
// test/midway/appSpec.js
//
describe("Midway: Testing Modules", function() {
describe("App Module:", function() {
var module;
before(function() {
module = angular.module("App");
});
it("should be registered", function() {
expect(module).not.to.equal(null);
});
describe("Dependencies:", function() {
var deps;
var hasModule = function(m) {
return deps.indexOf(m) >= 0;
};
before(function() {
deps = module.value('appName').requires;
});
//you can also test the module dependencies
it("should have App.Controllers as a dependency", function() {
expect(hasModule('App.Controllers')).to.equal(true);
});
it("should have App.Directives as a dependency", function() {
expect(hasModule('App.Directives')).to.equal(true);
});
it("should have App.Filters as a dependency", function() {
expect(hasModule('App.Filters')).to.equal(true);
});
it("should have App.Routes as a dependency", function() {
expect(hasModule('App.Routes')).to.equal(true);
});
it("should have App.Services as a dependency", function() {
expect(hasModule('App.Services')).to.equal(true);
});
});
});
});