使用 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 和答案。
伊斯坦布尔的老板帮我解决了这个问题。我能够通过执行以下步骤让事情顺利进行:
- 跳过检测代码;不需要
- 按照@heckj 的建议用
--handle-sigint
调用伊斯坦布尔并删除标志 --report none
- 一旦您的服务器启动,只需 运行 正常测试:
./node_modules/.bin/_mocha -R spec ./test/** --recursive
- 从步骤 2 关闭服务器以输出覆盖率
- 查看
open coverage/lcov-report/index.html
中的 HTML 文件
关于使用 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 和答案。
伊斯坦布尔的老板帮我解决了这个问题。我能够通过执行以下步骤让事情顺利进行:
- 跳过检测代码;不需要
- 按照@heckj 的建议用
--handle-sigint
调用伊斯坦布尔并删除标志--report none
- 一旦您的服务器启动,只需 运行 正常测试:
./node_modules/.bin/_mocha -R spec ./test/** --recursive
- 从步骤 2 关闭服务器以输出覆盖率
- 查看
open coverage/lcov-report/index.html
中的 HTML 文件