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

NX 14.5.1+Cypress 10.2.0在GitHub Action中E2E测试重复执行求助

问题分析与解决方案

你的测试执行两次的核心原因是Cypress GitHub Action与你在start字段中执行的npm run e2e命令重复触发了测试:

  1. npm run e2e(NX的E2E命令)本身会启动被测应用并自动运行Cypress测试
  2. Cypress GitHub Action在start命令执行完成后,默认会自动执行cypress run,相当于第二次触发测试

测试结果里的(Attempt 1 of 3)是Cypress的重试机制,说明部分测试首次执行时因为Firebase模拟器、应用未完全就绪等环境问题导致失败,触发了重试。

修正步骤

方案1:拆分启动命令与测试命令

将start字段改为仅启动Firebase模拟器和被测应用,由Cypress Action负责执行测试:

jobs:
  continuous_integration:
    runs-on: ubuntu-latest
    timeout-minutes: 45
    strategy:
      fail-fast: false
      matrix:
        containers: [1, 2, 3, 4, 5]
    steps:
      - name: 🏁 Checkout Repo
        uses: actions/checkout@v3
  
      - name: 🏁 Setup Node
        uses: actions/setup-node@v3
        with:
          node-version: 16
          cache: 'npm'

      - name: Install Firebase Emulator Suite
        run: npm install -g firebase-tools@9.20.0

      - name: 💾 Install Dependencies
        run: npm ci

      - name: ✅ E2E Tests
        uses: cypress-io/github-action@v4
        with:
          install: false
          # 仅启动模拟器和应用,不执行测试
          start: |
            npm run e2e:firebase
            nx serve <你的应用名称> --port 4200
          wait-on: http://localhost:4200
          wait-on-timeout: 120
          working-directory: apps/e2e
          record: true
          parallel: true
          # 指定NX的E2E测试命令,替换<你的E2E项目名称>
          command: nx e2e <你的E2E项目名称> --watch false --headless
        env:
          FIREBASE_TOKEN: '${{ secrets.NX_FIREBASE_TOKEN }}'

方案2:后台启动模拟器,直接执行NX测试命令

如果nx e2e命令会自动启动应用,可将模拟器启动命令后台运行,再直接执行测试:

jobs:
  continuous_integration:
    runs-on: ubuntu-latest
    timeout-minutes: 45
    strategy:
      fail-fast: false
      matrix:
        containers: [1, 2, 3, 4, 5]
    steps:
      - name: 🏁 Checkout Repo
        uses: actions/checkout@v3
  
      - name: 🏁 Setup Node
        uses: actions/setup-node@v3
        with:
          node-version: 16
          cache: 'npm'

      - name: Install Firebase Emulator Suite
        run: npm install -g firebase-tools@9.20.0

      - name: 💾 Install Dependencies
        run: npm ci

      # 后台启动Firebase模拟器
      - name: Start Firebase Emulator
        run: npm run e2e:firebase &
        working-directory: apps/e2e

      - name: ✅ E2E Tests
        uses: cypress-io/github-action@v4
        with:
          install: false
          wait-on: http://localhost:4200
          wait-on-timeout: 120
          working-directory: apps/e2e
          record: true
          parallel: true
          command: nx e2e <你的E2E项目名称> --watch false --headless
        env:
          FIREBASE_TOKEN: '${{ secrets.NX_FIREBASE_TOKEN }}'

额外优化建议

  • 检查package.json中的e2e脚本,确认其是否包含nx e2e命令,避免重复触发
  • 若测试数量不多,可减少矩阵中的containers数量(比如2-3个),避免资源浪费
  • 调整Cypress重试策略(在cypress.config.ts中配置retries),或延长wait-on的超时时间,减少首次测试失败的概率

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 16:48:57