通过GitHub Actions环境变量配置Cypress测试多环境BaseUrl
解决Cypress环境变量覆盖与分支环境适配问题
问题背景
我有一套Cypress测试用例,仅一个遗留测试未使用统一BaseUrl,它的before hook硬编码访问dev环境地址:
cy.visit('http://e2etest.dev.my-company.com:8081/company/sign-in')
导致staging分支跑测试时仍访问dev环境。我尝试通过CYPRESS_ENV变量切换地址:
if (Cypress.env('CYPRESS_ENV') === 'test') { cy.visit('http://e2etest.dev.my-company.com:8081/company/sign-in'); } else { cy.visit('http://e2etest.staging.my-company.com:8081/company/sign-in'); }
CI中已根据分支设置CF_WORKER_ENV和CYPRESS_ENV,变量打印显示配置正确,但staging分支测试仍读取到CYPRESS_ENV=test,排查发现cypress.config.ts里硬编码了CYPRESS_ENV: 'test'。若删除该配置,本地运行时CYPRESS_ENV为undefined,测试会走staging逻辑。
需求目标:
- 本地运行时
CYPRESS_ENV默认设为test - CI中非staging分支使用test环境
- CI中staging分支使用staging环境
解决方案
1. 修改Cypress配置,设置环境变量默认值
修改cypress.config.ts中的env配置,让CYPRESS_ENV优先读取系统环境变量,无值时默认设为test。这样本地运行自动用test,CI传递的环境变量能直接覆盖默认值:
import { defineConfig } from 'cypress'; export default defineConfig({ // ... 其他原有配置 env: { COMPANY_API_BASE_URL: 'api.staging.my-company.com', CYPRESS_ENV: process.env.CYPRESS_ENV || 'test', // 替换原硬编码值 }, // ... 其他原有配置 });
2. 确认CI环境变量传递有效性
当前CI的cypress-test任务已在两个位置设置CYPRESS_ENV:
- 任务级
env中:CYPRESS_ENV: ${{ needs.workflow-info.outputs.cf-worker-env }} - Cypress action的
env中:CYPRESS_ENV: ${{ needs.workflow-info.outputs.cf-worker-env }}
只需确保workflow-info步骤的分支判断逻辑正确:
- staging分支输出
cf-worker-env: staging - 其他分支输出
cf-worker-env: test
当前CI的分支判断代码已满足该逻辑,无需修改。
3. 优化遗留测试的地址逻辑(可选)
为减少硬编码URL,可通过环境变量动态拼接地址,提升可维护性:
const signInDomain = Cypress.env('CYPRESS_ENV') === 'test' ? 'e2etest.dev.my-company.com:8081' : 'e2etest.staging.my-company.com:8081'; cy.visit(`http://${signInDomain}/company/sign-in`);
更优方案是将域名存入Cypress环境变量(比如在cypress.config.ts或CI中设置SIGN_IN_BASE_URL),直接调用:
cy.visit(`${Cypress.env('SIGN_IN_BASE_URL')}/company/sign-in`);
内容的提问来源于stack exchange,提问作者Pix81
相关产品推荐
相关产品推荐

