使用 Istanbul 对 Node 微服务进行集成测试

Using Istanbul for integration tests against a Node microservice

关于使用 istanbul 进行集成测试的文档非常少。当我 运行 通过我的 mocha 测试时,我得到 No coverage information was collected, exit without writing coverage information.

我做的第一件事是检测我所有的源代码:

✗ istanbul instrument . -o .instrument

在我的例子中,这是一个 Dockerized 的 REST 微服务,我已经针对它编写了 Mocha 测试 运行 以在部署后对其进行验证。我的期望是 istanbul 将针对该 Node 服务的源代码覆盖我。

第二步,我对我的检测代码上的 运行 节点执行此命令:

✗ istanbul cover --report none .instrument/server.js

在那之后,我 运行 我的测试使用我的主 src 目录中的以下内容(结果):

✗ istanbul cover --report none --dir coverage/unit node_modules/.bin/_mocha -- -R spec ./.instrument/test/** --recursive


  swagger-tests
    #createPet
      ✓ should add a new pet (15226ms)
    #getPets
      ✓ should exist and return an Array (2378ms)
      ✓ should have at least 1 pet in list (2500ms)
      ✓ should return error if search not name or id
      ✓ should be sorted by ID (3041ms)
      ✓ should be sorted by ID even if no parameter (2715ms)
      ✓ should be only available pets (2647ms)
    #getPetsSortedByName
      ✓ should be sorted by name (85822ms)
    #deletePet
      ✓ should delete a pet (159ms)


  9 passing (2m)

No coverage information was collected, exit without writing coverage information

当我运行istanbul report的时候,明明没什么可报的

我错过了什么?

请参阅此 project 的开发分支以重现问题。

这看起来像你在关注博客 post 我在试图弄清楚如何攻击这次问题时正在看:

我不知道您在上面 post 编辑的内容与该博客 post 指出的具体内容有何不同。要检查的一件事是确保在执行代码时生成了 coverage*.json 文件。我不确定这些文件何时由 Istanbul 专门生成,因此您可能需要终止检测代码 运行ning。 README 中的 cover 命令还提到了一个 --handle-sigint 选项,暗示需要调用手动 SIGINT 中断来获取有关长 运行ning 进程的覆盖信息。

看看 one of the bugs,过去显然有一些痛苦,一些版本的伊斯坦布尔在 NodeJS 代码中的 "use strict" 模式有问题。

所以我的建议是运行所有测试,然后确保所有进程都终止,然后运行宁report命令,并检查是否覆盖*.json 文件写在某处。除此之外,将此作为一个问题纳入 github 回购协议可能是有意义的,那里似乎有很好的 activity 和答案。

伊斯坦布尔的老板帮我解决了这个问题。我能够通过执行以下步骤让事情顺利进行:

  1. 跳过检测代码;不需要
  2. 按照@heckj 的建议用 --handle-sigint 调用伊斯坦布尔并删除标志 --report none
  3. 一旦您的服务器启动,只需 运行 正常测试:./node_modules/.bin/_mocha -R spec ./test/** --recursive
  4. 从步骤 2 关闭服务器以输出覆盖率
  5. 查看 open coverage/lcov-report/index.html
  6. 中的 HTML 文件