NX 14.5.1+Cypress 10.2.0在GitHub Action中E2E测试重复执行求助
问题分析与解决方案
你的测试执行两次的核心原因是Cypress GitHub Action与你在start字段中执行的npm run e2e命令重复触发了测试:
npm run e2e(NX的E2E命令)本身会启动被测应用并自动运行Cypress测试- 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
相关产品推荐
相关产品推荐

