如何在基于 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?

使用 express-jwt 进行基于角色的授权?

为啥我在 Express 上设置 CORS 时出现飞行前错误?

在 Netlify 上部署时使用 Express 公开 API 路由