【问题标题】:Mocha ending test run before completing all testsMocha 在完成所有测试之前结束测试运行
【发布时间】:2016-08-07 19:25:41
【问题描述】:

我目前正在使用 Jenkins 进行 CI 流程,该流程针对 nodejs 服务器后端触发 mocha 测试。

由于某种原因,xunit 测试记者没有与 jenkins 合作。 test-resul.xml 出来是空的,工作一直失败。我们能够通过运行使其工作:

npm install mocha-jenkins-reporter

就在如下所示的测试触发器之前:

JUNIT_REPORT_PATH=test_report.xml JUNIT_REPORT_STACK=1 NODE_ENV=test node ./node_modules/.bin/mocha --globals * --reporter mocha-jenkins-reporter --no-colors

现在我得到了部分结果,因为某些原因并非所有测试都在运行。他们在没有任何通知或错误消息的情况下停在测试套件的中间。我还注意到生成的 xml 缺少关闭 tag 的根元素。我通过运行解决了这个问题:

echo '</testsuites>' >> test-result.xml

除此之外,我还注意到在测试执行期间内存消耗达到峰值。 这是 npm install 的输出,这一步是这个工作的第一步:

+ npm -v
3.8.6
+ npm install
npm WARN deprecated sequelize@3.14.2: security/injection issue with limit/offset fixed in 3.17.0
npm WARN deprecated lodash@0.9.2: Grunt needs your help! See https://github.com/gruntjs/grunt/issues/1403.
npm WARN deprecated graceful-fs@1.2.3: graceful-fs version 3 and before will fail on newer node releases. Please update to graceful-fs@^4.0.0 as soon as possible.
npm WARN deprecated jade@0.26.3: Jade has been renamed to pug, please install the latest version of pug instead of jade
npm WARN deprecated graceful-fs@2.0.3: graceful-fs version 3 and before will fail on newer node releases. Please update to graceful-fs@^4.0.0 as soon as possible.

> ws@0.6.5 install /home/jenkins/workspace/Rufus_Test_DEV/node_modules/ws
> (node-gyp rebuild 2> builderror.log) || (exit 0)


> actionhero@10.0.3 postinstall /home/jenkins/workspace/Rufus_Test_DEV
> echo 'To generate a new actionhero project, run "node ./node_modules/.bin/actionhero generate"'

