使用 karma、jasmine、PhantomJS 进行的处理频繁发生 DISCONNECTD 问题的解决方案
为了对AngularJS进行测试,我们在Jenkins上使用了一个无界面浏览器PhantomJS来创建测试环境。然而,在运行karma时,经常遇到无法连接到PhantomJS的问题。
尽管在本地的Mac上运行没有问题,但是在CUI环境上运行时出现了问题。
我在那里找到了类似的错误,但没有一个解决方案可行。
由于不断尝试与错误,我最终解决了问题,所以我将其内容写下来。
错误内容 (Error content)
错误的感觉如下。
当然,即使将browserNoActivityTimeout从10000ms延长,结果也是相同的。
$ node_modules/karma/bin/karma start test/karma.conf.js
INFO [karma]: Karma v0.12.25 server started at http://localhost:9876/
INFO [launcher]: Starting browser PhantomJS
INFO [PhantomJS 1.9.8 (Linux)]: Connected on socket EiJL2QiyEcBk_CO-O07G with id 42119278
WARN [PhantomJS 1.9.8 (Linux)]: Disconnected (1 times), because no message in 10000 ms.
有时候成功会带来以下的感觉。
$ node_modules/karma/bin/karma start test/karma.conf.js
INFO [karma]: Karma v0.12.25 server started at http://localhost:9876/
INFO [launcher]: Starting browser PhantomJS
INFO [PhantomJS 1.9.8 (Linux)]: Connected on socket BpBiH9n1-Wqb12M2PB5V with id 20828307
PhantomJS 1.9.8 (Linux): Executed 1 of 1 SUCCESS (0.036 secs / 0.003 secs)
重复错误的方法。
错误的复制方法。
再现错误的方法。
您可以使用Angular教程(https://docs.angularjs.org/tutorial)来实现以下类似的功能。
$ git clone --depth=14 https://github.com/angular/angular-phonecat.git
$ cd angular-phonecat/
$ git checkout -f step-0
我要修改karma.conf.js。
module.exports = function(config){
config.set({
basePath : '../',
files : [
'http://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.js',
'http://cdnjs.cloudflare.com/ajax/libs/velocity/0.7.0/jquery.velocity.js',
'http://cdnjs.cloudflare.com/ajax/libs/jquery-cookie/1.4.1/jquery.cookie.js',
'http://ajax.googleapis.com/ajax/libs/angularjs/1.2.18/angular.js',
'http://ajax.googleapis.com/ajax/libs/angularjs/1.2.18/angular-route.js',
'http://ajax.googleapis.com/ajax/libs/angularjs/1.2.18/angular-mocks.js',
'http://cdnjs.cloudflare.com/ajax/libs/lodash.js/2.4.1/lodash.compat.js',
'app/js/**/*.js',
'test/unit/**/*.js'
],
autoWatch : true,
frameworks: ['jasmine'],
browsers : ['PhantomJS'],
plugins : [
'karma-phantomjs-launcher',
'karma-jasmine'
],
junitReporter : {
outputFile: 'test_out/unit.xml',
suite: 'unit'
},
singleRun : true,
colors : false
});
};
请根据需要适时安装所需的npm等工具。
错误的原因和处理方法 de hé fǎ)
看起来问题是因为在files文件夹中有很多CDN的URL。通常情况下,数量较少是没有问题的,但是数量增多就会出现故障。一旦发生故障,似乎没有重新尝试的机制,无论将超时时间设置多长都会超时。解决办法是使用wget全部下载并保存在本地。
$ mkdir app/lib/
$ cd app/lib/
$ wget 'http://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.js'
$ wget 'http://cdnjs.cloudflare.com/ajax/libs/velocity/0.7.0/jquery.velocity.js'
$ wget 'http://cdnjs.cloudflare.com/ajax/libs/jquery-cookie/1.4.1/jquery.cookie.js'
$ wget 'http://ajax.googleapis.com/ajax/libs/angularjs/1.2.18/angular.js'
$ wget 'http://ajax.googleapis.com/ajax/libs/angularjs/1.2.18/angular-route.js'
$ wget 'http://ajax.googleapis.com/ajax/libs/angularjs/1.2.18/angular-mocks.js'
$ wget 'http://cdnjs.cloudflare.com/ajax/libs/lodash.js/2.4.1/lodash.compat.js'
修改karma.conf.js文件。
module.exports = function(config){
config.set({
basePath : '../',
files : [
'app/lib/jquery.js',
'app/lib/jquery.velocity.js',
'app/lib/jquery.cookie.js',
'app/lib/angular.js',
'app/lib/angular-route.js',
'app/lib/angular-mocks.js',
'app/lib/lodash.compat.js',
'app/js/**/*.js',
'test/unit/**/*.js'
],
autoWatch : true,
frameworks: ['jasmine'],
browsers : ['PhantomJS'],
plugins : [
'karma-phantomjs-launcher',
'karma-jasmine'
],
junitReporter : {
outputFile: 'test_out/unit.xml',
suite: 'unit'
},
singleRun : true,
colors : false
});
};
目前为止,采取了这种解决方法后,错误已经不再出现。