Preserving state between tests in Cypress - Build an Automation Script
describe('Preserve user login state between tests', () => { before(() => { // Log in once before all tests cy.visit('https://example.com/login'); cy.get('#username').type('testuser'); cy.get('#password').type('Test@1234'); cy.get('#loginBtn').click(); cy.url().should('eq', 'https://example.com/dashboard'); // Save cookies/local storage to preserve session cy.getCookies().then(cookies => { Cypress.Cookies.preserveOnce(...cookies.map(c => c.name)); }); }); beforeEach(() => { // Preserve cookies before each test to keep session Cypress.Cookies.preserveOnce('session_id', 'auth_token'); }); it('should show username on profile page', () => { cy.visit('https://example.com/profile'); cy.contains('testuser').should('be.visible'); }); it('should remain logged in after page reload', () => { cy.visit('https://example.com/profile'); cy.reload(); cy.contains('testuser').should('be.visible'); }); });
The before() hook logs in the user once before all tests run. It visits the login page, enters credentials, clicks login, and verifies the dashboard URL.
After login, it saves cookies to preserve the session. The beforeEach() hook preserves important cookies like session_id and auth_token before each test to keep the user logged in.
The first test visits the profile page and checks that the username testuser is visible, confirming the user is logged in.
The second test reloads the profile page and verifies the username is still visible, confirming the login state is preserved after reload.
This approach avoids logging in before every test and uses Cypress best practices for session preservation.
Now add data-driven testing with 3 different user accounts to verify login state preservation for each.
Practice
Solution
Step 1: Understand test state preservation
Preserving state means keeping some data like cookies so tests don't repeat setup steps.Step 2: Identify the benefit
Keeping state avoids repeating login or setup, making tests faster and more efficient.Final Answer:
To avoid repeating login steps and speed up test execution -> Option CQuick Check:
Preserving state = faster tests [OK]
- Thinking tests should be dependent on each other
- Believing preserving state clears cookies
- Assuming preserving state disables assertions
Solution
Step 1: Recall Cypress cookie preservation method
The correct method to preserve cookies once isCypress.Cookies.preserveOnce.Step 2: Match method and argument
The method takes the cookie name as a string argument, e.g., 'session_id'.Final Answer:
Cypress.Cookies.preserveOnce('session_id') -> Option AQuick Check:
Preserve once = Cypress.Cookies.preserveOnce [OK]
- Using cy.preserveCookie which does not exist
- Mixing method names like preserveCookieOnce
- Calling preserve on cy.Cookies which is invalid
describe('Test Suite', () => {
beforeEach(() => {
Cypress.Cookies.preserveOnce('token')
})
it('Test 1: Set cookie', () => {
cy.setCookie('token', 'abc123')
})
it('Test 2: Check cookie', () => {
cy.getCookie('token').should('have.property', 'value', 'abc123')
})
})Solution
Step 1: Analyze cookie preservation in beforeEach
ThebeforeEachhook preserves the 'token' cookie between tests usingCypress.Cookies.preserveOnce('token').Step 2: Understand cookie setting and checking
Test 1 sets the cookie 'token' to 'abc123'. Test 2 checks the cookie value. Since the cookie is preserved, the check passes.Final Answer:
Test 2 fails because cookies are cleared between tests -> Option BQuick Check:
PreserveOnce keeps cookie for next test [OK]
- Assuming cookies clear automatically between tests
- Thinking preserveOnce clears cookies
- Confusing syntax causing errors
beforeEach(() => {
Cypress.Cookies.preserveOnce('auth_token')
})
it('Login test', () => {
cy.setCookie('auth_token', 'xyz789')
})
it('Dashboard test', () => {
cy.getCookie('auth_token').should('exist')
})What is the likely cause of the failure?
Solution
Step 1: Understand when preserveOnce runs
ThebeforeEachhook runs before each test, so it preserves cookies existing before the test starts.Step 2: Analyze cookie setting timing
The cookie is set inside the first test, afterbeforeEachruns, so it is not preserved for the next test.Final Answer:
The cookie is set after the beforeEach hook runs, so it is not preserved -> Option AQuick Check:
PreserveOnce must run after cookie set [OK]
- Thinking preserveOnce preserves cookies set during the test
- Assuming Cypress can't preserve cookies
- Blaming assertion syntax instead of timing
Solution
Step 1: Understand preserving multiple cookies globally
UsingCypress.Cookies.defaultswith a preserve array keeps specified cookies across all tests automatically.Step 2: Compare with other options
Calling preserveOnce in every test is repetitive. Manually setting cookies each time is inefficient. Disabling cookie clearing globally is not recommended.Final Answer:
Use Cypress.Cookies.defaults({ whitelist: ['token', 'user_id'] }) in support file -> Option DQuick Check:
Defaults preserve multiple cookies globally [OK]
- Calling preserveOnce repeatedly instead of defaults
- Manually resetting cookies each test
- Trying to disable cookie clearing globally
Ready to prove it?
Pass the test and this pattern moves unknown
