使用 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

  });
};

目前为止,采取了这种解决方法后,错误已经不再出现。

广告
将在 10 秒后关闭
bannerAds