Javascript AngulrJS+;咕噜+;量角器:保持并观察

Javascript AngulrJS+;咕噜+;量角器:保持并观察,javascript,angularjs,gruntjs,protractor,Javascript,Angularjs,Gruntjs,Protractor,我目前正在玩E2E测试,我的AngularJS应用程序和Grunt中有一个量角器。 我从开始安装,有两个问题: 第一: 我想知道,如果可能的话,在我的单元测试中有这样的行为: 启动测试服务器 运行所有测试 当测试文件或任何其他html/js文件发生更改时,请重新运行所有测试 我非常喜欢实时观看和自动重新加载的方式,因为它缩短了整个套件的启动时间,并且使一切都变得更快 但使用量角器时,我遇到了一个问题:每次我用Grunt启动测试时,测试都会执行,然后一切都会关闭。尽管如此,我还是在grunfi

我目前正在玩E2E测试,我的AngularJS应用程序和Grunt中有一个量角器。 我从开始安装,有两个问题:

第一:

我想知道,如果可能的话,在我的单元测试中有这样的行为:

  • 启动测试服务器
  • 运行所有测试
  • 当测试文件或任何其他html/js文件发生更改时,请重新运行所有测试
我非常喜欢实时观看和自动重新加载的方式,因为它缩短了整个套件的启动时间,并且使一切都变得更快

但使用量角器时,我遇到了一个问题:每次我用Grunt启动测试时,测试都会执行,然后一切都会关闭。尽管如此,我还是在
grunfile.js
的量角器配置部分将
keepAlive
选项设置为
true
。有什么想法吗

第二:

我无法让它工作,无法将量角器连接到我的角度应用程序。我必须启动grunt服务器才能提供文件吗?当我尝试访问测试中的页面时,比如
browser.get('app/index.html')
浏览器.get('#/'),我无法访问该页。我已经使用了
baseUrl
选项(比如
baseUrl:'http://localhost:“+(process.env.HTTP|u PORT | | |“8000”)
)从my
dragrator.conf.js
。但在我看来,我必须先启动grunt服务器,对吗?我该怎么做?或者是否有其他选项可用于访问我的angular应用程序?我将sass与compass一起使用,因此我认为,我需要某种方式的
compass:dist
taks

更新:

我找到了一个解决办法。我注册了以下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“
在我的
dragrator.conf.js
中,我的测试正在运行。测试完成后,
监视
任务监视更改的文件,并在需要时重新运行量角器

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

此外,我想知道为什么在每一个教程中,它总是说“只要运行
咕噜量角器
,您的测试就可以执行…”为什么启动grunt服务器以访问angularjs应用程序需要额外的任务?

以下是我的配置文件:

dragrator.conf.js

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

  jasmineNodeOpts: {
    showColors: true
  },
  framework: 'jasmine'
};
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'
  ]);

  // ...
}
grunfile.js

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

  jasmineNodeOpts: {
    showColors: true
  },
  framework: 'jasmine'
};
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'
  ]);

  // ...
}
谢谢

我想知道,如果可能的话,在我的单元测试中有这样的行为:

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

我必须启动grunt服务器才能提供文件吗

是的,您需要启动一台服务器来对其运行量角器测试。您不是在启动“grunt服务器”,而是在启动Selenium将使用的web服务器,它是引擎量角器用于测试的服务器。这是使用量角器和ng场景之间的主要区别因素之一

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

再一次,我不相信量角器是这样使用的,因为在每次更改之后,您不需要运行E2E测试。但要回答这个问题,我不这么认为

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


关于Selenium,答案与上面相同。

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

由于关注点分离量角器不管理运行测试的web服务器的启动和拆卸,因此这是一种不同于Karma的方法。我认为这是因为测试是在服务器端运行的,在服务器端,web浏览器被“驱动”来执行测试代码中的操作


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

简短答案编号
答案很长,您可以使用
debug
选项在代码中设置断点,但这可能不是您想要的。您尝试的选项仅在测试失败时使浏览器保持活动状态,而在测试结束后不会使浏览器保持活动状态


这可能会引起您的兴趣。

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

我相信您可以通过以下方式暂停浏览器:

browser.pause();
除了我认为正确的答案之外

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


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

在我尝试做完全相同的事情时遇到了这个问题……对gulp来说非常陌生(不确定我是否在做所有事情)