使用集成测试在 Jest 中收集覆盖率报告

Collecting Coverage Reports in Jest with Integration Tests

我用 Jest 设置了一堆测试,这些测试在同一个 repo 中测试 Express 服务器端点。为了完成这个测试,我让 Jest 在 beforeAll() 方法中启动了一个 Express 服务器。当我使用 --coverage 标志 运行 Jest 时,我只获得 运行 脚本的覆盖率信息以启动 Jest 并且没有报告通过点击端点触发的脚本.这是有道理的,但是有没有办法获取端点代码的覆盖率信息?

测试代码片段:

const rp = require('request-promise')

describe('testFunctions', () => {
    beforeAll(done => {
        app.listen(config.PORT, async () => {
            done()
        })
    })
    it('hit endpoint', async () => {
        const response = await rp({ uri: '/testFunctions', method: 'POST' })
        expect(response).toEqual('response)
    })
})

我正在尝试获取 /testFunctions 请求命中的所有服务器代码的覆盖率报告。

这是对我有用的解决方案。它需要一些重构,但我认为它最终更干净了。在我的生态系统中,我们 运行 将 Parse Server 作为中间件与 Express 服务器连接,但这可能适用于需要 运行 带有测试的单独服务器的任何人。

因此,为了让我的服务器处于 nyc(我正在使用的覆盖率报告工具)可以监控的位置,我将服务器初始化完全从 jest 测试套件中抽象出来,并创建了一个特殊的 npm 脚本在一个完全独立的过程中 运行 它。

NPM 脚本(package.json):

"scripts": {
    "coverage": "nyc --silent npm start & ./listen_on_port_5000.sh && jest test/cloud/integration && kill $(lsof -t -i tcp:5000) && nyc report --reporter=html",
}

listen_on_port_5000.sh

while ! nc -z localhost 5000
do
    sleep 0.5
done

那么这是如何工作的?

  1. nyc --silent npm start 运行s 这是我们 运行 使用 Express 和 Parse 启动我们的服务器的正常命令,但前面的 nyc 部分带有 --silent 标记以便 nyc 可以 运行 在后台查看服务器代码。
  2. 因为我们知道服务器总是在端口 5000 上启动,所以我们 运行 在后台运行 start 脚本并启动一个单独的进程 运行ning 一个 shell等待服务器启动的脚本 (listen_on_port_5000.sh)。
  3. 一旦侦听器脚本在端口 5000 上检测到任何 运行ning,npm 脚本就会移动到 jest 命令(在 Express 服务器启动并 运行ning 时)。
  4. 当 Jest 完成 运行ning 时,最终脚本 运行 是一个 kill 脚本来关闭端口 5000 上的服务器 运行ning。
  5. 然后我们 运行 第二个 nyc 脚本生成它在第一个脚本中收集的报告。生成的报告可以在 /coverage/lcov-report/ 下的项目目录中找到(或者您可以使用不同的 coverage reporter.