Из бесконечного числа вариантов ввода выбрать десяток, который найдёт дефект
В разделе 01 мы посчитали: проверить все варианты одного текстового поля невозможно. Техники тест-дизайна отвечают на вопрос, какие немногие варианты выбрать, чтобы они нашли почти всё, что нашёл бы полный перебор. Две самые полезные для полей ввода — классы эквивалентности и граничные значения. Обычно их применяют вместе.
Пример на весь раздел — оформление молодёжной карты в банке: «Возраст клиента — от 14 до 35 лет включительно, целое число».
Класс эквивалентности — группа значений, которые программа должна обработать одинаково. Если возраст 20 принимается, то и 25, и 30 должны приниматься — это один класс, и проверять каждое значение незачем. Достаточно одного представителя.
| Класс | Значения | Ожидаемо | Представитель |
|---|---|---|---|
| Д1 — допустимый возраст | 14…35 | карта оформляется | 25 |
| Н1 — слишком мал | …13 | отказ «от 14 лет» | 10 |
| Н2 — слишком велик | 36… | отказ «до 35 лет» | 50 |
| Н3 — не целое | 20.5, 20,5 | сообщение о формате | 20,5 |
| Н4 — не число | «двадцать», «2O» (буква O) | сообщение о формате | двадцать |
| Н5 — пусто | пустая строка, пробелы | «Укажите возраст» | (пусто) |
| Н6 — отрицательное | −1, −20 | отказ | −5 |
Д — допустимые (valid), Н — недопустимые (invalid). Допустимых классов бывает несколько: если бы для 14–17 лет требовалось согласие родителей, это был бы отдельный класс со своим ожидаемым результатом.
Как находить классы:
Классы показывают, какие значения проверять, а границы — где вероятнее дефект. Программисты чаще всего ошибаются на краях: пишут < вместо <=, считают с нуля вместо единицы. Пример из раздела 01 со скидкой «от 5000 ₽» — именно такая ошибка.
Для каждой границы проверяют значение на ней и соседнее по другую сторону:
| Граница | Значения | Ожидаемо |
|---|---|---|
| Нижняя (14) | 13 / 14 | отказ / оформляется |
| Верхняя (35) | 35 / 36 | оформляется / отказ |
Это проверка по двум точкам. При проверке по трём точкам добавляют значение с другой стороны: 13, 14, 15 и 34, 35, 36. Три точки ловят больше ошибок (например, условие «равно 14» вместо «больше или равно 14»), а стоят на две проверки дороже. В курсе по умолчанию — две точки, три — для важных полей: деньги, сроки, доступ.
Итоговый набор для поля возраста — граничные значения допустимого класса и по представителю от каждого недопустимого:
| № | Значение | Класс | Что проверяем | Ожидаемо |
|---|---|---|---|---|
| 1 | 13 | Н1 | под нижней границей | отказ «от 14 лет» |
| 2 | 14 | Д1 | нижняя граница | оформляется |
| 3 | 35 | Д1 | верхняя граница | оформляется |
| 4 | 36 | Н2 | над верхней границей | отказ «до 35 лет» |
| 5 | 20,5 | Н3 | не целое | сообщение о формате |
| 6 | двадцать | Н4 | не число | сообщение о формате |
| 7 | (пусто) | Н5 | обязательное поле | «Укажите возраст» |
| 8 | −5 | Н6 | отрицательное | отказ |
Отдельной проверки «25» нет: класс Д1 уже представлен значениями 14 и 35. Восемь проверок вместо бесконечности — и в них попадёт почти любой дефект проверки возраста.
В форме обычно несколько полей. Правило: в одной негативной проверке — одно недопустимое значение, остальные поля допустимы. Если ввести неверный возраст и неверный телефон сразу, программа может сообщить только о первой ошибке — и мы не узнаем, проверяется ли второе поле вообще.
| № | Возраст | Телефон | Ожидаемо |
|---|---|---|---|
| 1 | 14 | +7 912 345-67-89 | оформляется |
| 2 | 35 | 8 912 345-67-89 | оформляется (если 8 допустима — вопрос к требованиям) |
| 3 | 13 | +7 912 345-67-89 | отказ по возрасту |
| 4 | 25 | +7 912 345 | отказ по телефону |
| 5 | 13 | +7 912 345 | обе ошибки показаны |
Допустимые значения разных полей, наоборот, совмещают: строки 1 и 2 проверяют границы возраста и два формата телефона за две проверки, а не за четыре. Строка 5 — одна сознательная проверка «все ошибки сразу»: показывает ли форма все сообщения или только первое.
Эти классы стоит перебрать для любого поля соответствующего типа, даже если требования о них молчат:
| Тип | Классы и значения |
|---|---|
| Целое число | границы; 0; отрицательное; дробное (с точкой и с запятой); очень большое (99999999999); не число; ведущие нули (007); пробелы вокруг |
| Строка | длина на границах (0, 1, max, max+1); только пробелы; пробелы по краям; кириллица и латиница; заглавные и строчные; спецсимволы ' " < > % _ ; \; эмодзи; очень длинная (10 000 символов) |
| Дата | вчера, сегодня, завтра; 29 февраля в високосный и обычный год; 31-е число в 30-дневном месяце; конец года; формат (01.02.2026 и 2026-02-01); дата далеко в будущем или в прошлом |
| Обязательное поле | пусто; только пробелы; поле удалено из запроса (это проверяют через API, раздел 09) |
| Уникальное значение | уже существующее; то же в другом регистре; то же с пробелом в конце |
| Выбор из списка | каждый вариант; значение не из списка (подменяется через инструменты разработчика или API) |
Строка «пробелы по краям» и «другой регистр» — частые источники дефектов уникальности: ivan и Ivan для человека одно и то же, для программы — нет, если её не научили.
Граница есть везде, где в требованиях есть число или условие:
Пустой список и один элемент — отдельные классы почти для любой функции, которая что-то показывает или считает: на них часто ломаются счётчики, заголовки и скрипты страницы.
Результат техники — таблица из п. 04: значение, класс, что проверяем, ожидаемый результат. Её можно сдать как есть или превратить в тест-кейсы. Для полей ввода удобен один тест-кейс на поле с таблицей данных: шаги одинаковые, меняется только значение. В шаблоне тест-кейсов техника записывается в столбец «Техника» — «классы», «граничные».
Перед прогоном перечитайте ожидаемые результаты: «отказ» — это какое сообщение и где? Если в требованиях текста нет, пишите «сообщение об ошибке, задача не создана» — и проверяйте оба признака.