Cypress如何在单个it()用例登录后保持状态供后续用例使用
问题结论
该需求完全可以实现,不需要额外写复杂的Cookie/本地存储持久化逻辑,只需要调整Cypress的测试隔离配置即可。
实现原理
很多人遇到跨it()用例登录态丢失的问题,本质是Cypress默认开启了testIsolation: true配置:这个配置生效时,每个it()用例执行前,Cypress会自动清空所有Cookie、localStorage、sessionStorage这类存登录态的会话数据,同时重置页面上下文,自然就没法保留上一个用例的登录状态。
只要给对应测试集关掉测试隔离开关,同一个describe()块下的所有it()用例会共享完整的浏览器上下文,上一个用例跑完留下的所有状态——不管是登录态、本地存的业务数据,还是页面上的操作状态,都会原封不动留给后面的用例用。
具体实现代码
你原来写的测试逻辑完全不用改,只要在包裹用例的describe()层加个配置项关掉测试隔离就行:
// 给describe传入配置项,关闭测试隔离 describe('需要跨用例共享状态的流程测试', { testIsolation: false }, () => { it('logs in', () =>{ cy.login('username', 'password'); // 你自己封装的自定义登录命令 }) it('next step', () =>{ // 这里直接就能拿到上一个用例的登录态,不需要重复执行登录 cy.get('div.nextStep').click(); }) // 后续所有挂在这个describe下的it用例,都可以持续复用前面生成的登录态 })
注意事项
- 这个方案最适合强流程关联的测试场景,比如把一整条完整的用户操作链路(登录→找商品→加购物车→提交订单→付款)拆成多个
it()分别写断言的场景,执行速度比你之前了解的before()+beforeEach()手动存Cookie恢复会话的方案快很多,省掉了每个用例前重置环境、恢复登录态的开销。 - 关掉测试隔离之后,同一个describe下的用例就不再是完全独立的了,前面的用例如果操作出问题(比如误点了退出登录),会直接影响后面所有用例的执行结果,不要用这种方式写互相独立的单功能点测试。
- 测试过程中不要主动调用
cy.clearCookies()、cy.clearLocalStorage()这类会清空浏览器存储的命令,不然登录态会被直接清掉。 - 如果你既想让用例之间保持独立、避免非登录状态的操作互相干扰,又不想每次都重复走登录流程,还是更推荐用
cy.session()配合beforeEach()做登录态缓存的方案,不要直接关测试隔离。
内容的提问来源于stack exchange,提问作者FlawFull
相关产品推荐
相关产品推荐

