Answer
Cypress Fixtures
Fixtures are static test data files (JSON, CSV, images) stored in cypress/fixtures/. They decouple test data from test logic.
Fixture File Structure
CODE
cypress/
├── fixtures/
│ ├── users.json ← test user data
│ ├── products.json ← product test data
│ ├── login-valid.json ← valid login creds
│ └── login-invalid.json ← invalid login creds
├── e2e/
│ └── login.cy.js
Creating a Fixture File
JSON
// cypress/fixtures/users.json
{
"validUser": {
"email": "test@automateqa.com",
"password": "Test@123",
"name": "QA Tester"
},
"adminUser": {
"email": "admin@automateqa.com",
"password": "Admin@123",
"role": "admin"
},
"invalidUser": {
"email": "wrong@email.com",
"password": "wrongpass"
}
}
Using cy.fixture() — Method 1: Then Callback
JavaScript
describe('Login Tests', () => {
it('should login with valid user', () => {
cy.fixture('users').then((users) => {
cy.visit('/login');
cy.get('#email').type(users.validUser.email);
cy.get('#password').type(users.validUser.password);
cy.get('[data-testid="login-btn"]').click();
cy.get('.user-greeting').should('contain', users.validUser.name);
});
});
});
Using cy.fixture() — Method 2: this Alias (Cleaner)
JavaScript
describe('Login Tests', () => {
beforeEach(function() {
// Load fixture into this.users — available in all tests
cy.fixture('users').as('users');
});
it('should login with valid credentials', function() {
const { email, password } = this.users.validUser;
cy.visit('/login');
cy.get('#email').type(email);
cy.get('#password').type(password);
cy.get('[data-testid="login-btn"]').click();
cy.url().should('include', '/dashboard');
});
it('should reject invalid credentials', function() {
const { email, password } = this.users.invalidUser;
cy.visit('/login');
cy.get('#email').type(email);
cy.get('#password').type(password);
cy.get('[data-testid="login-btn"]').click();
cy.get('.error').should('be.visible');
});
});
Data-Driven Testing with Fixtures
JavaScript
// cypress/fixtures/search-terms.json
// ["Selenium", "Cypress", "Playwright", "TestNG"]
describe('Search Tests', () => {
it('should search for multiple terms', () => {
cy.fixture('search-terms').then((terms) => {
terms.forEach((term) => {
cy.visit('/');
cy.get('[data-testid="search"]').clear().type(term);
cy.get('[data-testid="search-btn"]').click();
cy.get('[data-testid="result-count"]')
.should('be.visible')
.and('not.contain', '0 results');
});
});
});
});
Intercepting API with Fixture Response (Mocking)
JavaScript
// cypress/fixtures/api-users.json
// [{"id":1,"name":"Alice","role":"QA"},{"id":2,"name":"Bob","role":"Dev"}]
it('should display users from API', () => {
cy.intercept('GET', '/api/users', { fixture: 'api-users' }).as('getUsers');
cy.visit('/users');
cy.wait('@getUsers');
cy.get('[data-testid="user-row"]').should('have.length', 2);
cy.contains('Alice').should('be.visible');
});
