deno(基于现代的生锈的打字稿运行时)带有内置的代码覆盖范围。不幸的是,right now,仅支持deno test
,但不支持deno run
。
这似乎是不必要的限制,因为它通过对其进行操作的API测试来使其在运行的DENO服务器中进行测量覆盖范围,但并非不可能。该博客概述了一个解决方法,可让您实现这一目标。多亏了zachauten的想法。
假设您已经编写了许多邮递员API测试,用于测试您使用出色的newman CLI Collection Runner执行的DENO HTTP REST API服务器。此外,可以说您想通过运行这些API测试来测量代码覆盖范围。
您会认为您可以做这样的事情:
# Start Deno HTTP server and put it in background
deno run --coverage ./main.ts &
export PID=$!
# Run Postman API tests using newman
npx newman run ./api-tests.postman.json
# Kill server to generate coverage
kill $PID
不幸的是,以上内容不起作用,因为不支持deno run --coverage
。
相反,诀窍是在DENO 测试中执行所有这些步骤(启动服务器,运行API测试,停止服务器),然后使用deno test --coverage
。叹气ð。看起来迷宫,但这是做的方法。
步骤1:使您的服务器成为可测试的模块
确保您的服务器处于可以从DENO测试中消耗并开始并在此停止的形式。例如,简单的服务器看起来像:
// server.ts
export function requestHandler(_req: Request): Promise<Response> {
return Promise.resolve(new Response("Hello, world!"));
}
此服务器也可以从您的主要入口点消耗:
// main.ts
import { serve } from "std/http/server.ts";
import { requestHandler } from "./server.ts";
serve(requestHandler);
步骤2:编写一个调用服务器的测试
现在编写一个测试,可以执行以下操作:
- 使用中止控制器启动服务器
- 外壳运行
newman
API测试 - 使用中止控制器停止服务器
例如:
// server_test.ts
import { assert } from "std/testing/asserts.ts";
import { serve } from "std/http/server.ts";
import { requestHandler } from "./server.ts";
Deno.test("API Tests", async () => {
// Start server (with abort controller)
const controller = new AbortController();
const { signal } = controller;
const server = serve(requestHandler, { signal });
// Run API tests
const p = Deno.run({
cmd: ["npx", "newman", "run", "./api-tests.postman.json"],
});
const { success } = await p.status();
p.close();
assert(success);
// Stop server (using abort controller)
controller.abort();
// Wait for server to be closed
await server;
});
步骤3:在覆盖模式下进行测试
最后,我们可以使用--coverage
标志运行服务器测试。
deno test --allow-net --allow-run --coverage=coverage ./server_test.ts
这将在覆盖范围模式下运行外部server_test.ts
,在coverage
文件夹中生成代码覆盖范围,可以进一步处理。请参阅Deno coverage的帮助。
结论
希望从长远来看,Deno将引入deno run --coverage
选项。到那时,这个解决方法必须做。
有关本文中代码的更充实的版本,请参阅:
anishkny / deno-api-tests-coverage
运行邮递员(Newman)API测试时的DENO服务器的测量代码覆盖范围
Deno API Tests Coverage
Demonstrates code coverage measurement of a Deno server when running Postman (koude4) API tests.
See accompanying blog post有关更多详细信息。
要求
deno v1.26(或更高)安装并在路径上可用。
用法
克隆此存储库并执行:
deno任务测试
运行测试文件koude10并收集结果代码覆盖。
测试文件采取以下步骤:
- 启动要测试的DENO服务器(koude11)。
- 在子过程中使用
newman
运行Postman API测试。 - 停止服务器。
背景
deno在运行API测试时缺乏测量服务器代码覆盖的方法。请参阅deno repo上的this discussion。
理想情况下,将有一种启动服务器的方法: