2014-04-09 34 views
7

我目前在E2 AngularJS应用程序和Grunt中测试了量角器。 我跟着从https://www.npmjs.org/package/grunt-protractor-runner安装,和我有2个问题:AngulrJS + Grunt +量角器:keepAlive和手表

第一:

我在想,如果有可能,有来自我的单元测试与噶这种行为:

  • 开始测试服务器
  • 运行所有测试
  • 当测试文件或任何其他HTML/JS文件更改,重新运行所有测试

我非常喜欢这种带有实时观看和自动重新加载的方式,因为它减少了整个套件的启动时间,并使一切都变得更快。

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

二:

我不能让它工作,量角器连接到我的角度应用程序。我是否必须启动grunt服务器才能提供文件?当我尝试访问我的测试页面时,如browser.get('app/index.html');browser.get('#/');,我无法访问该页面。我已经玩了我的protractor.conf.jsbaseUrl选项(如baseUrl: 'http://localhost:' + (process.env.HTTP_PORT || '8000'))。但对我来说,看起来像,我必须在之前启动grunt服务器,对吗?我该怎么做?或者有没有其他选项可以访问我的角度应用程序?我正在用罗盘使用sass,所以我认为,我需要以某种方式获得。

UPDATE:

我找到了一个解决方法。我注册了以下咕噜任务:

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

grunt e2e我的服务器被启动开始,根据我protractor.conf.jsbaseUrl: 'http://10.0.0.200:9001',和我的测试运行。测试完成后,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' 
    ]); 

    // ... 
} 

的感谢!

+0

为什么downvote?请解释一下 – 23tux

+1

另一个倒退,你能解释我的问题有什么问题来帮助改进它吗? – 23tux

回答

4

我在想,如果有可能,有从我的单元测试的行为有因果报应:

通常情况下,你就不是每个HTML变化后运行端到端测试。这样做的主要原因是,当您添加越来越多的测试时,运行E2E测试可能需要很长时间。因此,为了回答这个问题,我不认为在同一浏览器中进行每次更改后,都不会支持运行E2E测试。我建议使用单元测试作为一种机制,在每次更改之后进行测试并手动运行E2E测试。

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

是的,你需要启动一个服务器来运行你的量角器测试。你没有启动一个“grunt服务器”,你实际上启动了一个Selenium将使用的web服务器,这是Protractor用于测试的引擎。这是使用量角器和ng场景之间的主要区别因素之一。

是否有办法防止量角器从杀死的Chrome实例?

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

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

就硒而言,与上述相同。

+0

我不能说OP,但在Rails中,我实际上喜欢每次单元测试通过时都运行我的端到端测试,我想在Angular中做同样的事情。毕竟,每次都有可能中断测试,而HTML更改肯定会打破JS应用程序。当然,单元测试是第一道防线,但它们并不是唯一的。如果不方便运行它们,测试有什么意义?对我来说,令人惊讶的是,Angular团队似乎积极地*端到端测试* –

+0

Marnen,原则上我同意你的观点,但是当你在一个拥有多个开发团队的环境中工作时每天检查一次,在每次检查中运行全套E2E测试可能有些不切实际。妥协方案是拥有一台专门的服务器,该服务器整天运行E2E测试,并始终在每个周期提供最新的代码库。如果您正在一个环境中工作,但每天的签入量非常低,那么在每次签到时对您进行E2E测试可能是切实可行的。 –

+0

我正在谈论在本地运行端到端测试*,我每隔几分钟就会开发一次。开发人员的数量没有区别,因为每个开发人员都在他或她自己的计算机上运行测试。当然,CI服务器对于确保所有测试能够在构建或合并上运行都很有用,但这不是我所说的。 –

2

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

作为一个问题的分离,量角器不管理Web服务器的旋转和拆卸以运行测试,这是与Karma不同的方法。我可以想象这是由于测试在服务器端运行的事实,在服务器端,Web浏览器被“驱动”从您的测试代码执行操作。

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

简答题NO。
长的答案,你可以使用debug选项,并在你的代码中设置一个断点,但这可能不是你正在寻找的。您尝试的keepAlive选项仅在测试失败时保持浏览器处于活动状态,但测试结束后,浏览器不会保持运行状态。

这个question可能是你感兴趣的。

0

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

我相信你可以通过使用暂停的浏览器:

browser.pause(); 
1

除了@Always Learning答案我认为这是正确的。

你所要做的是持续集成,这是一种实践中,每当有人对项目工作进行了更改,并承诺,整个质量检查执行(静态代码分析,单元测试,编译/依赖性,E2E测试等)

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

1

当我试图做同样的事情时遇到了这个问题......对于吞吐来说很新颖(不确定是否我做的一切正确),但这对我的作品:

我用gulp-angular-protractor而不是吞咽量角器为webdriver自动启动/停止任务。

下面的示例只是观看“规格”文件夹,但它可以很容易地更改。如果您不使用“浏览器同步”,只需在所需的端口上启动本地主机服务器即可。

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(); 
     }); 
}); 
+0

对不起,刚刚意识到这个问题是为了咕噜,而不是吞咽,但希望它可以帮助别人! – Xuwen

0

回答老问题....我喜欢红宝石FileWatcher宝石

gem install filewatcher filewatcher . "protractor my-protractor-conf-file.conf.js"

它适用于各种各样的问题。我使用它在我的培训文档中重新运行AsciiDoctor,只要我点击保存即可。