Karma / Jasmine没有运行测试就超时了

时间:2014-06-09 11:38:33

标签: javascript node.js karma-runner karma-jasmine webpack

我正在尝试使用生成的项目从Grunt运行Karma / Jasmine http://newtriks.com/2013/12/31/automating-react-with-yeoman-and-grunt/

Karma推出PhantomJS(或Chrome),并且根据singleRun,它要么超时要么只是坐在那里什么都不做。我尝试根据有类似问题的人阅读解决方案来更改captureTimeoutbrowserNoActivityTimeout,但似乎无效。

我的相关pacakge版本等:

  • NodeJS:0.10.25
  • 业力:0.12.16
  • Webpack:1.1.11
  • webpack-dev-server:1.4.1
  • karma-jasmine:0.1.5
  • Linux:Ubuntu 14.04

我在OS X上找到了someone with the same problem

我已尝试将所有dev依赖项更新到最新版本,但问题仍然存在。

我的控制台输出如下。引用包的webpack行现在是VALID / INVALID 令人担忧,但我找不到任何关于它们含义的信息。这是我的控制台输出:

Running "karma:unit" (karma) task
DEBUG [config]: autoWatch set to false, because of singleRun
DEBUG [plugin]: Loading karma-* from /home/ed/workspace/wwb-app/node_modules
DEBUG [plugin]: Loading plugin /home/ed/workspace/wwb-app/node_modules/karma-chrome-launcher.
DEBUG [plugin]: Loading plugin /home/ed/workspace/wwb-app/node_modules/karma-coffee-preprocessor.
DEBUG [plugin]: Loading plugin /home/ed/workspace/wwb-app/node_modules/karma-firefox-launcher.
DEBUG [plugin]: Loading plugin /home/ed/workspace/wwb-app/node_modules/karma-html2js-preprocessor.
DEBUG [plugin]: Loading plugin /home/ed/workspace/wwb-app/node_modules/karma-jasmine.
DEBUG [plugin]: Loading plugin /home/ed/workspace/wwb-app/node_modules/karma-phantomjs-launcher.
DEBUG [plugin]: Loading plugin /home/ed/workspace/wwb-app/node_modules/karma-requirejs.
DEBUG [plugin]: Loading plugin /home/ed/workspace/wwb-app/node_modules/karma-script-launcher.
DEBG [plugin]: Loading plugin /home/ed/workspace/wwb-app/node_modules/karma-webpack-plugin.
INFO [karma]: Karma v0.12.16 server started at  http://localhost:8080/
INFO [launcher]: Starting browser PhantomJS
DEBUG [temp-dir]: Creating temp dir at /tmp/karma-98204612
DEBUG [launcher]: /home/ed/workspace/wwb-app/node_modules/karma-phantomjs-launcher/node_modules/phantomjs/lib/phantom/bin/phantomjs /tmp/karma-98204612/capture.js
Hash: 89285186567c1bc5bb7f
Version: webpack 1.1.11
Time: 2ms
Asset  Size  Chunks       Chunk Names
webpack: bundle is now VALID.
webpack: bundle is now INVALID.
DEBUG [web-server]: serving: /home/ed/workspace/wwb-app/node_modules/karma/static/client.html
DEBUG [web-server]: serving: /home/ed/workspace/wwb-app/node_modules/karma/static/karma.js
DEBUG [web-server]: upgrade /socket.io/1/websocket/CjC8pnQq5It2z_kWYB98
DEBUG [karma]: A browser has connected on socket CjC8pnQq5It2z_kWYB98
INFO [PhantomJS 1.9.7 (Linux)]: Connected on socket CjC8pnQq5It2z_kWYB98 with id 98204612
DEBUG [launcher]: PhantomJS (id 98204612) captured in 1.704 secs
WARN [PhantomJS 1.9.7 (Linux)]: Disconnected (1 times), because no message in 30000 ms.

DEBUG [karma]: Run complete, exitting.
DEBUG [launcher]: Disconnecting all browsers
DEBUG [launcher]: Process PhantomJS exited with code 0
DEBUG [temp-dir]: Cleaning temp dir /tmp/karma-98204612
Warning: Task "karma:unit" failed. Use --force to continue.

Aborted due to warnings.

这是我的karma.conf.js文件:

'use strict';

