Cypress 10.3.0如何实现类似旧版testFiles按指定顺序运行测试
Cypress 10.3.0 自定义测试执行顺序配置方案
问题根因
你当前配置不生效有三个核心原因:
- Cypress 10+ 版本已完全废弃旧版
cypress.json的testFiles配置项,根目录残留的旧cypress.json不会被正常读取,反而可能干扰新配置加载,建议直接删除或移出项目根目录。 specPattern配置项仅用于通过glob规则匹配测试文件,不保证执行顺序:Cypress默认会将所有匹配到的测试文件按文件名字母序排序执行,无论你在specPattern里写路径的顺序如何,最终都会被重新排序。- 你之前配置的specPattern路径是旧版默认的
cypress/integration/,Cypress 10默认e2e测试目录为cypress/e2e/,默认识别后缀为.cy.js,路径不匹配也会导致配置不符合预期。
可落地方案
方案1:命令行--spec参数指定顺序(最稳妥,零额外代码)
Cypress原生支持通过--spec参数传入按顺序排列的测试文件列表,执行顺序完全和你传入的列表顺序一致,和旧版testFiles的使用体验完全一致。
示例命令(按2test→1test→3test的自定义顺序执行):
node_modules/.bin/cypress run --spec "cypress/e2e/2test.cy.js,cypress/e2e/1test.cy.js,cypress/e2e/3test.cy.js"
你可以直接把命令配置到package.json的scripts中,替换原有husky钩子、CI流程里的cypress执行命令,比如:
"scripts": { "start": "HTTPS=true react-scripts start", "build": "react-scripts build", "build-beta": "REACT_APP_SECRET_CODE=beta react-scripts build", "build-qa": "REACT_APP_SECRET_CODE=qa react-scripts build", "test": "react-scripts test", "eject": "react-scripts eject", "cypress:run": "cypress run --spec \"cypress/e2e/2test.cy.js,cypress/e2e/1test.cy.js,cypress/e2e/3test.cy.js\"" }, "husky": { "hooks": { "pre-commit": "lint-staged && npm run cypress:run --headless" } }
后续无论是本地执行、CI流水线还是钩子触发,直接调用npm run cypress:run即可按指定顺序跑测试。如果你的测试文件还在旧的cypress/integration/目录、后缀为.js,把命令里的路径替换成实际路径即可。
方案2:配置层重排spec列表(直接执行cypress run即可生效)
如果你不想在命令行写长串参数,可以在cypress.config.js的setupNodeEvents钩子中拦截Cypress解析到的测试文件列表,按自定义顺序重排后返回,配置示例:
const { defineConfig } = require('cypress') const path = require('path') // 按你需要的执行顺序排列测试文件名 const TEST_EXEC_ORDER = [ '2test.cy.js', '1test.cy.js', '3test.cy.js' ] module.exports = defineConfig({ video: true, viewportWidth: 1920, viewportHeight: 1024, numTestsKeptInMemory: 1, defaultCommandTimeout: 10000, e2e: { // 替换为你实际存放测试文件的glob匹配规则 specPattern: 'cypress/e2e/**/*.cy.js', setupNodeEvents(on, config) { // 保留原有插件逻辑 require('./cypress/plugins/index.js')(on, config) // 按自定义顺序重排测试列表 const orderedSpecs = [] // 先加入指定顺序的测试文件 TEST_EXEC_ORDER.forEach(fileName => { const targetSpec = config.specs.find(spec => path.basename(spec.relative) === fileName) if (targetSpec) orderedSpecs.push(targetSpec) }) // 未在顺序列表中声明的其他测试文件,追加到列表末尾按默认顺序执行 config.specs.forEach(spec => { if (!orderedSpecs.includes(spec)) orderedSpecs.push(spec) }) config.specs = orderedSpecs return config }, baseUrl: 'https://localhost:3000', }, })
配置完成后,直接执行node_modules/.bin/cypress run就会按你在TEST_EXEC_ORDER中声明的顺序执行测试,和旧版testFiles配置效果完全一致。
注意事项
- 配置前先删除根目录下残留的旧版
cypress.json,避免Cypress启动时触发旧配置迁移逻辑,导致新配置不生效。 - 确认
specPattern匹配规则和你实际的测试文件存放路径、后缀一致,否则会出现漏跑、多跑无关文件的问题。 - 不要尝试通过在
specPattern中写有序数组/逗号分隔路径的方式控制顺序,Cypress会对所有glob匹配到的文件重新做字母排序,你写的路径顺序不会被保留。
内容的提问来源于stack exchange,提问作者Александр
相关产品推荐
相关产品推荐

