我是 cypress 的新手,可能缺少一些关于 cypress 中会话如何工作的关键理解。
我正在构建一个简单的测试,它将登录系统,然后执行特定操作 贝娄是我的测试。登录功能按预期执行,但是当第一个
it
完成时,序列将转到空白页面,除非我在下一个 it
中再次登录,否则它将不起作用。
如何在不同的it
之间保持会话而不让它跳转页面?
describe('create cycle', () =>{
it("login as super user", () =>{
cy.session('login', ()=>{
cy.visit('/')
login();
})
})
it('start cycle', ()=>{
cy.get("#cycles-library > ul > #library-item-2").click();
cy.get("#create-cycle").click()
cy.get("#startDate > label").first().click()
cy.get("#duration > label").first().click()
cy.get('#groups-input').click()
cy.get("body>div").last().contains('group 2').click()
cy.get("button#create-cycle").click()
})
})
谢谢!
cy.session()
通常与 beforeEach()
一起使用,以确保为每个测试设置正确的会话数据。
图案是
describe('tests requiring session data', () =>{
beforeEach(() =>{
cy.session('login', ()=>{
cy.visit('/')
login();
})
})
it('test that expects logged-in status', () => {
it('another one', () => {
})
看似您每次都在执行登录,但事实并非如此。
cy.session()
是一个缓存功能,它在第一次测试时运行一次,然后为每个后续测试恢复会话数据。
你可以把它想象成带有空依赖列表的 React hooks
useEffect()
,它在组件生命周期中也只运行一次。
既然您也有一个登录测试,您应该在另一个
describe()
块中单独执行该测试,因为每个测试的初始条件都不同。
就我而言,我必须将 testIsolation 属性设置为 false。之后 cy.session 开始工作并且不会以空白页结束:
describe('my tests',{ testIsolation: false }, () => {...});
每个
it
都会清除导航器存储,包括您的会话。
要处理此问题,您应该创建一个 cypress 命令,它将为您创建会话,该命令可以根据您的认证而更改。
例如,如果您有一个简单的 POST
/login
端点,它接收用户名和密码参数,并且返回的会话数据必须存储在 cookie 中,您可以制作如下内容:
// cypress/support/commands.js
Cypress.Commands.add('login', () => {
cy.request('POST', `${Cypress.env('apiUrl')}/users/login`, {
username: Cypress.env('userEmail'),
password: Cypress.env('userPassword'),
}).then((response) => {
cy.setCookie('sessionId', response.body.sessionId)
cy.setCookie('userId', response.body.userId)
cy.setCookie('userName', response.body.userName)
})
})
在您的测试或
beforeEach
测试中:
...
it('start cycle', () => {
cy.login()
// cy.get("#cycles-library > ul > #library-item-2").click();
// cy.get("#create-cycle").click()
// cy.get("#startDate > label").first().click()
// cy.get("#duration > label").first().click()
// cy.get('#groups-input').click()
// cy.get("body>div").last().contains('group 2').click()
// cy.get("button#create-cycle").click()
})
...
我建议您存根每个具体要求 ,拥有来自应用程序的所有请求/响应的列表,然后用它来测试您的后端。这使得事情变得更快、更容易。
Pact 使用这个策略,但你不一定需要使用 Pact,只需保持你的测试数据同步以测试后端和前端,否则即使你的 CI 通过了,事情也会在生产中崩溃,一个单一仓库可以帮忙。