Загрузка данных из JSON-файлов

Cypress предоставляет удобные инструменты для работы с данными в формате JSON, что позволяет хранить тестовые данные отдельно от тестового кода и динамически подгружать их при выполнении тестов. Использование JSON-файлов улучшает читаемость тестов и облегчает поддержку больших наборов данных.


Подключение JSON-файлов

Для загрузки данных из JSON-файлов используется команда cy.fixture(). По умолчанию Cypress ищет файлы в папке cypress/fixtures. Пример базового подключения:

cy.fixture('user.json').then((user) => {
  cy.log(user.name)
  cy.log(user.email)
})

Ключевые моменты:

  • Расширение .json можно опустить, Cypress автоматически его подставляет.
  • Метод возвращает объект, соответствующий структуре JSON-файла.
  • Доступ к данным осуществляется через колбэк-функцию .then().

Использование JSON в тестах

JSON-файлы часто применяются для хранения:

  • Тестовых учетных данных
  • Параметров формы
  • Конфигураций API-запросов

Пример теста с использованием данных из JSON:

describe('Тестирование формы логина', () => {
  it('Вводит данные из JSON', () => {
    cy.fixture('credentials').then((creds) => {
      cy.get('#username').type(creds.username)
      cy.get('#password').type(creds.password)
      cy.get('button[type="submit"]').click()
      cy.url().should('include', '/dashboard')
    })
  })
})

Здесь JSON-файл credentials.json может выглядеть так:

{
  "username": "testuser",
  "password": "password123"
}

Доступ к данным через before и beforeEach

Чтобы избежать повторного вызова cy.fixture() в каждом тесте, данные можно загружать один раз в хуке before:

let userData;

before(() => {
  cy.fixture('user').then((data) => {
    userData = data
  })
})

it('Проверка имени пользователя', () => {
  cy.get('#user-name').should('contain', userData.name)
})

Преимущества:

  • Данные загружаются один раз перед выполнением всех тестов.
  • Уменьшается количество асинхронных вызовов.
  • Улучшается читаемость тестов.

Работа с вложенными структурами

JSON может содержать сложные структуры: массивы объектов, вложенные объекты. Обращение к ним выполняется стандартными способами:

cy.fixture('products').then((products) => {
  products.items.forEach((item) => {
    cy.log(item.name)
    cy.log(item.price)
  })
})

Пример JSON-файла:

{
  "items": [
    { "name": "Laptop", "price": 1200 },
    { "name": "Smartphone", "price": 800 }
  ]
}

Для удобства Cypress поддерживает работу с Lodash-подобными методами для фильтрации и поиска объектов:

cy.fixture('products').then((products) => {
  const expensive = products.items.find(item => item.price > 1000)
  cy.log(expensive.name)
})

Использование JSON для тестов API

JSON-файлы часто применяются для передачи данных в POST-запросах API:

cy.fixture('newUser').then((user) => {
  cy.request({
    method: 'POST',
    url: '/api/users',
    body: user
  }).then((response) => {
    expect(response.status).to.eq(201)
  })
})

Такой подход обеспечивает повторяемость тестов и позволяет легко менять набор данных без изменения тестового кода.


Динамическая подстановка данных

Можно комбинировать данные из JSON с динамически сгенерированными значениями:

cy.fixture('user').then((user) => {
  const updatedUser = {
    ...user,
    email: `test+${Date.now()}@example.com`
  }
  cy.log(updatedUser.email)
})

Преимущества:

  • Позволяет создавать уникальные данные для каждого прогона теста.
  • Минимизирует конфликты при многократном выполнении тестов с одинаковыми значениями.

Синхронный доступ к JSON через require

Для случаев, когда асинхронная загрузка через cy.fixture() неудобна, можно использовать стандартный Node.js метод require:

const user = require('../. ./fixtures/user.json')
cy.log(user.name)

Отличия от cy.fixture():

  • Данные загружаются синхронно при выполнении теста.
  • Не работает в контексте браузерного выполнения, только в Node.js.
  • Подходит для статичных данных, не зависящих от тестового процесса.

Советы по организации JSON-файлов

  • Структурирование по функционалу: создавать отдельные файлы для пользователей, продуктов, конфигураций API.
  • Унификация формата: использовать одинаковый стиль ключей и вложенности.
  • Разделение статических и динамических данных: хранить шаблоны данных в JSON, уникальные значения генерировать внутри теста.

Использование JSON-файлов в Cypress обеспечивает гибкость и масштабируемость тестов, упрощает поддержку большого объема данных и позволяет строить надежные и повторяемые сценарии для веб-приложений и API.