Karma/Jasmine 在没有运行测试的情况下超时

Posted

技术标签:

【中文标题】Karma/Jasmine 在没有运行测试的情况下超时【英文标题】:Karma/Jasmine times out without running tests 【发布时间】:2014-07-29 22:44:48 【问题描述】:

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

Karma 启动 PhantomJS(或 Chrome),并且取决于 singleRun,它要么超时,要么只是坐在那里什么都不做。我已经尝试根据阅读有类似问题的人的解决方案来更改 captureTimeoutbrowserNoActivityTimeout,但它似乎不起作用。

我的相关包装版本等:

NodeJS:0.10.25 业力:0.12.16 Webpack:1.1.11 webpack-dev-server: 1.4.1 业力茉莉花:0.1.5 Linux:Ubuntu 14.04

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

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

我的控制台输出如下。引用 bundle 的 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
);
;

【问题讨论】:

【参考方案1】:

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

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

browserNoActivityTimeout: 100000

我将它设置为 100 秒,我的测试运行成功。我不知道是什么导致了延迟。

【讨论】:

我尝试过玩超时但没有成功。全局安装 karma 时没有任何效果 webpack-dev-middleware,在webpack-karma 的作用下使用,仅在浏览器请求文件时编译资产。因此,浏览器加载了 karma 测试页面后,编译开始,只有在此之后浏览器才会响应 Karma。我的项目的生产编译需要 30~45 秒。 我想了很多次解决了这个问题,但每次我错了,有时它有效,有时它没有。也尝试使用超时,浏览器选项使其尽可能轻量级(chrome headless,无插件,无翻译文件,...)试图将我的机器从所有其他 Chrome 进程中解放出来,也尝试了至少大约6 GB 可用 RAM,尝试过其他 karma 版本……每次都发生,有时,不知何故。【参考方案2】:

我已将 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 的内存。

【讨论】:

我的问题是 Jenkins 和 captureTimeout。浏览器加载时间过长。【参考方案3】:

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

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

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

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

有两个教训: 1. PhantomJS 需要大量内存,因此请确保它有足够的 RAM 来完成它的工作 2. 分析您的代码以了解在哪些方面可以提高内存使用效率。

【讨论】:

看来你可以使用browserNoActivityTimeout: 0,这似乎让它等待更长的时间。业力此时会永远等待还是有限制?这在karma-runner.github.io 上没有很好的记录,谷歌也没有在其他地方提供帮助。 你在哪里以及如何(什么设置)为 phantomJS 增加 RAM? @Nick 他说 - 通过增加分配给他的 VM 的 RAM。 Phantom 本身没有内存限制。【参考方案4】:

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

【讨论】:

【参考方案5】:

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

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

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

一旦包含此配置,测试就会开始运行。希望这可以减轻其他人的压力!

【讨论】:

【参考方案6】:

从业力配置文件中删除“需要”,只需使用框架:['jasmine']。

【讨论】:

如果有人使用了 sinon 和 chai 或其他人怎么办?你的建议会破坏测试。 如果我尝试这个,我会得到“Uncaught referenceError:define is not defined”【参考方案7】:

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

【讨论】:

【参考方案8】:

我为自己的环境解决了这个问题。我在全球范围内安装了一堆 nodejs 包。我没有做回归来弄清楚究竟是什么包导致了问题,但我强烈怀疑全球安装 karma 是原因。

如果你有这个问题,请尝试

sudo npm -g remove karma

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

我还注意到,当您在 OS X 上运行 sudo npm -i 时,它会将 ~/.npm 的所有者更改为 root 并且随后的npm -i 命令将失败并出现EACCESS 错误。

【讨论】:

【参考方案9】:

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

【讨论】:

【参考方案10】:

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

【讨论】:

【参考方案11】:

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

就像用HttpClientTestingModule 替换测试中的HttpClientModule 一样简单。

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

【讨论】:

【参考方案12】:

我通过在我的 Root.tsx 中删除对全局范围内的异步函数的调用来解决此问题。

它在“真实”浏览器窗口中工作,但在测试运行中不起作用。

它似乎使加载模块本身挂起,所以它甚至没有执行异步函数(所以日志语句不会显示)

编辑: 这是由另一个在应用程序启动时运行的异步函数引起的,该函数试图进行身份验证并重定向到另一个 URL。这就是它在浏览器中工作但在无头模式下工作的原因。如果没有任何异步测试功能,身份验证代码就没有机会阻塞系统。通过异步测试,异步身份验证代码开始运行并导致锁定。

故事的寓意:如果异步测试挂起,请检查后台正在执行的其他异步代码。

【讨论】:

以上是关于Karma/Jasmine 在没有运行测试的情况下超时的主要内容,如果未能解决你的问题,请参考以下文章

在我的 JSPM 包上使用 JSPM 404 进行 Karma/Jasmine 单元测试

.Karma+Jasmine+karma-coverage

afterAll ReferenceError 中抛出错误:未定义模块,nodejs 中的 Karma/Jasmine 测试错误

如何在 Angular 7 中使用 Karma/Jasmine 为 App_Initializer 编写单元测试用例

Jasmine 运行测试 3 次

Karma + Jasmine + Durandal + KnockoutJS + RequireJS 单元测试中不匹配的匿名 define() 模块