You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Cypress中于所有测试执行前运行代码?实现全局单次登录

在Cypress中实现全局前置操作与单次登录

刚好在项目里频繁处理这类Cypress的全局配置需求,给你拆解清楚两个问题的解决方案:

一、在所有测试套件执行前运行代码

Cypress专门提供了全局初始化的入口文件——cypress/support/e2e.js(如果是Cypress 9及更早版本,对应文件是cypress/support/index.js)。

  • 这个文件里的代码会在所有测试文件加载、所有测试用例执行之前自动运行,非常适合放全局通用的初始化逻辑,比如设置默认视口、注册自定义命令、配置全局断言等。
  • 如果要实现“整个测试运行期间只执行一次”的前置逻辑,直接在这个文件里用before()钩子就行:
    // cypress/support/e2e.js
    before(() => {
      // 这段代码只会在所有测试开始前执行一次
      cy.log("全局初始化:设置默认视口");
      cy.viewport(1920, 1080);
      // 还可以在这里做其他全局准备,比如清除测试数据
    });
    

二、实现全局单次登录(避免每个文件重复登录)

关于单次登录,不建议在每个测试文件里单独写before()调用登录——那样每个文件都会重复登录,既浪费时间又不符合你的需求。这里有两种更优的方案:

方案1:全局before()钩子(简单直接)

直接在cypress/support/e2e.js的before()里调用登录逻辑,整个测试套件运行期间只会登录一次:

// cypress/support/e2e.js
before(() => {
  // 假设你已经注册了自定义的login命令(可以在commands.js里定义)
  cy.login("your-account", "your-password");
});

注意:这种方式适合测试场景单一、不需要切换登录状态的情况。如果有测试需要退出登录或切换账号,可能会相互影响。

方案2:Cypress Session API(推荐,更稳定)

从Cypress 12开始,官方推出了cy.session() API,专门用来管理会话状态,不仅能实现单次登录,还能自动处理会话过期、跨测试文件共享会话的问题,稳定性拉满。

步骤如下:

  1. 先在cypress/support/e2e.js里配置会话跨文件共享:
    // cypress/support/e2e.js
    Cypress.session.defaults({
      cacheAcrossSpecs: true, // 开启后会话可在不同测试文件间复用
    });
    
  2. 在cypress/support/commands.js里定义带会话管理的登录命令:
    // cypress/support/commands.js
    Cypress.Commands.add("login", (username, password) => {
      cy.session([username, password], () => {
        // 这里写实际的登录流程
        cy.visit("/login");
        cy.get("#username-input").type(username);
        cy.get("#password-input").type(password);
        cy.get("#login-btn").click();
        // 验证登录成功,确保会话有效
        cy.url().should("include", "/home");
      });
    });
    
  3. 最后在全局或测试文件中调用登录命令:
    你可以在e2e.js的before()里调用一次,或者在需要登录的测试文件的before()里调用——因为开启了cacheAcrossSpecs,不管多少个文件调用,实际只会执行一次登录:
    // cypress/e2e/home-page.spec.js
    before(() => {
      cy.login("your-account", "your-password"); // 只会执行一次,其他文件调用也不会重复登录
    });
    

这样既满足了“所有测试前仅登录一次”的需求,又能应对会话过期等异常情况,比单纯的全局before()更可靠。

内容的提问来源于stack exchange,提问作者Florian F

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:22:31