运行DENO服务器的代码覆盖范围
#node #测试 #deno #coverage

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:编写一个调用服务器的测试

现在编写一个测试,可以执行以下操作:

  1. 使用中止控制器启动服务器
  2. 外壳运行newman API测试
  3. 使用中止控制器停止服务器

例如:

// 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选项。到那时,这个解决方法必须做。

有关本文中代码的更充实的版本,请参阅:

GitHub logo 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并收集结果代码覆盖。

测试文件采取以下步骤:

  1. 启动要测试的DENO服务器(koude11)。
  2. 在子过程中使用newman运行Postman API测试。
  3. 停止服务器。

背景

deno在运行API测试时缺乏测量服务器代码覆盖的方法。请参阅deno repo上的this discussion

理想情况下,将有一种启动服务器的方法: