> Писали ли проверки для JSON схемы, чтобы проверить наличие и порядок элементов в ответе (JavaScript)

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

Компании: DCloud

Стек: JavaScript

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

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

Да, для проверки JSON схемы в ответах API я использовал библиотеки вроде Ajv или JSON Schema Validator. Проверял не только наличие обязательных полей и их типы, но и порядок элементов в массивах через prefixItems или кастомные валидаторы. Для порядка объектов в ответе - сравнивал ключи через Object.keys() или использовал additionalProperties: false для строгой структуры. В основном это было в интеграционных тестах на Jest или Playwright.

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

JSON Schema - это стандарт описания структуры JSON-данных. Он позволяет декларативно задать:

  • обязательные поля (required)
  • типы значений (type, enum)
  • ограничения на строки, числа, массивы (minLength, maximum, minItems)
  • вложенность и структуру объектов (properties, additionalProperties)

Для проверки порядка элементов в массиве стандартная JSON Schema до draft 2020-12 не даёт прямого механизма. Но есть подходы:

  1. prefixItems (draft 2020-12) - задаёт схему для первых N элементов массива, но не контролирует порядок произвольной длины.
  2. Кастомные keywords - расширение Ajv через ajv.addKeyword(), где можно написать функцию, проверяющую порядок по заданному критерию (например, сортировку по id или дате).
  3. Отдельная проверка в тесте - после валидации схемы дополнительно сравнивать массив с ожидаемым порядком через toEqual или toStrictEqual.

Для проверки порядка ключей в объекте JSON Schema не поддерживает это нативно. Приходится либо использовать кастомный keyword, либо в тесте сравнивать Object.keys(response) с ожидаемым массивом.

На практике я чаще комбинировал: схема для типов и обязательности, а порядок - отдельной проверкой в тесте. Это проще поддерживать и читать.

На практике

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

  • Схема лежит в отдельном файле рядом с тестами, например schemas/userResponse.schema.json.
  • Валидация через Ajv с опцией allErrors: true для сбора всех ошибок.
  • Для порядка элементов в массиве - кастомный keyword orderedBy, который принимает имя поля и направление сортировки.
  • Для порядка ключей объекта - отдельная утилита expectKeysInOrder.

Это удобно, потому что схема переиспользуется и в unit-тестах, и в e2e-тестах на Playwright. Если API меняется, достаточно поправить схему в одном месте.

Пример кода

JAVASCRIPT
// schema.userResponse.js
const Ajv = require('ajv');
const ajv = new Ajv({ allErrors: true });
ajv.addKeyword({
keyword: 'orderedBy',
type: 'array',
compile: ([field, direction = 'asc']) => {
return (data) => {
for (let i = 1; i < data.length; i++) {
const prev = data[i - 1][field];
const curr = data[i][field];
if (direction === 'asc' && prev > curr) return false;
if (direction === 'desc' && prev < curr) return false;
}
return true;
};
},
});
const userListSchema = {
type: 'object',
required: ['users'],
properties: {
users: {
type: 'array',
minItems: 1,
orderedBy: ['id', 'asc'],
items: {
type: 'object',
required: ['id', 'name'],
properties: {
id: { type: 'integer' },
name: { type: 'string' },
},
additionalProperties: false,
},
},
},
additionalProperties: false,
};
// тест
const validate = ajv.compile(userListSchema);
const response = await api.getUsers();
expect(validate(response)).toBe(true);
expect(Object.keys(response)).toEqual(['users']);

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

Начни с прямого ответа - да, писал. Затем кратко опиши, какие библиотеки использовал и зачем. Упомяни ограничения стандартной JSON Schema по порядку элементов и как их обходил. Покажи, что понимаешь разницу между валидацией структуры и проверкой бизнес-логики порядка. Если спросят про порядок ключей - честно скажи, что это нестандартный кейс, и обычно решается отдельной проверкой. Приведи пример из реального проекта, если есть.

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

  • Понимание JSON Schema: обязательные поля, типы, вложенность.
  • Знание ограничений стандарта и умение их обходить.
  • Практический опыт с Ajv или аналогичными инструментами.
  • Умение писать читаемые и поддерживаемые тесты.
  • Способность объяснить trade-off между декларативной схемой и императивной проверкой.

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

  • Утверждение, что JSON Schema нативно поддерживает порядок элементов - это не так.
  • Использование additionalProperties: false без необходимости - ломает тесты при добавлении новых полей в API.
  • Проверка порядка ключей объекта через схему - стандарт это не поддерживает, попытка сделать это через propertyNames или patternProperties - хак, который сложно поддерживать.
  • Игнорирование allErrors: true - без него Ajv возвращает только первую ошибку, что усложняет отладку.
  • Хранение схем в тестах вместо отдельных файлов - усложняет переиспользование и ревью.

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

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