Классы эквивалентности и граничные значения
На прошлой лекции мы узнали, что тестирование — это проверка программы на соответствие требованиям. Но как выбрать, какие именно проверки делать? Если тестировать все возможные числа, уйдёт целая жизнь.
Сегодня мы изучим два главных метода, которые позволяют сократить количество тестов, не теряя в качестве. Это классы эквивалентности и граничные значения. Их должен знать каждый разработчик.
План лекции
Сегодня мы разберём два метода тест-дизайна, которые используются в 90% проектов.
- 1 Проблема «бесконечного» тестирования
- 2 Что такое класс эквивалентности
- 3 Как выделять классы эквивалентности
- 4 Валидные и невалидные классы
- 5 Пример: тестирование возраста
- 6 Что такое граничные значения
- 7 Почему границы — самое важное
- 8 Пример: тестирование диапазона
- 9 Комбинирование методов
- 10 Типичные ошибки
- 11 Итоги и практика
Проблема «бесконечного» тестирования
Представьте, что у нас есть функция сложения двух целых чисел. Диапазон допустимых значений — от -2 147 483 648 до 2 147 483 647.
4 294 967 296 × 4 294 967 296 = 18 446 744 073 709 551 616
Это 18 квинтиллионов комбинаций. Даже если проверять по одной комбинации в секунду, потребуется более 500 миллиардов лет.
Что такое класс эквивалентности
Класс эквивалентности (equivalence class) — это группа входных данных, которые программа должна обрабатывать одинаково.
Для функции сложения можно выделить такие классы:
- Оба числа положительные.
- Оба числа отрицательные.
- Одно положительное, другое отрицательное.
- Одно из чисел — ноль.
Валидные и невалидные классы
Классы эквивалентности делятся на две группы.
Данные, с которыми программа должна работать правильно. Например, числа в допустимом диапазоне.
Данные, которые программа должна отвергать с сообщением об ошибке. Например, буквы вместо цифр или числа вне диапазона.
Пример: тестируем возраст
Допустим, у нас есть функция, которая принимает возраст человека. Требование: возраст от 0 до 120 лет.
Выделяем классы эквивалентности
-5, 25, 150. Если все три пройдены — функция работает для всех значений из этих классов.
Что такое граничные значения
Граничное значение (boundary value) — это значение на границе диапазона. Именно там чаще всего возникают ошибки.
Для диапазона 0 ≤ age ≤ 120 граничные значения:
Почему границы — самое важное
Статистика говорит: большинство ошибок в программах возникает именно на границах диапазонов.
ошибок возникает на границах и «почти на границах» значений.
достаточно проверить, чтобы покрыть границу: минимум, максимум и «чуть-чуть за».
< и >, когда нужно нестрогое <= и >= (или наоборот). Это классическая ошибка «на единицу» (off-by-one).
Пример: тестируем диапазон
Функция принимает оценку от 1 до 5. Нужно проверить, что она работает правильно.
Шаг 1. Выделяем классы эквивалентности
Шаг 2. Добавляем граничные значения
Комбинирование методов
На практике классы эквивалентности и граничные значения используют вместе.
Граничные значения отвечают на вопрос «где искать ошибки в первую очередь?».
Пример: тестируем деление
Функция деления a / b. Делитель b не должен быть равен нулю.
Классы эквивалентности для b
Граничные значения
Типичные ошибки новичков
Забывают про невалидные классы. А именно там чаще всего прячутся баги.
Проверяют только середину диапазона. А ошибки — на краях.
Считают, что
0 ≤ age ≤ 120 — это то же самое, что 0 < age < 120. Это не так.Ноль — это особое значение. Он часто ведёт себя не так, как другие числа.
Если программа должна принимать отрицательные числа, это нужно проверить.
Практическое задание
Примените методы на практике.
Задание 1
Для функции «скидка на покупку от 1000 до 5000 рублей» выделите классы эквивалентности и граничные значения.
Задание 2
Для функции «пароль длиной от 8 до 20 символов» составьте минимальный набор тестов.
Задание 3
Почему для функции деления важно проверить именно b = 0? Что произойдёт, если этого не сделать?
Шпаргалка
Сохраните этот слайд — здесь все основные понятия лекции.
Итоги лекции
Подведём итоги. Вот что вы теперь знаете.
- ✅ Тестировать всё невозможно. Нужно выбирать представителей.
- ✅ Класс эквивалентности — группа значений, обрабатываемых одинаково.
- ✅ Классы бывают валидные (допустимые) и невалидные (недопустимые).
- ✅ Граничные значения — значения на границе диапазона. Там чаще всего возникают ошибки.
- ✅ Методы комбинируются: сначала классы, потом границы.
- ✅ Ошибка «на единицу» — классическая проблема, которую ловят граничные значения.
Домашнее задание
Задания для самостоятельной работы. Первые два обязательны, остальные — для оценки «отлично».
- Для функции «возраст от 18 до 65 лет» выделите классы эквивалентности и граничные значения.
- Для функции «оценка от 1 до 5» составьте полный набор тестов (классы + границы).
- Объясните своими словами, почему граничные значения важнее, чем проверка «середины» диапазона.
- Приведите пример ошибки «на единицу» из реальной жизни.
- Найдите в интернете пример бага, который был найден именно с помощью граничных значений.
Что дальше?
В этом блоке по тестированию у нас ещё несколько материалов.
- Лекция 3: тест-кейсы, чек-листы, баг-репорты.
- Практика 1: тестирование калькулятора «чёрным ящиком».
- Практика 2: модульное тестирование в Visual Studio (C#) или pytest (Python).
Спасибо за внимание!
📏
Хороший тестировщик — это «ленивый» тестировщик
Он не проверяет всё подряд. Он выбирает умные тесты, которые находят максимум ошибок за минимум времени.