Классы эквивалентности
Раз перебрать всё нельзя, нужен способ выбирать. Самый первый и самый полезный называется классы эквивалентности, и идея у него простая: значения, с которыми программа поступает одинаково, достаточно проверить одним из них.
| Поле | Классы | Что берём |
|---|---|---|
| возраст от 18 до 65 | меньше / внутри / больше | 10, 30, 80 |
| количество от 1 до 10 | 0 и меньше / 1–10 / больше 10 | 0, 5, 15 |
| файл | нужного вида / чужого вида / пустой | три файла |
Поле «возраст» принимает сто с лишним значений, но поведения у него три: отказать как слишком молодому, принять, отказать как слишком старому. Проверив 30, вы проверили и 31, и 44 — программа не различает их ничем.
Важная оговорка: классы выделяет человек, и в этом вся работа. Формула не подскажет, что у поля «страна» есть отдельное поведение для стран без почтового индекса, — это знание о предмете. Пропущенный класс даёт дыру, которую не видно: проверки зелёные, а поведение не проверялось вовсе.
Границы
Вторая техника идёт в паре с первой и почти всегда даёт находки. Ошибки живут на границах классов — там, где «больше» путают с «не меньше», а счёт начинают с нуля вместо единицы.
| Граница | Что берут | Что ловят |
|---|---|---|
| нижняя, 18 | 17, 18, 19 | принимает ли ровно 18 |
| верхняя, 65 | 64, 65, 66 | отсекает ли 66 и принимает ли 65 |
| длина строки 8–32 | 7, 8, 32, 33 | лишний плюс-минус один |
Почему именно там. Граница — это место, где в коде стоит сравнение, а сравнений четыре вида: больше, больше или равно, меньше, меньше или равно. Ошибиться в одном знаке легко, и ошибка сдвигает поведение ровно на одно значение — то самое, которое в середине класса никогда не встретится.
Практическое правило: на каждую границу берут три значения — до, ровно, после. Для диапазона границ две, то есть шесть проверок. Это дороже трёх представителей классов, но находки здесь бывают почти всегда, а в середине класса — почти никогда.
Как собрать набор
Третье — как две техники складываются в набор проверок и где проходит разумная граница.
| Шаг | Что делают |
|---|---|
| выписать поля и условия | что вообще участвует в поведении |
| разбить каждое на классы | группируем по поведению программы |
| взять по представителю | один на класс |
| добавить границы | до, ровно, после на каждую |
| убрать дубли | одна проверка может закрыть два класса |
Последний шаг экономит больше всего. Одна проверка часто закрывает сразу несколько классов: заполнив форму с возрастом 18 и количеством 1, вы проверили обе нижние границы одним действием. Это законно ровно до тех пор, пока ожидаемый результат остаётся один — если два условия дают разные ошибки, совмещать их нельзя, вы увидите только первую.
И про меру. Техники дают кандидатов, а не приговор: из полученного списка берут то, что успевают, начиная с наиболее рискованного. Рискованное — это там, где ошибка дороже (деньги, доступ, потеря данных) и где менялся код.
И общий смысл урока: после этих двух техник вы отвечаете на вопрос «почему проверял именно это» — словами, а не «мне показалось». Этот ответ и отличает работу от перебора наугад.