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