Bird
Raised Fist0
Cypresstesting~15 mins

Why external test data improves maintainability in Cypress - Automation Benefits in Action

Choose your learning style10 modes available
Login functionality test using external test data
Preconditions (2)
Step 1: Load the test data from 'loginData.json'
Step 2: For each set of credentials in the test data:
Step 3: Enter the 'username' into the username input field with id 'username'
Step 4: Enter the 'password' into the password input field with id 'password'
Step 5: Click the login button with id 'loginBtn'
Step 6: Verify the expected result based on the 'expectedOutcome' field in the test data
✅ Expected Result: The login succeeds or fails according to the expected outcome specified in the external test data file for each set of credentials.
Automation Requirements - Cypress
Assertions Needed:
Verify URL changes to dashboard page on successful login
Verify error message is visible on failed login
Best Practices:
Use external JSON file for test data
Use data-driven testing with cy.fixture()
Use clear and maintainable selectors (id selectors)
Use Cypress commands and assertions consistently
Automated Solution
Cypress
/// <reference types="cypress" />

describe('Login Tests with External Data', () => {
  beforeEach(() => {
    cy.visit('https://example.com/login');
  });

  it('should test login with multiple credentials from external data', () => {
    cy.fixture('loginData.json').then((users) => {
      users.forEach((user) => {
        cy.get('#username').clear().type(user.username);
        cy.get('#password').clear().type(user.password);
        cy.get('#loginBtn').click();

        if (user.expectedOutcome === 'success') {
          cy.url().should('include', '/dashboard');
          // Logout to reset state for next iteration
          cy.get('#logoutBtn').click();
          cy.url().should('include', '/login');
        } else if (user.expectedOutcome === 'failure') {
          cy.get('.error-message').should('be.visible').and('contain.text', 'Invalid credentials');
        }
      });
    });
  });
});

This Cypress test uses an external JSON file named loginData.json to load multiple sets of login credentials. This approach improves maintainability because test data is separated from test logic, making it easier to update or add new test cases without changing the test code.

The beforeEach hook ensures the login page is loaded before each test iteration. The test iterates over each user in the fixture data, enters the username and password, clicks the login button, and then verifies the outcome based on the expected result from the data.

Using clear selectors like #username and #loginBtn ensures the test is easy to read and maintain. Assertions check the URL for successful login or the presence of an error message for failed login.

Resetting the state by logging out after a successful login ensures each test iteration starts fresh, preventing state leakage between tests.

Common Mistakes - 4 Pitfalls
Hardcoding test data inside the test code
Using brittle selectors like absolute XPath
Not resetting application state between test iterations
Not using Cypress commands consistently
Bonus Challenge

Now add data-driven testing with 3 different inputs including valid, invalid, and empty credentials.

Show Hint

Practice

(1/5)
1. Why is using external test data considered better for maintainability in Cypress tests?
easy
A. It separates test logic from data, making updates easier without changing code.
B. It makes tests run faster by loading data from external files.
C. It reduces the number of test cases needed.
D. It automatically fixes broken tests when data changes.

Solution

  1. Step 1: Understand separation of concerns

    External test data keeps test logic and data separate, so changing data doesn't require code edits.
  2. Step 2: Recognize maintainability benefits

    This separation makes tests easier to update and maintain over time.
  3. Final Answer:

    It separates test logic from data, making updates easier without changing code. -> Option A
  4. Quick Check:

    Separation of logic and data = easier maintenance [OK]
Hint: Separate data from code to update tests easily [OK]
Common Mistakes:
  • Thinking external data speeds up tests
  • Believing external data reduces test count
  • Assuming external data auto-fixes tests
2. Which of the following is the correct way to load external JSON test data in a Cypress test?
easy
A. cy.fixture('data.json').then((data) => { /* use data */ });
B. import data from './data.json';
C. const data = require('./data.json');
D. fetch('./data.json').then(response => response.json());

