Jest+SuperTest本地测试通过,GitHub Actions CI报ECONNREFUSED错误求助
解决GitHub Actions中Jest+SuperTest的
connect ECONNREFUSED及服务器阻塞问题 方案一:直接用SuperTest导入服务器实例(最推荐)
这是最简洁可靠的方案,无需手动管理服务器进程,让SuperTest自动启动/关闭临时测试服务器:
拆分服务器代码结构:
将Express应用实例单独导出,把启动逻辑分离到独立文件:// app.js const express = require('express'); const app = express(); // 配置路由、中间件等业务逻辑 app.get('/test/a', (req, res) => { res.status(200).send('测试响应'); }); module.exports = app;// server.js(用于本地开发/生产环境启动) const app = require('./app'); const PORT = process.env.PORT || 55503; app.listen(PORT, () => { console.log(`Server running on http://127.0.0.1:${PORT}`); });修改测试代码:
直接导入app实例,不再硬编码固定URL:const request = require('supertest'); const app = require('../app'); // 导入你的Express应用实例 test('GET /test/a 应返回正常响应', async () => { const response = await request(app).get('/test/a'); expect(response.statusCode).toBe(200); // 其他断言逻辑 });CI执行命令:
直接运行测试即可,无需手动启动服务器:npm run test
方案二:后台启动服务器并等待就绪(适用于无法修改服务器结构的场景)
如果必须保留现有服务器启动方式,需要将服务器放到后台运行,等待其就绪后再执行测试:
安装就绪检测工具:
用wait-on工具检测服务器是否可访问:npm install --save-dev wait-on配置GitHub Actions工作流:
在.github/workflows/test.yml中添加以下步骤:name: 运行测试 on: [push, pull_request] jobs: test: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - uses: actions/setup-node@v4 with: node-version: 20 # 匹配你的项目Node.js版本 - run: npm install - run: npm run start:dev & # 后台启动服务器 - run: npx wait-on http://127.0.0.1:55503 # 等待服务器就绪 - run: npm run test - run: pkill -f "npm run start:dev" || true # 测试完成后清理服务器进程
原命令卡住的原因
你使用的npm run start:dev && npm run test中,start:dev是阻塞式进程——服务器启动后会持续运行,不会主动退出,导致&&后面的test命令永远无法执行,GitHub Actions会一直等待服务器进程结束,最终超时。
额外注意事项
- 避免硬编码端口:用
process.env.PORT || 55503动态设置端口,防止CI环境中端口冲突。 - 简易就绪检测替代方案:如果不想安装
wait-on,可以用curl循环检测:npm run start:dev & until curl -s http://127.0.0.1:55503 > /dev/null; do sleep 1; done
内容的提问来源于stack exchange,提问作者shinbian11
相关产品推荐
相关产品推荐

