> Как работать с JSON в автотестах (JavaScript)

Уровень: senior · Роль: qa · Категория: Технические вопросы

Компании: DCloud, Merlion

Стек: JavaScript

> Пример ответа

Короткий ответ

В автотестах JSON используется для передачи данных между сервисами, конфигурации тестов и проверки ответов API. Основная работа включает парсинг (JSON.parse), сериализацию (JSON.stringify), валидацию схем (Joi, Ajv), сравнение объектов и извлечение значений через dot-нотацию или lodash. Важно учитывать типы данных, null-значения и структуру вложенных объектов. Для динамических данных применяют шаблонизацию или фабрики.

Подробное объяснение

JSON - основной формат обмена данными в REST API. В автотестах с ним работают на нескольких уровнях:

  1. Парсинг и сериализация: JSON.parse() преобразует строку в объект, JSON.stringify() - обратно. Это база для работы с ответами сервера и тестовыми данными.

  2. Валидация схем: библиотеки вроде Joi, Ajv или JSON Schema проверяют структуру ответа - типы полей, обязательность, допустимые значения. Это заменяет точечные проверки каждого поля.

  3. Сравнение объектов: глубокое сравнение (deep equal) через assert.deepStrictEqual или chai expect(response).to.deep.equal(expected). Важно учитывать порядок ключей (в JSON объекты неупорядочены, но в JavaScript порядок сохраняется).

  4. Извлечение данных: для вложенных структур используют lodash _.get(response, 'user.address.city') или деструктуризацию. Это удобно при проверке конкретных полей в больших ответах.

  5. Работа с динамическими данными: даты, ID, токены - их генерируют на лету или заменяют через шаблоны (faker, chance). Для тестовых данных часто применяют фабрики (factory-girl) или фикстуры.

  6. Обработка ошибок: JSON.parse может выбросить исключение при невалидном JSON - это нужно обрабатывать в тестах. Также проверяют корректность Content-Type и кодировки.

На практике

В реальных проектах JSON в автотестах используется так:

  • Конфигурация тестов: параметры окружения, credentials, URL хранятся в JSON-файлах. Их читают через require или fs.readFileSync.
  • Тестовые данные: наборы входных данных для параметризованных тестов - массивы JSON-объектов.
  • API-тесты: отправка JSON в теле запроса и проверка JSON-ответа. Часто используют chai-json-schema или supertest с встроенной поддержкой JSON.
  • Снапшот-тестирование: сохранение эталонного JSON-ответа и сравнение с актуальным (jest snapshot).
  • Логирование: запись результатов тестов в JSON для последующего анализа.

Важный нюанс - JSON не поддерживает функции, undefined и циклические ссылки. При сериализации объектов с методами они теряются. Для сложных структур используют библиотеки вроде flatted или custom replacer.

Пример кода

JAVASCRIPT
const { expect } = require('chai');
const Ajv = require('ajv');
const _ = require('lodash');
// Валидация схемы ответа
const schema = {
type: 'object',
required: ['id', 'name', 'email'],
properties: {
id: { type: 'number' },
name: { type: 'string', minLength: 1 },
email: { type: 'string', format: 'email' }
}
};
const ajv = new Ajv();
const validate = ajv.compile(schema);
// Тест API
describe('User API', () => {
it('should return valid user', async () => {
const response = await fetch('/api/users/1');
const data = await response.json();
// Проверка схемы
expect(validate(data)).to.be.true;
// Извлечение вложенного поля
const city = _.get(data, 'address.city');
expect(city).to.be.a('string');
// Сравнение с ожидаемым объектом
const expected = {
id: 1,
name: 'John',
email: 'john@example.com'
};
expect(data).to.deep.include(expected);
});
});

Как отвечать на собеседовании

Начни с практического применения: как парсишь JSON в тестах, какие библиотеки используешь для валидации. Приведи примеры из реального проекта - как обрабатываешь динамические данные, null-поля, вложенные структуры. Упомяни trade-off между точечными проверками и валидацией схемы. Покажи понимание edge cases: большие ответы, циклические ссылки, кодировка. Если спросят про производительность - скажи, что JSON.parse быстрее eval, но для больших данных лучше использовать streaming-парсеры.

Что проверяет интервьюер

  • Понимание структуры JSON и его ограничений (отсутствие функций, undefined)
  • Знание инструментов: Joi, Ajv, chai, lodash
  • Умение выбирать между разными подходами (схема vs точечные проверки)
  • Опыт работы с динамическими данными и фикстурами
  • Навыки отладки: как искать ошибки в JSON-ответах
  • Понимание разницы между JSON и JavaScript-объектами

Типичные ошибки

  • Сравнение объектов без учета порядка ключей (в JSON объекты неупорядочены, но в JS порядок сохраняется при stringify)
  • Игнорирование null-значений - они валидны в JSON, но могут сломать проверки
  • Использование JSON.parse без try-catch - при невалидном JSON тест упадет с непонятной ошибкой
  • Жесткая привязка к конкретным значениям вместо валидации схемы - тесты ломаются при любом изменении данных
  • Забывают проверять Content-Type ответа - сервер может вернуть HTML вместо JSON
  • Использование == вместо глубокого сравнения - не работает для вложенных объектов

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью