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,它要么超时,要么只是坐在那里什么都不做。我已经尝试根据阅读有类似问题的人的解决方案来更改 captureTimeout
和 browserNoActivityTimeout
,但它似乎不起作用。
我的相关包装版本等:
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 单元测试
afterAll ReferenceError 中抛出错误:未定义模块,nodejs 中的 Karma/Jasmine 测试错误
如何在 Angular 7 中使用 Karma/Jasmine 为 App_Initializer 编写单元测试用例
Karma + Jasmine + Durandal + KnockoutJS + RequireJS 单元测试中不匹配的匿名 define() 模块