Fixtures are external files (usually JSON) in cypress/fixtures that hold static test data. cy.fixture loads them so tests use consistent, versioned data and can stub network responses.
cy.fixture('user.json').then((user) => {...}) loads data for reuse across tests, keeping test bodies clean and data centralized. Fixtures pair naturally with cy.intercept for stubbing: cy.intercept('GET', '/api/user', { fixture: 'user.json' }). This decouples tests from a live backend and makes them deterministic and fast. Fixtures can also be aliased (cy.fixture('x').as('x')) and referenced later. Keep fixtures small and focused; for dynamic data, generate it in the test or via cy.request setup.
A checkout test stubs the cart API with a fixture: cy.intercept('GET', '/api/cart', { fixture: 'cart-3-items.json' }) so the UI always renders the same three items regardless of backend state.
Two tests intermittently interfere because they mutate the same shared fixture object. What's happening and how do you avoid it?