我目前正在使用我的AngularJS应用程序和Grunt中的E2E测试和Protractor。 我按照https://www.npmjs.org/package/grunt-protractor-runner进行了安装,我有两个问题:
第一:
我想知道,如果有可能的话,我可以通过Karma的单元测试获得这种行为:
我非常喜欢使用实时监视和自动重新加载,因为它可以缩短整个套件的启动时间,并使一切变得更快。
但是使用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'
]);
// ...
}
谢谢!
答案 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。