Solution

  1. Step 1: Identify Cypress method for external data

    Cypress uses cy.fixture() to load external test data files.
  2. Step 2: Confirm correct usage

    The cy.fixture('data.json').then((data) => { ... }) syntax loads and uses the data asynchronously.
  3. Final Answer:

    cy.fixture('data.json').then((data) => { /* use data */ }); -> Option A
  4. Quick Check:

    Use cy.fixture() to load external JSON data [OK]
Hint: Use cy.fixture() to load external JSON files [OK]
Common Mistakes:
  • Using require() which is not recommended in Cypress tests
  • Using import which may not work for JSON in Cypress
  • Using fetch which is not Cypress standard for fixtures
3. Given this Cypress test snippet using external data:
cy.fixture('user.json').then((user) => {
  cy.get('#username').type(user.name);
  cy.get('#password').type(user.password);
  cy.get('#login').click();
  cy.contains(user.welcomeMessage).should('be.visible');
});

What will happen if the user.json file changes the welcomeMessage text?
medium
A. The test will automatically update the app's welcome message.
B. The test will ignore the change and always pass.
C. The test will fail if the welcome message in the app does not match the new text.
D. The test will throw a syntax error.

Solution

  1. Step 1: Understand test assertion with external data

    The test checks if the app shows the welcome message from the external data file.
  2. Step 2: Effect of changing external data

    If the welcomeMessage changes in user.json, the test expects the new message in the app.
  3. Final Answer:

    The test will fail if the welcome message in the app does not match the new text. -> Option C
  4. Quick Check:

    Changed data means test expects new message [OK]
Hint: Test expects app text to match external data exactly [OK]
Common Mistakes:
  • Thinking test ignores data changes
  • Believing test auto-updates app content
  • Confusing syntax errors with data mismatches
4. You have this Cypress test code:
cy.fixture('data.json').then((data) => {
  cy.get('#email').type(data.email);
  cy.get('#submit').click();
  cy.contains('Thank you, ' + data.name).should('be.visible');
});

But the test fails because data.name is undefined. What is the most likely cause?
medium
A. The cy.fixture() method cannot load JSON files.
B. The data.json file does not have a name property.
C. The cy.contains() syntax is invalid.
D. The cy.get() selector is incorrect.

Solution

  1. Step 1: Check the undefined property cause

    If data.name is undefined, the JSON file likely lacks the name key.
  2. Step 2: Verify other code parts

    The selectors and syntax are valid; cy.fixture() loads JSON correctly in Cypress.
  3. Final Answer:

    The data.json file does not have a name property. -> Option B
  4. Quick Check:

    Undefined property means missing key in JSON [OK]
Hint: Check JSON keys if data properties are undefined [OK]
Common Mistakes:
  • Blaming selectors for undefined data
  • Assuming cy.contains() syntax error
  • Thinking cy.fixture() can't load JSON
5. You want to improve maintainability by moving test data out of your Cypress test code. Which approach best supports this goal while allowing easy updates for multiple test cases?
hard
A. Write test data directly in the Cypress commands without external files.
B. Hardcode test data inside each test to keep it close to the test steps.
C. Use inline variables inside tests and update them manually when needed.
D. Store all test data in a single external JSON file and load it with cy.fixture() in tests.

Solution

  1. Step 1: Identify maintainability best practice

    Keeping test data in a single external JSON file separates data from code and centralizes updates.
  2. Step 2: Compare with other options

    Hardcoding or inline variables mix data with code, making updates harder and error-prone.
  3. Final Answer:

    Store all test data in a single external JSON file and load it with cy.fixture() in tests. -> Option D
  4. Quick Check:

    Centralized external data = easier maintenance [OK]
Hint: Centralize data in one external file for easy updates [OK]
Common Mistakes:
  • Hardcoding data inside tests
  • Using inline variables for all data
  • Ignoring external files for test data
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard