> Как работать с JSON в автотестах (JavaScript)
Уровень: senior · Роль: qa · Категория: Технические вопросы
Компании: DCloud, Merlion
Стек: JavaScript
> Пример ответа
Короткий ответ
В автотестах JSON используется для передачи данных между сервисами, конфигурации тестов и проверки ответов API. Основная работа включает парсинг (JSON.parse), сериализацию (JSON.stringify), валидацию схем (Joi, Ajv), сравнение объектов и извлечение значений через dot-нотацию или lodash. Важно учитывать типы данных, null-значения и структуру вложенных объектов. Для динамических данных применяют шаблонизацию или фабрики.
Подробное объяснение
JSON - основной формат обмена данными в REST API. В автотестах с ним работают на нескольких уровнях:
-
Парсинг и сериализация:
JSON.parse()преобразует строку в объект,JSON.stringify()- обратно. Это база для работы с ответами сервера и тестовыми данными. -
Валидация схем: библиотеки вроде Joi, Ajv или JSON Schema проверяют структуру ответа - типы полей, обязательность, допустимые значения. Это заменяет точечные проверки каждого поля.
-
Сравнение объектов: глубокое сравнение (deep equal) через
assert.deepStrictEqualили chaiexpect(response).to.deep.equal(expected). Важно учитывать порядок ключей (в JSON объекты неупорядочены, но в JavaScript порядок сохраняется). -
Извлечение данных: для вложенных структур используют lodash
_.get(response, 'user.address.city')или деструктуризацию. Это удобно при проверке конкретных полей в больших ответах. -
Работа с динамическими данными: даты, ID, токены - их генерируют на лету или заменяют через шаблоны (faker, chance). Для тестовых данных часто применяют фабрики (factory-girl) или фикстуры.
-
Обработка ошибок: 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.
Пример кода
JAVASCRIPTconst { 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);// Тест APIdescribe('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
- Использование
==вместо глубокого сравнения - не работает для вложенных объектов
> Похожие задачи по qa
Что проверяют юнит тесты
Как смотреть логи мобильного приложения и какими способами?
Был ли у вас опыт работы с JSON?
Можно ли вложить XML в JSON и JSON в XML
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью