AngularJS + Grunt +量角器:保持活力并观察

时间:2014-04-09 12:55:24

标签: javascript angularjs gruntjs protractor

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

第一:

我想知道,如果有可能的话,我可以通过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服务器,我是对的吗?我怎么能这样做?或者还有其他选项可以访问我的角度应用程序?我正在使用带指南针的sass,所以我想,我需要以某种方式获得compass:dist tak。

更新

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

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

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'
};

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'
  ]);

  // ...
}

谢谢!

6 个答案:

答案 0 :(得分:4)

  

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

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

  

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

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

  

有没有办法阻止量角器杀死Chrome实例?

再一次,我不相信Protractor本来是这样使用的,因为你不需要在每次更改后运行你的E2E测试。不过要回答这个问题,我不相信。

  

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

与Selenium相同的答案。

答案 1 :(得分:2)

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

作为一种关注点,Protractor不管理Web服务器的启动和拆卸来运行测试,这是与Karma不同的方法。我想这是因为测试是在服务器端运行的,其中Web浏览器被驱动"从您的测试代码执行操作。

有没有办法阻止量角器杀死Chrome实例?

简短回答NO。
答案很长,您可以使用debug选项并在代码中设置断点,但这可能不是您想要的。您尝试的keepAlive选项仅在测试失败时保持浏览器活动,一旦测试结束,它就不会保持浏览器启动。

您可能会感兴趣question

答案 2 :(得分:1)

除了我认为正确的@Always Learning回答。

您要做的是持续集成,这是一种做法,每当有人在项目上进行更改和提交时,都会执行整个质量检查(静态代码分析,单元测试,编译/依赖,E2E测试等)

这不应该在开发人员的环境中执行,应该使用持续集成工具执行,例如Jenkins我建议您查看它,因为它是一个非常有用的工具,它可以运行您需要的所有任务,在出现问题或修复以前的错误时向您发送消息,甚至可以让他在完成后在生产环境中部署最终的Build

答案 3 :(得分:1)

当我试图做同样的事情时遇到了这个问题... gulp很新(不确定我是否正在做所有事情)但这对我有用:

我使用gulp-angular-protractor代替gulp-protractor进行webdriver自动启动/停止任务。

下面的示例只是观看'specs'文件夹,但可以轻松更改。如果你没有使用它,请删除'browsersync',然后事先在你想要的端口上启动你的本地主机服务器。

var config = require('./config');
var gulp = require('gulp');
var browserSync = require('browser-sync');
var watch = require('gulp-watch');
var angularProtractor = require('gulp-angular-protractor');

gulp.task('e2e', [
    'browserSync',
    'protractor',
    'watch-e2e'
]);

gulp.task('watch-e2e', function () {
    gulp.watch('e2e-tests/**/*.js', ['protractor']);
});

// Setting up the test task
gulp.task('protractor', function(callback) {
    gulp
        .src(['e2e-tests/**/*.js'])
        .pipe(angularProtractor({
            configFile: './karma-e2e.conf.js',
            args: ['--baseUrl', 'http://127.0.0.1:3002'],
            debug: false,
            autoStartStopServer: true
        }))
        .on('error', function(e) {
            console.log(e);
            this.emit('end'); // Prevents task stopping on error
        })
        .on('end', function() {
            // Close browser sync server
            browserSync.exit();
            callback();
        });
});

答案 4 :(得分:0)

有没有办法阻止量角器杀死Chrome实例?

我相信您可以使用以下方式暂停浏览器:

browser.pause();

答案 5 :(得分:0)

回答旧问题....我喜欢Ruby FileWatcher Gem

<factory name>.then(successFunction, errorFunction); function SuccessFunction(data){ console.log(data) } function errorFunction(data){ console.log(data) }

它适用于各种问题。每当我点击保存时,我都会用它在我的训练文档上重新运行AsciiDoctor。

相关问题