AngulrJS + Grunt +量角器:keepAlive和watch

23t*_*tux 8 javascript angularjs gruntjs protractor

我目前正在使用我的AngularJS应用程序和Grunt中的E2E测试和Protractor.我按照https://www.npmjs.org/package/grunt-protractor-runner的安装,我有2个问题:

第一:

我想知道,如果有可能的话,我可以通过Karma的单元测试获得这种行为:

  • 启动测试服务器
  • 运行所有测试
  • 当测试文件或任何其他html/js文件发生更改时,请重新运行所有测试

我非常喜欢实时监视和自动重新加载,因为它减少了整个套件的启动时间,并使一切变得更快.

但是使用Protractor,我遇到了一个问题:每次我用Grunt开始测试时,测试都会执行,然后一切都会关闭.虽然,我将keepAlive选项设置为我true的量角器配置部分Gruntfile.js.有任何想法吗?

第二:

我无法让它工作,将Protractor连接到我的角度应用程序.我是否必须启动grunt服务器来提供文件?当我尝试在我的测试中访问某个页面时,browser.get('app/index.html');或者browser.get('#/');,我无法访问该页面.我玩过我的baseUrl选项(比如baseUrl: 'http://localhost:' + (process.env.HTTP_PORT || '8000'))protractor.conf.js.但对我而言,我必须先启动grunt服务器,我是对的吗?我怎么能这样做?或者还有其他选项可以访问我的角度应用程序?我正在使用带指南针的萨斯,所以我想,我需要compass:dist以某种方式获得这些目标.

更新:

我找到了一个解决方法.我注册了以下grunt任务:

  grunt.registerTask('e2e', [
    'clean:server',
    'concurrent:test',
    'autoprefixer',
    'connect:test',
    'concurrent:server',
    'autoprefixer',
    'protractor',
    'watch'
  ]);
Run Code Online (Sandbox Code Playgroud)

grunt e2e我的服务器启动时,基于baseUrl: 'http://10.0.0.200:9001'我的内部protractor.conf.js,我的测试正在运行.测试完成后,watch任务会监视已更改的文件,并在需要时重新运行量角器.

这样做的缺点是,每次watch启动protractor任务时,都会生成一个新的Chrome实例,并在测试结束后终止.有没有办法防止量角器杀死Chrome实例?

此外,我想知道为什么在每个教程中它总是说"只是运行grunt protractor,你的测试被执行......".为什么我需要一个额外的任务来启动我的grunt服务器来访问我的angularjs应用程序?

这是我的配置文件:

protractor.conf.js

exports.config = {
  capabilities: {
    'browserName': 'chrome'
  },
  chromeOnly: true,
  specs: ['test/e2e/**/*.js'],

  jasmineNodeOpts: {
    showColors: true
  },
  framework: 'jasmine'
};
Run Code Online (Sandbox Code Playgroud)

Gruntfile.js

module.exports = function(grunt) {

  // Load grunt tasks automatically
  require('load-grunt-tasks')(grunt);
  grunt.loadNpmTasks('grunt-protractor-runner');

  grunt.initConfig({
    // ...
    protractor: {
      options: {
        configFile: "protractor.conf.js",
        keepAlive: false,
        noColor: false
      },
      run: {}
    },
    // ...
  });

  // ...

  grunt.registerTask('test:e2e', [
    'clean:server',
    'compass:dist',
    'compass:server',
    'autoprefixer',
    'connect:test',
    'protractor'
  ]);

  // ...
}
Run Code Online (Sandbox Code Playgroud)

谢谢!

Alw*_*ing 4

我想知道是否有可能从我的 Karma 单元测试中获得这种行为:

通常,您不会在每次 HTML 更改后运行 E2E 测试。其主要原因是,随着添加越来越多的测试,运行 E2E 测试可能需要很长时间。因此,为了回答这个问题,我不相信有任何内置方法可以支持在同一浏览器中每次更改后运行 E2E 测试。我建议使用单元测试作为每次更改后进行测试的机制,并手动运行 E2E 测试。

我是否必须启动 grunt 服务器来提供文件?

是的,您需要启动服务器来运行量角器测试。你并不是在启动一个“grunt 服务器”,你实际上是在启动一个 Selenium 将使用的 Web 服务器,它是 Protractor 用于测试的引擎。这是使用 Protractor 和 ng-scenario 之间的主要区别因素之一(除其他外)。

有没有办法防止 Protractor 杀死 Chrome 实例?

再说一遍,我不相信 Protractor 应该这样使用,因为您不需要在每次更改后运行 E2E 测试。但要回答这个问题,我不这么认为。

为什么我需要额外的任务来启动 grunt 服务器来访问我的 angularjs 应用程序?

与上面关于硒的答案相同。