Прежде чем перейти к статье, хочу вам представить, экономическую онлайн игру Brave Knights, в которой вы можете играть и зарабатывать. Регистируйтесь, играйте и зарабатывайте!
Привет, Хабр! Наша компания создает множество полезных программ и сервисов, в том числе для автоматизации работы с данными граждан. Сегодня расскажем вам о том, как у нас тестируются сложные API формы и как мы справились с основными проблемами в автоматизации их тестирования.
Пример
Для системы записи ребенка в некой школе требуется передать его данные по API в виде структуры JSON, вида:
{“surname”: “Соколов”,
“name”: “Артур”,
“patronymic”: “Сергеевич”,
“birthdate”: “2008-06-26”,
“gender”: “m”,
“birth_no”: “XX-МЯ 123456‘:
“pass_no”: “4432123456”}
Для первичной проверки на каждое поле наложены ограничения (мы сильно сократили пример, так как нужно описать суть проблем, а не напугать читателя):
Фамилия “surname”
Буквы русского алфавита, римские цифры, дефис и апостроф
1-50 символов
Обязательное
Возможные ошибки:
Фамилия может содержать только: буквы русского алфавита, римские цифры, дефис и апостроф
Фамилия не должна быть длиннее 50 символов
Фамилия обязательна для заполнения
Имя “name”:
Буквы русского алфавита, римские цифры, дефис, апостроф
1-50 символов
Обязательное
Возможные ошибки:
Имя может содержать только: буквы русского алфавита, римские цифры, дефис и апостроф
Имя не должно быть длиннее 50 символов
Имя обязательно для заполнения
Отчество “patronymic”:
Буквы русского алфавита, римские цифры, дефис, апостроф
1-50 символов
Не обязательное
Возможные ошибки:
Отчество может содержать только: буквы русского алфавита, римские цифры, дефис и апостроф
Отчество не должно быть длиннее 50 символов
Дата рождения “birthdate”:
Дата в формате ГГГГ-ММ-ДД
Ребенок не может быть старше 18 лет
Обязательное
Возможные ошибки:
Дата рождения должна быть в формате ГГГГ-ММ-ДД
Ребенок не может быть старше 18 лет
Дата рождения обязательна для заполнения
Пол “gender”:
Символ m или f
Не обязательное
Возможные ошибки:
Пол может содержать только: символ m или f
Номер свидетельства о рождении “birth_no”:
Cтрока вида Х-ЯЯ 000000, где Х - римское число, подстрока длиной от 1 до 7, содержащая любые из следующих латинских букв: I, V, X, L, C, D, M; Я - любая русская буква, 0 - любая цифра
11-17 символов
Обязательно для детей младше 14 лет
Возможные ошибки:
Неверно заполнен номер свидетельства о рождения
Номер свидетельства о рождении обязателен для заполнения
Серия и номер паспорта “pass_no”:
Только цифры
10 символов
Обязательно для детей старше 14 лет
Отсутствует у детей младше 14 лет
Возможные ошибки:
Неверно заполнены серия и номер паспорта
Серия и номер паспорта обязательны для заполнения
Серия и номер паспорта должны отсутствовать для ребенка младше 14 лет
Если ограничение не соблюдается, в ответе от системы мы должны получить ошибку для конкретного поля, например: “Пол может содержать только: символ m или f”. Если данные корректны: “Данные сохранены”
Проблема первая. Тестовые данные не увеличивают вероятность обнаружения дефекта
Давайте проанализируем поле «Фамилия» и ответим на вопросы: Какие значения мы можем передать? Какие из них система должна пропустить, а какие нет?
Представим все возможные значения этого поля в виде множества. Так как тестируем мы API форму, то это множество практически ничем не ограничено, так что будем считать его стремящимся к бесконечности. Тестируемый сервис из всего этого множества должен пропустить строку, содержащую только буквы русского алфавита, римские цифры, дефис и апостроф, размером от 1 до 50 символов. Все возможные вариации этой строки назовем искомыми.
Наши тесты будут делиться на два типа: заведомо верные (мы передали значение, входящее в искомое подмножество) и заведомо ложные (мы передали значение, заведомо не входящее в подмножество). К заведомо ложным значениям отнесем еще и пустое множество, так как поле обязательно. Можем ли мы проверить ВСЕ заведомо верные значения? Подсчитаем:
Символьная группа:
33заглавные буквы+33строчные буквы+7римских цифр+2символа+1пустота = 76 возможных символов
Количество возможных значений:
7650+ 7649+ 7648+ ... +762+76 = i=15076i
Можете сами посчитать, если будет время