Справочник тестировщика: типы JSON и OpenAPI, их форматы и что с ними проверять
⬇ Скачать PDFЛюбой ответ API — это JSON, а в JSON всего шесть типов:
| Тип | Пример |
|---|---|
string | "John" |
number | 25.5 |
object | { "id": 1 } |
array | [1, 2, 3] |
boolean | true |
null | null |
OpenAPI уточняет их через ключевые слова: integer — целое, format — подтип (дата, uuid, email…), а также ограничения: minimum, maxLength, pattern, enum и другие. Типы полей описаны в документации — это часть контракта API, и каждое отклонение от них — баг.
"name": "John Doe"
date — дата: "2026-08-23"date-time — дата и время: "2026-08-23T12:00:00Z"email, uuid, uri, ipv4, hostname — по соответствующим стандартам"John Doe" // валидно "" // пустая строка — допустима ли по доке? "John123" // цифры, если pattern только буквы " John " // пробелы по краям — триммит ли сервер? "John" O'Neil" // кавычки внутри — экранирование "aaaaaaaa…(300 симв.)" // превышение maxLength "Иван Петров" // другая раскладка/юникод
minLength / maxLength — пустая строка, 1 символ, граница, превышениеpattern — регулярка допустимых символов; цифры, спецсимволы, другая раскладка"age": 25
int32 — от −2 147 483 648 до 2 147 483 647int64 — от −9 223 372 036 854 775 808 до 9 223 372 036 854 775 80725 // валидно 0 // ноль — допустим ли по доке? -1 // отрицательное при minimum: 0 25.5 // дробное — не целое "25" // число строкой — классика 2147483648 // переполнение int32
minimum / maximum и значения сразу за ними"25" — классический баг типа в ответе"price": 19.99
float — одинарная точность (~7 значащих цифр)double — двойная точность (~15 значащих цифр)19.99 // валидно 19.999 // лишний знак при шаге 0.01 19,99 // запятая вместо точки -42.7 // отрицательная цена? 0.1 + 0.2 = 0.30000000000000004 // бинарная арифметика 1234567.891 // точность float: хвост потеряется 1e10 // экспоненциальная запись
multipleOf — кратность (например, шаг 0.01 для цен)"is_active": true
true // валидно false // валидно "true" // строка вместо булева 1 // число вместо булева "yes" // сервер кастует? контракт должен решать null // допустим ли null для обязательного флага
true или false, без кавычек: "true" строкой — баг"items": [ {"id": 1}, {"id": 2} ]
[] // пустой — валидный ответ, не ошибка [1, 2, 3] // элементы одного типа [1, "two", 3] // смешанные типы [1, 1, 1] // дубликаты — допустимы ли? [[1], [2]] // вложенные массивы по схеме? null // null вместо массива
items)[] — валидный ответ, когда данных нет; не ошибкаminItems / maxItems, порядок, дубликаты"user": { "id": 1, "name": "John", "email": null }
{ "id": 1, "name": "John" } // валидно {} // пустой объект без required-полей { "id": 1 } // нет обязательного name { "id": 1, "name": "John", "hack": 1 } // лишнее поле { "Name": "John", "id": 1 } // регистр ключа "user": null // null вместо объекта
required) — отсутствие обязательного поля это багadditionalProperties) — пропускает сервер или режет?"Name" и "name" — разные поля"middle_name": null
null // явный null (нет поля) // поле вообще отсутствует в ответе "" // пустая строка 0 // ноль [] // пустой массив
"", null ≠ [] — не подменяй при проверкеnullable: true или type: [string, null]"status": "active" // допустимы только: active, blocked, deleted
"active" // валидно "ACTIVE" // регистр "unknown" // значение вне списка "" // пустая строка null // null вместо enum
"ACTIVE" не должен проходить, если задокументирован нижний"created_at": "2026-08-23T12:00:00Z"
"2026-08-23" // дата "2026-08-23T12:00:00Z" // UTC (суффикс Z) "2026-08-23T15:00:00+03:00" // со смещением таймзоны "2026-08-23T12:00:00.123Z" // миллисекунды "23.08.2026" // локальный формат вместо ISO "2026-13-45" // невалидные месяц и день "2025-02-29" // 29 февраля в невисокосный год
YYYY-MM-DDTHH:MM:SSZZ (UTC) или смещение +03:00"id": "550e8400-e29b-41d4-a716-446655440000"
"550e8400-e29b-41d4-a716-446655440000" // валидный UUID v4 "550e8400" // слишком короткий "550e8400-e29b-41d4-a716-44665544000G" // буква G — не hex "550e8400e29b41d4a716446655440000" // без дефисов null // null вместо id
oneOf — ровно одна из схемanyOf — хотя бы одна из схемallOf — все схемы одновременноВстречаются в сложных ответах: поле может быть строкой ИЛИ объектом. Проверяй все ветви каждой комбинации.
Документация описывает не только методы, но и типы каждого поля. Любое отклонение — баг.
Больше полезного про тестирование — в телеграм-канале @eddytester.