В тестировании существует аксиома, что дефекты, скорее всего, могут быть найдены на границах двух классов эквивалентности. Эти значения — "последнее" одного класса эквивалентности и "первое" следующего класса эквивалентности — называются граничными значениями (boundary values). Значения, которые не являются граничными, называют внутренними значениями (interior values). Например, рассмотрим очень простую математическую функцию, в которой вычисляется абсолютная величина целого значения. У нее есть два класса эквивалентности:
1. [MININT, MININT + 1, ..., –2, –1] → для входного значения x на выходе получим –(x).
2. [0, 1, ..., MAXINT – 1, MAXINT] → для входного значения x на выходе получим x.
Граничные значения здесь — это –1 и 0; они являются разделительной линией между двумя классами эквивалентности. Любое другое значение (например, 7, 62, –190) будет внутренним, окажется "в середине" класса эквивалентности.
Теперь, когда мы понимаем, что такое граничные и внутренние значения, можно задаться вопросом: почему случай с использованием граничных значений более вероятно окажется дефектным? Причина в том, что более вероятно, что в коде окажется ошибка на граничном значении, потому что классы эквивалентности оказываются близки. Давайте рассмотрим пример с функцией, вычисляющей абсолютную величину:
public static int absoluteValue (int x) {
if(x > 1) {
return x;
}
else {
return –x;
}
}
Вы видите ошибку в коде? Здесь простая ошибка на единицу в первой строке метода. Поскольку проверяется, что аргумент больше единицы, подача на вход 1 вернет –1. Так как граничные значения очень часто явно упоминаются в коде, это еще одна причина, по которой они могут вызвать ошибку или попасть не в "тот" класс эквивалентности. Давайте перепишем метод правильно, с учетом найденной ошибки:
public static int absoluteValue (int x) {
if (x >= 1) {
return x;
} else {
return –x;
}
}
Гораздо лучше. Однако представьте, как трудно будет переписать этот метод, чтобы он выдавал ошибку, только когда вы передаете 57 — не 56 и 58, а именно 57. Такое возможно, конечно, но маловероятно. Так как очень редко имеется возможность исчерпывающе протестировать все входные значения для программы (или даже для одиночной функции), имеет смысл сфокусироваться на значениях, которые помогут вскрыть дефекты.
Вернемся к нашему дисплею, отображающему информацию о давлении, — наш тест-менеджер говорит, что у нас есть время протестировать больше значений. Мы хотим удостовериться, что как минимум мы тестируем все граничные значения и достаточный набор внутренних значений. Сперва мы рассчитаем все граничные значения, а затем создадим тест-план, в котором будут все граничные значения и некоторые из внутренних.
Граничные значения:
1. –1, 0 (граница между "ОШИБКА" и "НЕДОСТАТОЧНОЕ ДАВЛЕНИЕ").
2. 20, 21 (граница между "НЕДОСТАТОЧНОЕ ДАВЛЕНИЕ" и "НОРМАЛЬНО").
3. 35, 36 (граница между "НОРМАЛЬНО" и "ИЗБЫТОЧНОЕ ДАВЛЕНИЕ").
Значения, которые необходимо протестировать:
1. Внутренние значения, "ОШИБКА": –3, –100.
2. Граничные значения, "ОШИБКА"/"НЕДОСТАТОЧНОЕ ДАВЛЕНИЕ": –1, 0.
3. Внутренние значения, "НЕДОСТАТОЧНОЕ ДАВЛЕНИЕ": 5, 11.
4. Граничные значения, "НЕДОСТАТОЧНОЕ ДАВЛЕНИЕ"/"НОРМАЛЬНО": 20, 21.
5. Внутренние значения, "НОРМАЛЬНО": 25, 31.
6. Граничные значения, "НОРМАЛЬНО"/"ИЗБЫТОЧНОЕ ДАВЛЕНИЕ": 35, 36.
7. Внутренние значения, "ИЗБЫТОЧНОЕ ДАВЛЕНИЕ": 40, 95.
Можно также рассмотреть неявные граничные значения. В отличие от явных граничных значений, которые являются результатом требований (подобно тем, что рассчитаны выше), неявные значения определяются тестируемой системой или средой, в которой работает система. Например, MAXINT и MININT — неявные граничные значения; добавление единицы к MAXINT вызовет превышение максимально допустимого целого значения, а присвоение переменной значения MININT и последующее его уменьшение на единицу приведут к тому, что переменная примет значение MAXINT. В каждом из этих случаев класс эквивалентности изменится.
Неявные граничные условия могут зависеть от условий исполнения. Предположим, что у нас есть система с 2 Гбайт памяти, и мы запускаем в памяти обработку базы данных. Классы эквивалентности для тестирования функции, которая вычисляет количество добавленных строк, могут быть следующими:
1. Отрицательное число строк → ошибочное условие.
2. Ноль строк, или таблица не существует → возвращается NULL.
3. Одна строка или более → возвращается количество добавленных строк.
Существует неявная граница между тем количеством строк, которые можно добавить в память, и тем, которые нельзя. Тот, кто составлял требования, мог не подумать об этом, но вы, как тестировщик, должны держать в уме неявные граничные значения.