
cypress设计之初就强调测试的隔离性,即每个it测试块都应独立运行,互不影响。这意味着在默认情况下,当一个it块执行完毕后,cypress会清除浏览器状态(包括cookies、localstorage、sessionstorage等),并重新加载页面,以确保下一个it块在一个干净的环境中开始。
这种隔离性对于确保测试的稳定性和可重复性至关重要,但同时也带来了一个常见问题:如果你的测试套件需要多个测试块(it)都依赖于一个已登录的用户状态,那么仅在describe块中使用一次before()钩子进行登录,将无法满足需求。因为before()钩子只在所有it块执行之前运行一次,其建立的登录状态在第一个it块结束后就会被清除,导致后续的it块无法在登录状态下执行。
一种直接但不推荐的方法是禁用Cypress的测试隔离功能。通过在cypress.config.js文件中设置testIsolation: false,可以阻止Cypress在每个it块之间重置浏览器状态。
配置方法: 在 cypress.config.js 文件中添加或修改 e2e 或 component 配置:
const { defineConfig } = require('cypress');
module.exports = defineConfig({
e2e: {
setupNodeEvents(on, config) {
// implement node event listeners here
},
testIsolation: false, // 禁用测试隔离
},
});优点:
缺点(强烈不推荐的原因):
Cypress提供了一个更优雅、更健壮的解决方案来管理跨测试块的会话状态:cy.session()命令。cy.session()允许你缓存一组登录凭据或会话状态,并在需要时恢复它们,而无需每次都执行完整的登录流程。它通常与beforeEach()钩子结合使用。
cy.session()的工作原理:
使用cy.session()实现登录状态保持:
describe('VerifyLoginFunctionality', () => {
// 实例化页面对象,确保它们在所有测试块中都可访问
const loginpage = new LoginPage();
const dashbord = new Dashboard();
const createtask = new Createtask();
// 在每个测试块执行前,尝试恢复或创建会话
beforeEach(() => {
// 定义一个名为 'loginSession' 的会话
// 这里的回调函数只会在会话第一次创建时执行
cy.session('loginSession', () => {
cy.viewport(1280, 800); // 可以在这里设置视口,如果这是登录的一部分
// 加载 fixture 数据,确保登录凭据可用
cy.fixture('example').then((data) => {
cy.visit(Cypress.env('login_url'));
cy.title().should('eq', data.Pagetitle);
// 执行完整的登录流程
loginpage.SigninMannuallyButton().click();
loginpage.TeamSpace().type(data.TeamspaceName);
loginpage.NextButton().click();
loginpage.Email().type(data.email);
loginpage.Password().type(data.Password);
loginpage.SigninButton().click();
cy.wait(3000); // 等待登录完成
});
});
// 每次 beforeEach 执行时,cy.session 都会确保会话已存在并恢复
// 如果会话已缓存,则不会再次执行上述登录代码
});
it('Verify the user profile', () => {
// 此时,cy.session 已经确保用户处于登录状态
dashbord.UserProfileButton().click();
cy.wait(2000);
dashbord.UserProfilePopupMiddleLayer().should('be.visible');
dashbord.Firstname()
.invoke('val')
.then(text => {
const someText = text;
cy.log("aaa> " + someText);
expect(someText).to.equal("Toyota");
assert.equal(someText, "Toyota");
});
cy.wait(3000);
dashbord.Givenname().clear();
dashbord.Givenname().type("jjjjjjj");
dashbord.Firstname().should('have.value', "jjjjjjj");
cy.wait(1500);
dashbord.CloseIconOnProfile().click();
});
it('Verify the create task', () => {
// 此时,用户也处于登录状态
createtask.CreateNewTaskButton().click();
// ... 继续创建任务的测试步骤
});
// 可以在这里添加更多依赖登录状态的测试块
it('Verify another feature', () => {
// ...
});
});cy.session()的优势:
当需要在Cypress中跨多个it测试块保持登录状态时,强烈推荐使用cy.session()命令结合beforeEach()钩子。它提供了一种高效、可靠且符合测试最佳实践的解决方案,避免了禁用测试隔离所带来的状态污染风险。
关键点回顾:
通过采纳cy.session(),你的Cypress测试套件将更加健壮、高效,并且易于维护。
以上就是Cypress测试中跨测试块保持登录状态的最佳实践的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号