module.exports = function (config) {
config.set({
    basePath: '',
    frameworks: ['jasmine'],
    files: [
        'test/helpers/**/*.js',
        'test/spec/components/**/*.js'
    ],
    preprocessors: {
        'test/spec/components/**/*.js': ['webpack']
    },
    webpack: {
        cache: true,
        module: {
            loaders: [{
                test: /\.css$/,
                loader: 'style!css'
            }, {
                test: /\.gif/,
                loader: 'url-loader?limit=10000&minetype=image/gif'
            }, {
                test: /\.jpg/,
                loader: 'url-loader?limit=10000&minetype=image/jpg'
            }, {
                test: /\.png/,
                loader: 'url-loader?limit=10000&minetype=image/png'
            }, {
                test: /\.js$/,
                loader: 'jsx-loader'
            }]
        }
    },
    webpackServer: {
        stats: {
            colors: true
        }
    },
    exclude: [],
    port: 8080,
    logLevel: config.LOG_DEBUG,
    colors: true,
    autoWatch: true,
    // Start these browsers, currently available:
    // - Chrome
    // - ChromeCanary
    // - Firefox
    // - Opera
    // - Safari (only Mac)
    // - PhantomJS
    // - IE (only Windows)
    browsers: ['PhantomJS'],
    reporters: ['progress'],
    captureTimeout: 60000,
    browserNoActivityTimeout: 60000,
    singleRun: true
});
};

11 个答案:

答案 0 :(得分:44)

我遇到了同样的问题。从相关的GitHub Issue,我了解到您可以延长不活动超时。

在gruntfile或karma配置文件中设置此Karma配置选项:

browserNoActivityTimeout: 100000

我将其设置为100秒,我的测试成功运行。我不知道造成延误的原因。

答案 1 :(得分:27)

我已将我的Karma配置更改为

captureTimeout: 60000, // it was already there
browserDisconnectTimeout : 10000,
browserDisconnectTolerance : 1,
browserNoActivityTimeout : 60000,//by default 10000

我还有200-300个测试,PhantomJS 1.9.8 Phantom只需要大约100 MB的内存 随着咕噜声和业力 他们一起使用了大约300mb的内存。

答案 2 :(得分:16)

我们在构建服务器上遇到了类似的问题。

增加browserNoActivityTimeout工作到一定程度。我们把它增加到60000毫秒,但是随着单元测试数量的增加,phantomJS没有断开连接的问题又回来了。

我们最终将问题追溯到phantomJS可用的RAM。我们进行了1100次单元测试,需要大约1m30秒才能运行,但是phantomJS在60000ms超时内无法断开连接。

构建节点VM RAM从2GB增加到4GB,然后1100单元测试需要大约45s才能运行,phantomJS将与~5s断开连接。一个巨大的进步。

有两个教训: 1. PhantomJS是内存饥渴,所以要确保它有足够的RAM来做它的事情 2.分析您的代码,了解在内存使用方面哪些方面更有效率。

答案 3 :(得分:6)

另一个可能的解释是RequireJS妨碍了。如果我将'requirejs'添加到config.frameworks数组中的karma.conf.js,我会收到这个确切的错误。 这似乎覆盖了本机require函数,导致测试无法执行。在我的情况下,describe-block被触发,但是如果它是块,则没有。

答案 4 :(得分:4)

就我而言,我的test.js文件中没有包含以下代码:

requirejs.config({
    callback: window.__karma__.start
});

describe('tests', function() {
    ...

包含此配置后,测试开始运行。希望这能给别人带来很大的压力!

答案 5 :(得分:3)

从karma配置文件中删除'requires',只需使用frameworks:['jasmine']。

答案 6 :(得分:2)

检查localhost是否正确指向127.0.0.1而不是无法访问的IP,这可能发生在使用虚拟机的开发环境中。

答案 7 :(得分:1)

我为自己的环境解决了这个问题。我有一堆全局安装的nodejs包。我没有进行回归以确定究竟是什么包引起了问题,但我强烈怀疑全局安装业力是原因。

如果您遇到此问题,请尝试

sudo npm -g remove karma

如果这不起作用,那么我将删除所有全局节点包(例如,如yeoman,grunt-cli等真正的全局包)。然后在本地为您的项目安装。

我还注意到,当您在OS X上运行sudo npm -i时,它会将 〜/ .npm 的所有者更改为 root 和后续npm -i命令将因 EACCESS 错误而失败。

答案 8 :(得分:1)

这可能不是OP的情况,但如果您测试的代码遇到无限循环,则会导致超时断开,就像这样。

答案 9 :(得分:0)

这就是为什么我遇到此错误,可能会帮助处于类似情况的人。 我的主要组件有多个使用不同服务的子组件,其中一个服务进行了HTTP调用,初始化失败,因为我在子组件的ngInit()方法中使用了该服务。 要解决此问题,我必须在主要组件规格中导入上述服务,并为该服务附加一个模拟程序,之后该程序便开始工作。

答案 10 :(得分:0)

@Vijender的回答使我走上了正轨

这就像将测试中的HttpClientModule替换为HttpClientTestingModule一样简单。

  beforeEach(async(() => {
    TestBed.configureTestingModule({
      imports: [
        HttpClientTestingModule
      ]
    }).compileComponents();
  }));