Подтвердить что ты не робот

Как я могу автоматизировать тесты 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, так и модульных тестов имеет решающее значение для рабочего процесса.

4b9b3361

Ответ 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);
      });
    });
  });
});