You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Jest+SuperTest本地测试通过,GitHub Actions CI报ECONNREFUSED错误求助

解决GitHub Actions中Jest+SuperTest的connect ECONNREFUSED及服务器阻塞问题

方案一:直接用SuperTest导入服务器实例(最推荐)

这是最简洁可靠的方案,无需手动管理服务器进程,让SuperTest自动启动/关闭临时测试服务器:

  1. 拆分服务器代码结构:
    将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}`);
    });
    
  2. 修改测试代码:
    直接导入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);
      // 其他断言逻辑
    });
    
  3. CI执行命令:
    直接运行测试即可,无需手动启动服务器:

    npm run test
    

方案二:后台启动服务器并等待就绪(适用于无法修改服务器结构的场景)

如果必须保留现有服务器启动方式,需要将服务器放到后台运行,等待其就绪后再执行测试:

  1. 安装就绪检测工具:
    用wait-on工具检测服务器是否可访问:

    npm install --save-dev wait-on
    
  2. 配置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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 03:48:31