To generate a new actionhero project, run "node ./node_modules/.bin/actionhero generate"
actionhero@10.0.3 /home/jenkins/workspace/Rufus_Test_DEV
+-- async@0.9.2 
+-- aws-sdk@2.3.3 
| +-- jmespath@0.15.0 
| +-- sax@1.1.5 
| +-- xml2js@0.4.15 
| `-- xmlbuilder@2.6.2 
|   `-- lodash@3.5.0 
+-- bcrypt-nodejs@0.0.3 
+-- blanket@1.2.3 
| +-- acorn@1.2.2 
| +-- falafel@1.2.0 
| +-- foreach@2.0.5 
| +-- isarray@0.0.1 
| +-- object-keys@1.0.9 
| `-- xtend@4.0.1 
+-- braintree@1.37.1 
| +-- dateformat@1.0.1-1.2.3 
| +-- depd@1.1.0 
| +-- readable-stream@1.1.10 
| | +-- core-util-is@1.0.2 
| | +-- debuglog@0.0.2 
| | `-- string_decoder@0.10.31 
| +-- semver@5.1.0 
| +-- source-map-support@0.2.9 
| | `-- source-map@0.1.32 
| +-- underscore@1.3.1 
| `-- xml2js@0.1.13 
+-- browser_fingerprint@0.0.6 
+-- circular-json@0.1.6 
| `-- wru@0.2.7 
+-- coveralls@2.11.9 
| +-- js-yaml@3.0.1 
| | +-- argparse@0.1.16 
| | | +-- underscore@1.7.0 
| | | `-- underscore.string@2.4.0 
| | `-- esprima@1.0.4 
| +-- lcov-parse@0.0.6 
| +-- log-driver@1.2.4 
| +-- minimist@1.2.0 
| `-- request@2.67.0 
|   +-- bl@1.0.3 
|   | `-- readable-stream@2.0.6 
|   |   `-- isarray@1.0.0 
|   `-- qs@5.2.0 
+-- easy-table@0.3.0 
+-- emailjs@1.0.4 
| +-- addressparser@0.3.2 
| +-- bufferjs@1.1.0 
| +-- mimelib@0.2.14 
| | +-- addressparser@0.2.1 
| | `-- encoding@0.1.12 
| |   `-- iconv-lite@0.4.13 
| +-- moment@2.11.2 
| `-- starttls@1.0.1 
+-- fakeredis@0.3.4 
| `-- redis@2.1.0 
+-- formidable@1.0.17 
+-- geolib@2.0.20 
+-- grunt@0.4.5 
| +-- async@0.1.22 
| +-- coffee-script@1.3.3 
| +-- colors@0.6.2 
| +-- dateformat@1.0.2-1.2.3 
| +-- eventemitter2@0.4.14 
| +-- exit@0.1.2 
| +-- findup-sync@0.1.3 
| | +-- glob@3.2.11 
| | | `-- minimatch@0.3.0 
| | `-- lodash@2.4.2 
| +-- getobject@0.1.0 
| +-- glob@3.1.21 
| | +-- graceful-fs@1.2.3 
| | `-- inherits@1.0.2 
| +-- grunt-legacy-log@0.1.3 
| | +-- grunt-legacy-log-utils@0.1.1 
| | | +-- lodash@2.4.2 
| | | `-- underscore.string@2.3.3 
| | +-- lodash@2.4.2 
| | `-- underscore.string@2.3.3 
| +-- grunt-legacy-util@0.2.0 
| | +-- async@0.1.22 
| | `-- lodash@0.9.2 
| +-- hooker@0.2.3 
| +-- iconv-lite@0.2.11 
| +-- js-yaml@2.0.5 
| +-- lodash@0.9.2 
| +-- minimatch@0.2.14 
| | +-- lru-cache@2.7.3 
| | `-- sigmund@1.0.1 
| +-- nopt@1.0.10 
| | `-- abbrev@1.0.7 
| +-- rimraf@2.2.8 
| +-- underscore.string@2.2.1 
| `-- which@1.0.9 
+-- jsonwebtoken@5.4.1 
| +-- jws@3.1.3 
| | +-- base64url@1.0.6 
| | | +-- concat-stream@1.4.10 
| | | `-- meow@2.0.0 
| | |   +-- camelcase-keys@1.0.0 
| | |   | `-- map-obj@1.0.1 
| | |   +-- indent-string@1.2.2 
| | |   | +-- get-stdin@4.0.1 
| | |   | `-- repeating@1.1.3 
| | |   |   `-- is-finite@1.0.1 
| | |   |     `-- number-is-nan@1.0.0 
| | |   `-- object-assign@1.0.0 
| | `-- jwa@1.1.3 
| |   +-- buffer-equal-constant-time@1.0.1 
| |   `-- ecdsa-sig-formatter@1.0.5 
| |     `-- base64-url@1.2.2 
| `-- ms@0.7.1 
+-- le_node@1.2.0 
| +-- babel-runtime@5.4.7 
| | `-- core-js@0.9.16 
| +-- codependency@0.1.3 
| | `-- semver@2.2.1 
| +-- json-stringify-safe@5.0.1 
| +-- lodash@3.9.3 
| `-- semver@5.1.0 
+-- lodash@4.11.1 
+-- machina@1.1.2 
| `-- lodash@3.10.1 
+-- mime@1.2.11 
+-- mocha@2.4.5 
| +-- commander@2.3.0 
| +-- debug@2.2.0 
| +-- diff@1.4.0 
| +-- escape-string-regexp@1.0.2 
| +-- glob@3.2.3 
| | +-- graceful-fs@2.0.3 
| | `-- inherits@2.0.1 
| +-- growl@1.8.1 
| +-- jade@0.26.3 
| | +-- commander@0.6.1 
| | `-- mkdirp@0.3.0 
| +-- mkdirp@0.5.1 
| | `-- minimist@0.0.8 
| `-- supports-color@1.2.0 
+-- mocha-lcov-reporter@0.0.1 
+-- moment@2.10.6 
+-- moment-timezone@0.4.1 
+-- mysql@2.10.2 
| +-- bignumber.js@2.1.4 
| `-- readable-stream@1.1.14 
+-- node-gcm@0.12.1 
| `-- debug@0.8.1 
+-- node-resque@0.11.6 
+-- node-schedule@0.2.9 
| +-- cron-parser@0.6.2 
| `-- long-timeout@0.0.2 
+-- node-uuid@1.4.7 
+-- optimist@0.6.1 
| +-- minimist@0.0.10 
| `-- wordwrap@0.0.3 
+-- paypal-ipn@3.0.0 
+-- primus@2.4.12 
| +-- access-control@0.0.8 
| | +-- millisecond@0.1.2 
| | `-- vary@1.0.1 
| +-- create-server@0.0.7 
| | `-- connected@0.0.2 
| +-- diagnostics@0.0.4 
| | +-- color@0.7.3 
| | | +-- color-convert@0.5.3 
| | | `-- color-string@0.2.4 
| | |   `-- color-name@1.0.1 
| | +-- colornames@0.0.2 
| | +-- env-variable@0.0.3 
| | +-- kuler@0.0.0 
| | `-- text-hex@0.0.0 
| +-- eventemitter3@0.1.6 
| +-- forwarded-for@0.1.1 
| +-- fusing@0.4.0 
| | +-- emits@1.0.2 
| | `-- predefine@0.1.2 
| |   `-- extendible@0.1.1 
| +-- load@1.0.2 
| +-- setheader@0.0.4 
| | `-- debug@0.7.4 
| `-- ultron@1.0.2 
+-- qrcode-js@0.0.2 
+-- querystring@0.2.0 
+-- redis@0.12.1 
+-- redis-sentinel-client@0.2.5 
| `-- redis@0.10.3 
+-- request@2.71.0  invalid
| +-- aws-sign2@0.6.0 
| +-- aws4@1.3.2 
| | `-- lru-cache@4.0.1 
| |   +-- pseudomap@1.0.2 
| |   `-- yallist@2.0.0 
| +-- bl@1.1.2 
| | `-- readable-stream@2.0.6 
| |   +-- isarray@1.0.0 
| |   +-- process-nextick-args@1.0.6 
| |   `-- util-deprecate@1.0.2 
| +-- caseless@0.11.0 
| +-- combined-stream@1.0.5 
| | `-- delayed-stream@1.0.0 
| +-- extend@3.0.0 
| +-- forever-agent@0.6.1 
| +-- form-data@1.0.0-rc4 
| | `-- async@1.5.2 
| +-- har-validator@2.0.6 
| | +-- chalk@1.1.3 
| | | +-- ansi-styles@2.2.1 
| | | +-- escape-string-regexp@1.0.5 
| | | +-- has-ansi@2.0.0 
| | | | `-- ansi-regex@2.0.0 
| | | +-- strip-ansi@3.0.1 
| | | `-- supports-color@2.0.0 
| | +-- commander@2.9.0 
| | | `-- graceful-readlink@1.0.1 
| | +-- is-my-json-valid@2.13.1 
| | | +-- generate-function@2.0.0 
| | | +-- generate-object-property@1.2.0 
| | | | `-- is-property@1.0.2 
| | | `-- jsonpointer@2.0.0 
| | `-- pinkie-promise@2.0.1 
| |   `-- pinkie@2.0.4 
| +-- hawk@3.1.3 
| | +-- boom@2.10.1 
| | +-- cryptiles@2.0.5 
| | +-- hoek@2.16.3 
| | `-- sntp@1.0.9 
| +-- http-signature@1.1.1 
| | +-- assert-plus@0.2.0 
| | +-- jsprim@1.2.2 
| | | +-- extsprintf@1.0.2 
| | | +-- json-schema@0.2.2 
| | | `-- verror@1.3.6 
| | `-- sshpk@1.7.4 
| |   +-- asn1@0.2.3 
| |   +-- dashdash@1.13.0 
| |   | `-- assert-plus@1.0.0 
| |   +-- ecc-jsbn@0.1.1 
| |   +-- jodid25519@1.0.2 
| |   +-- jsbn@0.1.0 
| |   `-- tweetnacl@0.14.3 
| +-- is-typedarray@1.0.0 
| +-- isstream@0.1.2 
| +-- json-stringify-safe@5.0.1 
| +-- mime-types@2.1.10 
| | `-- mime-db@1.22.0 
| +-- oauth-sign@0.8.1 
| +-- qs@6.1.0 
| +-- stringstream@0.0.5 
| +-- tough-cookie@2.2.2 
| `-- tunnel-agent@0.4.2 
+-- sequelize@3.14.2 
| +-- bluebird@3.3.5 
| +-- dottie@1.1.1 
| +-- generic-pool@2.2.1 
| +-- inflection@1.9.0 
| +-- lodash@3.10.1 
| +-- shimmer@1.1.0 
| +-- toposort-class@1.0.1 
| +-- validator@4.9.0 
| +-- wellknown@0.4.1 
| | +-- concat-stream@1.5.1 
| | | +-- readable-stream@2.0.6 
| | | | `-- isarray@1.0.0 
| | | `-- typedarray@0.0.6 
| | `-- minimist@1.1.3 
| `-- wkx@0.1.0 
+-- should@4.6.5 
| +-- should-equal@0.3.1 
| +-- should-format@0.0.7 
| `-- should-type@0.0.4 
+-- uglify-js@2.4.24 
| +-- async@0.2.10 
| +-- source-map@0.1.34 
| | `-- amdefine@1.0.0 
| +-- uglify-to-browserify@1.0.2 
| `-- yargs@3.5.4 
|   +-- camelcase@1.2.1 
|   +-- decamelize@1.2.0 
|   +-- window-size@0.1.0 
|   `-- wordwrap@0.0.2 
+-- winston@0.8.3 
| +-- async@0.2.10 
| +-- cycle@1.0.3 
| +-- eyes@0.1.8 
| +-- pkginfo@0.3.1 
| `-- stack-trace@0.0.9 
+-- winston-loggly@1.3.1 
| `-- loggly@1.1.0 
|   +-- request@2.67.0 
|   | +-- bl@1.0.3 
|   | | `-- readable-stream@2.0.6 
|   | |   `-- isarray@1.0.0 
|   | `-- qs@5.2.0 
|   `-- timespan@2.3.0 
`-- ws@0.6.5 
  +-- nan@1.4.3 
  `-- options@0.0.6 

