如何在基于 Express 的 API 上设置代码覆盖率?
Posted
技术标签:
【中文标题】如何在基于 Express 的 API 上设置代码覆盖率?【英文标题】:How do I setup code coverage on my Express based API? 【发布时间】:2014-06-04 08:35:38 【问题描述】:我遇到这个问题已经有一段时间了,我无法让现有的解决方案为我工作。
我有一个用 Express.js 编写的 Node.js API。我一直在使用 Mocha、Chai 和 Supertest 为 API 编写测试。这些测试主要是集成测试。
一个测试可能如下所示:
it('should fail to register a new user without the proper information', function(done)
api.post('/user')
.send()
.expect(400)
.expect('Content-Type', /json/)
.end(function(err, res)
should.exist(res.body);
should.exist(res.body.error);
should.not.exist(err);
res.body.error.should.contain('Username');
res.body.error.should.contain('password');
done();
);
);
实际测试效果很好,但现在我需要能够查看这些测试的代码覆盖率。我必须知道我没有充分测试什么。我尝试过使用 Mocha 的测试覆盖率:
mocha -R html-cov --coverage > coverage.html
和伊斯坦布尔的:
istanbul cover _mocha -- -R spec --timeout 5000
两者都有同样的问题:
你看,这是一个示例路由(用户注册)。我的测试肯定覆盖了它,但由于它们不直接调用此方法,因此覆盖工具假定它从未被调用过。这就是问题所在 - 代码覆盖工具没有捕获最终执行的代码。
我尝试了另一种解决方案 - Istanbul Middleware,它实际上似乎更好地捕获了信息(虽然它很老套)。然而,这里的相同路线看起来像:
这显然也是不可取的。其他应用程序肯定也遇到过这个问题,他们是怎么做的呢?
注意:我也安装了 jscoverage 以使这一切正常工作。
我看过的来源:https://brianstoner.com/blog/testing-in-nodejs-with-mocha/http://boycook.wordpress.com/2013/03/29/automated-javascript-testing-with-mocha-and-js-coverage-for-nodejs/Code coverage with Mocha
【问题讨论】:
为什么你会说伊斯坦布尔中间件输出是“不可取的”?它表明你没有测试username && username.search(regexp) == -1
的情况,这是关于你的测试覆盖率的重要信息!
虽然中间件可能正在正确分析文件和使用情况,但输出是如此混乱,除了我之外没有其他人能够理解。它需要易于理解。
我刚刚看懂了你的最后一张图片,抱歉耽误了时间。为了获取一些报道信息而做所有这些乱七八糟的事情是无稽之谈。
@Wayfarer,你有没有找到解决方案?我也遇到了一些类似的问题。
有什么解决办法吗?
【参考方案1】:
我刚刚遇到了同样的情况,我发现它必须按照我使用 supertest 的方式进行:
在我直接针对正在运行的服务器测试我的应用之前,就像这样。
var request = require('supertest')
var api = request('http://127.0.0.1:3000')
我通过要求我的快递应用来解决它:
var request = require('supertest')
var app = require('../../../')
var api = request(app)
【讨论】:
【参考方案2】:根据我在伊斯坦布尔的经验,我认为实际使用的路线可能存在逻辑错误。请将该测试设置为使用it.only
,然后查看伊斯坦布尔覆盖率。 (无需使用 istanbul 中间件,因为您的开发人员可以访问正在写入本地文件系统的 html 输出。)
请说明实际覆盖的是哪条路线,因为伊斯坦布尔非常聪明地遵循 if 语句。
如果您在伊斯坦布尔发现了错误,我鼓励您在那里发布错误。
【讨论】:
以上是关于如何在基于 Express 的 API 上设置代码覆盖率?的主要内容,如果未能解决你的问题,请参考以下文章
如何从基于 TypeScript 的 Express 应用程序生成 swagger API 文档?
如何使用 Express.js 将 API 访问限制为仅授权域?
如何在 nodejs express 重定向上启用 CORS?