Cypress如何从上一测试结束处继续执行并拆分长测试用例
解决方案
1. 解决用例间需要重新登录的问题
Cypress 12及以上版本默认开启testIsolation测试隔离配置,每条it用例执行完成后会自动清除所有Cookie、LocalStorage、会话缓存,重置页面到空白页,所以你拆分用例后会需要重复登录。
只要关闭该配置即可保留上一条用例的执行状态,直接从上次结束的位置继续执行,有两种配置方式可选:
- 全局配置:在
cypress.config.js的e2e配置项中添加testIsolation: false - 单describe块配置:在测试文件的describe第二个参数里加配置,不影响其他测试
describe("Full system test", { testIsolation: false }, () => { // 原有逻辑 })
2. 解决Faker重复生成测试数据的问题
你当前写的before钩子本身就只会在整个describe块执行前运行一次,只要你的../../faker/user模块是一次生成后不会自动刷新数据的,所有用例复用this.User就不会出现数据重新生成的问题。如果你的faker模块每次调用都会重新生成,调整成单例模式即可:
// faker/user.js 调整示例 const faker = require('@faker-js/faker'); // 一次性生成后导出,不会每次require都重新生成 module.exports = { username: faker.internet.userName(), email: faker.internet.email(), password: faker.internet.password() }
3. 调整后完整可运行的测试代码
/// <reference types="cypress" /> import "cypress-audit/commands"; // 关闭当前测试块的测试隔离,保留用例间状态 describe("Full system test", { testIsolation: false }, () => { before(function () { // 仅在所有用例执行前生成一次测试数据,所有用例复用 this.User = require("../../faker/user"); }); it("Registers and creates profile", function () { cy.visit(Cypress.env("home_page")); cy.Register({ user: this.User }); cy.contains("Vacancies").click(); cy.UpdateProfile({ user: this.User }); cy.contains("Vacancies").click(); cy.AddCompanyDetails({ user: this.User }); cy.contains("Vacancies").click(); cy.AddTeamMember({ user: this.User }); }); it("Creates a vacancy and adds candidates", function () { // 直接复用之前的登录态和页面状态,不需要重新登录 cy.CreateVacancy({ user: this.User }); cy.AddCandidate({ user: this.User }); cy.AddAdditionalDocs({ user: this.User }); }); });
额外优化建议
如果担心后续用例增多后前置依赖失败导致所有后续用例挂掉,可以配合Cypress自带的测试筛选功能,单独运行某条用例调试,不影响整体测试流程。调整后你的测试报告就会按照拆分后的用例分别展示执行结果,和你预期的展示效果一致。
内容的提问来源于stack exchange,提问作者ItsNotAndy
相关产品推荐
相关产品推荐

