我有一个JS项目,提供了一组利用Express与典型的Express / Router模式的端点。
const express = require('express');
const router = new express.Router();
router.post('/', async (req, res, next) => { });
router.get('/:abc', async (req, res, next) => { });
module.exports = router;
我可以使用npm start
成功启动服务器,该服务器调用node ./src/index.js
并使端点在https://localhost:8080
可用
我还可以使用Postman之类的工具或Karate之类的自动化工具成功测试这些端点。
我遇到的问题是,当通过http://localhost:8080行使产品源JS时,我似乎无法使用Istanbul收集代码覆盖率。
我尝试过npm start
,然后尝试nyc --all src/**/*.js gradlew test
。后者是测试端点的自动化。这导致0%的覆盖率,我认为这是由于未使用npm start运行nyc。
接下来,我尝试了nyc --all src/**/*.js npm start
,并注意到了一些覆盖范围,但这仅仅是启动Express服务器以来的覆盖范围。
接下来,我尝试了nyc --all src/**/*.js npm start
,然后尝试了gradlew test
,并注意到代码覆盖范围的结果与未运行端点测试时的结果相同。
[接下来,我尝试将前面的两个命令放入一个异步运行的JS脚本(myscript.js)中,其中在gradle测试开始运行并运行nyc --all src/**/*.js myscript.js
之前启动了Express服务器。该结果与我以前的试验相同,其中只有npm start收到代码覆盖。
接下来,我尝试了nyc --all src/**/*.js npm start
,然后尝试了nyc --all src/**/*.js -no-clean gradlew test
,并注意到代码覆盖范围的结果与未运行端点测试时的结果相同。
接下来,我通过将它们包装到package.json脚本中并运行npm run <scriptName>
得到相同的确切行为,尝试了上述所有尝试。
最后,我尝试了nyc instrument src instrumented/src --compact=false
,然后尝试了npm run start:coverage
,其中,此start:coverage脚本在node ./instrumented/src/index.js
处调用了插桩的index.js,然后在gradlew test
处调用了nyc report --reporter=lcov
。此尝试也未能从gradlew端点测试中产生任何其他代码覆盖。
在网上做一些研究时,我发现了这篇文章How do I setup code coverage on my Express based API?
并且以为这看起来与我的问题极为相似。例如,伊斯坦布尔通过执行端点执行代码时不知道如何覆盖代码。
我决定还是发布此帖子,因为以上发布已经相当老了,我想征求意见,看看是否有比此更好的解决方案https://github.com/gotwarlost/istanbul-middleware
编辑
[添加更多有关我们如何在今天没有伊斯坦布尔的情况下启动Express服务器和运行自动化的详细信息。只是为了阐明我们正在使用的工具以及我们投资的自动化工具。(主要是空手道和Java)
/*
calls --> node -r dotenv/config src/index.js
*/
npm start
/*
calls --> gradlew clean test
this effectively calls a tool called Karate
Karate's base url is pointed to: https://locahost:8080
Karate tests execute endpoints on that base url
This would be akin to using Postman however Karate has quite a bit of configuration options
https://github.com/intuit/karate
*/
npm test
通过许多小时的调查,我们设法解决了这个问题。 @balexandre发布的先前项目已更新,以说明如何执行此操作。
如评论所述,您永远不会启动服务器来运行测试...当您require
服务器文件时,测试将指向您的服务器。
在我的示例中,我正在将mocha
与mocha
一起运行,并且chai
程序包有助于调用服务器
chai
chai-http
在端到端测试中,您可以轻松拥有:
chai-http
我做了一个非常简单的项目,并推送到GitHub,所以您可以签出并运行所有内容,以查看所有内容如何协同工作
server.js
已添加
我添加了一条路线,以便可以显示覆盖率报告(我使用了const app = require("express")();
// everything else ...
exports.server = app;
)并为其创建了一条静态路线...
当您运行coverage const chai = require('chai');
const chaiHttp = require('chai-http');
chai.use(chaiHttp);
const server = require("./server.js").server;
...
it("should calculate the circumference", done => {
chai
.request(server) // <-- attach your server here
.get('/v1/circumference/10')
.end((err, res) => {
expect(res.status).to.be.eql(200);
expect(res.type).to.be.eql('application/json');
expect(res.body.result).to.eql(62.83185307179586);
done();
});
});
});
时,它将在GitHub Project文件夹中生成报告,并且指向该文件夹的简单明了路由将使您可以将其视为端点。
html
for the change