What if you never had to log in again for every single test you write?
Why Preserving state between tests in Cypress? - Purpose & Use Cases
Imagine testing a website where you must log in before each test. You open the site, enter your username and password every single time manually or write repetitive steps in your test scripts.
This manual or repetitive approach is slow and boring. It wastes time and can cause mistakes if you forget a step or mistype credentials. It also makes tests fragile and hard to maintain.
Preserving state between tests means saving things like login info once and reusing it automatically. This way, tests run faster and more reliably without repeating the same setup again and again.
beforeEach(() => {
cy.visit('/login');
cy.get('#user').type('user');
cy.get('#pass').type('pass');
cy.get('#submit').click();
});before(() => {
cy.login('user', 'pass');
});
beforeEach(() => {
cy.restoreSession();
});It enables running many tests quickly and smoothly without repeating boring setup steps, making testing more efficient and fun.
Think of testing an online store where you log in once, then check your cart, order history, and profile in separate tests without logging in each time.
Manual repeated setup wastes time and causes errors.
Preserving state saves login or session info once for all tests.
This makes tests faster, simpler, and easier to maintain.
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