npm WARN actionhero@10.0.3 No license field.

【问题讨论】:

    标签: javascript node.js jenkins mocha.js xunit


    【解决方案1】:

    内存峰值似乎是确凿的证据 - 您超出了资源配额并被杀死,或者只是崩溃了。所创建的部分文件似乎证实了这一点 - 以字面意思在这样的片段中间结束的文件是崩溃或强制终止的强烈指标。

    我自己使用 ActionHero,它占用的内存很少。 Sequelize 是它的主要用途,即便如此,我在生产 API 节点上使用超过 180MB 的 RAM 的情况也很少见。您并没有具体说明您的“内存峰值”有多大,但我会先调查一下您的进程正在使用多少以及如何分配。有很多可用的工具,但我建议使用 StrongLoop、PM2、NewRelic 或 Ruxit 之类的工具,因为它可以帮助您快速找到它。所有这些工具都有免费或试用选项。

    除此之外,您还可以通过单独运行测试来进行一些调查。当您调用mocha 时,您可以传入一个测试套件来执行

    最后,如果您使用 Bash 作为 shell,请尝试删除 --globals * 作为测试。 Bash 可能会在执行 Mocha 之前对其进行扩展,将其替换为当前工作目录中的文件列表。如果事实证明这会导致任何问题,您可以将其放在引号中或创建一个mocha.opts 文件。这是我的,只是作为一个例子:

    --recursive
    --reporter spec
    --timeout 15000
    --ignore-leaks
    --slow 3000
    --globals api,assert
    --require test/bootstrap
    test
    

    请注意,命令行参数可以覆盖 opts 文件设置。这就是为什么我在这里有--reporter spec - 这减少了我在本地开发环境中手动运行mocha 的打字(我可以只运行mocha 而根本没有任何参数)。您仍然可以将报告器设置为 CI 堆栈中所需的报告器。

    【讨论】:

    • 确实,这看起来确实像一个资源分配问题。感谢您提供有关分析工具的提示,我现在要去测试它们,并返回我发现的内容,如果这是根本原因,请接受您的回答。感谢您的出色而快速的回答。
    • 嘿,Chad,另一件事,我在 Docker 容器上运行它,你知道每次构建运行 npm install 是否可以吗?这是推荐的设置还是我应该将这些依赖项提交到初始 docker 映像。
    • 如果您在 Docker 容器中,您的管理层可能会遇到硬内存限制。大多数 Docker 管理器,如 Kube、Mesos、ECS、Rancher 等都有这些。尝试增加它。是的,每次构建都运行它是可以的,但通常你想运行npm update。这将安装任何丢失的软件包并处理任何所需的更新。 npm install 只进行安装。
    猜你喜欢
    • 1970-01-01
    • 2023-04-11
    • 2020-03-14
    • 2021-01-23
    • 2020-03-04
    • 2019-09-28
    • 1970-01-01
    • 2019-11-03
    • 2020-06-22
    相关资源
    最近更新 更多