【问题标题】:Collecting Coverage Reports in Jest with Integration Tests在 Jest 中使用集成测试收集覆盖率报告
【发布时间】:2020-02-24 03:13:24
【问题描述】:

我用 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 请求命中的所有服务器代码的覆盖率报告。

【问题讨论】:

    标签: express jestjs integration-testing


    【解决方案1】:

    这是对我有用的解决方案。它需要一些重构,但我认为它最终更干净。在我的生态系统中,我们将 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 运行,这是我们将运行以使用 Express 和 Parse 启动服务器的正常命令,但前面带有 nyc 部分和 --silent 标志,以便 nyc 可以在后台运行并观察服务器代码。李>
    2. 因为我们知道服务器总是在端口 5000 上启动,所以我们在后台运行 start 脚本并启动一个运行 shell 脚本 (listen_on_port_5000.sh) 的单独进程来等待服务器启动。李>
    3. 一旦侦听器脚本检测到在端口 5000 上运行的任何内容,npm 脚本就会转到 jest 命令(所有这些都在 Express 服务器启动并运行时)。
    4. 当 Jest 完成运行时,最终脚本会运行 kill 脚本以关闭在端口 5000 上运行的服务器。
    5. 然后我们运行第二个nyc 脚本来生成它在第一个脚本中收集的报告。生成的报告可以在您的项目目录中的/coverage/lcov-report/ 下找到(或者您可以使用不同的coverage reporter

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-12-09
      • 1970-01-01
      • 2019-12-18
      • 1970-01-01
      • 1970-01-01
      • 2018-07-25
      • 2016-11-18
      • 1970-01-01
      相关资源
      最近更新 更多