Как ответить
Тест-дизайн — это этап создания тестов, где мы выбираем такие входные данные, которые с максимальной вероятностью найдут ошибки при минимальном количестве проверок. Для разработчика эти техники важны при написании модульных (unit) тестов, чтобы не проверять всё подряд, а покрыть критические сценарии и логические ветвления.
Основные техники, которые я использую в работе:
- Эквивалентное разделение. Мы разбиваем все возможные входные данные на группы (классы), где система должна вести себя одинаково. Вместо того чтобы проверять ввод чисел от 1 до 100, достаточно взять одно число из этого диапазона, например 42. Если тест проходит для него, мы считаем, что он пройдет и для остальных.
- Анализ граничных значений. Ошибки чаще всего возникают на границах диапазонов. Если условие
if (age >= 18), нужно проверить значения 17, 18 и 19. Это позволяет выловить типичные ошибки с операторами сравнения (например, использование > вместо >=). - Таблица принятия решений (Decision Table). Помогает, когда логика зависит от комбинации нескольких условий. Мы рисуем таблицу, где в строках — условия, а в столбцах — действия. Это исключает риск забыть редкое сочетание факторов.
- Попарное тестирование (Pairwise). Если у нас много параметров, количество комбинаций растет экспоненциально. Статистика показывает, что большинство багов вызывается сочетанием максимум двух факторов. Pairwise позволяет сократить тысячи тестов до десятков, проверяя все пары значений.
- Предугадывание ошибки (Error Guessing). Это неформальный метод, основанный на опыте. Разработчик проверяет специфические кейсы: пустую строку, null, деление на ноль или передачу спецсимволов в SQL-запрос.
Пример применения границ и эквивалентности на Java:
// Метод рассчитывает скидку: 10% если сумма > 1000
public double calculateDiscount(double amount) {
if (amount <= 0) throw new IllegalArgumentException();
return amount > 1000 ? amount * 0.1 : 0;
}
// Тест-кейсы:
// 1. Граница: 1000 (скидка 0)
// 2. Граница: 1000.01 (скидка есть)
// 3. Эквивалентный класс (валидный): 500 (скидка 0)
// 4. Эквивалентный класс (ошибка): -5 (exception)
Использование этих техник помогает избежать избыточности: тесты выполняются быстрее, их легче поддерживать, а покрытие кода остается высоким.