NodeJS 如何在不发送请求的情况下测试Express服务器?[副本]

cclgggtu  于 2023-06-05  发布在  Node.js
关注(0)|答案(1)|浏览(479)

此问题已在此处有答案

How can I test my Express app without running a live server?(1个答案)
昨天关门了。
我是一名教育工作者,正在帮助教授一门课程,该课程涵盖了使用Express编写HTTP服务器的基础知识。目前,我们的学生通过启动他们的服务器来测试他们的服务器,然后单独运行Jest,使用fetch向他们的服务器发送请求。
通常情况下,发送这些请求的小性能开销不会成为问题,但由于我们有数百名学生,每个学生的CI管道需要大约2分钟才能运行,这给我们的系统带来了很大的压力,特别是当它接近截止日期时,我们的跑步者可能会落后24小时。
因此,我正在寻找一种通过模拟请求来加速测试的方法。从本质上讲,我希望学生能够编写类似于fetch请求的代码,但不是通过localhost发送,而是直接发送到Express服务器,这是同一进程的一部分,从而显着提高性能。
到目前为止,在我的调查中,我只遇到过supertest,但它似乎在后台启动服务器,这意味着它并不比手动发送请求更快-本质上它只是抽象了运行服务器的部分,而不是消除它。
可以在Flask和许多其他框架中进行这种测试。
我如何才能在Express中以一种平易近人且可靠的方式完成这一任务?
需要明确的是,我不想将整个大学课程迁移到GitHub。这不应该是这个问题的答案。这根本不是答案请我能得到答案(或至少一个“对不起,你所要求的不存在”),而不是回答不解决问题?

eiee3dmh

eiee3dmh1#

正如我在评论中提到的,您可以使用普通的unix套接字而不是localhost来移除网络堆栈。但是您也可以直接调用app.handle函数,并创建自己的请求和响应示例。

  • 编辑:注意,我不知道下面是什么是一个实际的工作样本,但它是一个起点。您可能需要在示例上填充更多属性,以确保express获得它所需要的一切。
const http = require('http');
let req = Object.assign(
  new http.IncomingMessage(),
  { method: 'GET',
    url: '/api/foobar',
    headers: { host: 'localhost' } }
);
let res = new http.OutgoingMessage();

app.handle(req,res);

https://nodejs.org/docs/latest-v14.x/api/http.html#http_class_http_incomingmessage
https://nodejs.org/docs/latest-v14.x/api/http.html#http_class_http_outgoingmessage

相关问题