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

使用Jest编写服务功能测试时遇端口占用问题求助

解决Jest测试中"server is already in use"端口占用问题

核心原因

测试运行时,要么是每次测试用例/测试文件重复启动服务器导致端口被抢占,要么是测试结束后服务器未正确关闭,残留进程持续占用端口。

具体解决方案

  • 全局单例启动/关闭服务器:将服务器启动逻辑放在beforeAll,关闭逻辑放在afterAll,确保整个测试套件仅启动一次服务:

    let server;
    
    beforeAll(async () => {
      server = await startServer(); // 假设startServer返回服务器实例
    });
    
    afterAll(async () => {
      await server.close(); // 调用服务器关闭方法释放端口
    });
    
    describe("api tests", () => {
      it("createUser: should create user successfully", async () => { 
        const user = await createUserService(userCredentials);
        expect(user.email).toBe("test2@test.com");
      }, 12000);
    });
    
  • 使用动态端口:修改服务器启动配置,让测试环境使用系统自动分配的可用端口,避免固定端口冲突:

    function startServer() {
      const port = process.env.NODE_ENV === 'test' ? 0 : 3000;
      // 传入0让系统自动分配未被占用的端口
      const app = express();
      // ...其他业务配置
      return app.listen(port);
    }
    
  • 禁用Jest并行测试:在jest.config.js中设置单进程运行测试,避免多进程抢占端口:

    module.exports = {
      maxWorkers: 1,
    };
    
  • 手动清理残留进程:如果是遗留进程占用端口,可手动杀死对应进程:

    • Windows:
      netstat -ano | findstr :<你的端口号>
      taskkill /PID <查到的进程ID> /F
      
    • macOS/Linux:
      lsof -ti:<你的端口号> | xargs kill -9
      

内容的提问来源于stack exchange,提问作者Mhd

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 08:09:19