Анализ граничных значений

Анализ граничных значений — это методика тестирования программного обеспечения, при которой тесты разрабатываются таким образом, чтобы включать значения, находящиеся на границах допустимых диапазонов. Идея анализад граничных значений возникла из понятия границы в математике[1]. Если задано множество тестовых векторов для тестирования системы, над этим множеством можно ввести топологию. Те входные данные, которые принадлежат одному классу эквивалентности согласно теории разделения на классы эквивалентности, образуют базис. Если базисные множества являются соседними, между ними существует граница. Тестовые векторы по обе стороны границы называются граничными значениями. На практике это требует, чтобы тестовые векторы можно было упорядочить, а параметры следовали некоторому порядку (частичному или полному).

Формальное определение

Формально граничные значения можно определить следующим образом:

Пусть множество тестовых векторов равно X1,..., Xn.
Пусть определено отношение порядка .
Пусть C1, C2 — два класса эквивалентности.
Пусть X1C1 и X2C2.
Если или , то классы соседствуют, а значения являются граничными значениями.

Проще говоря, тестируются значения, находящиеся на минимальных и максимальных границах класса эквивалентности. Такими значениями могут быть как входные, так и выходные диапазоны программного компонента, а также внутренние реализации. Границы часто становятся источниками ошибок, вызывая сбои, поэтому именно их важно проверять в тест-кейсах.

Применение

Ожидаемые входные и выходные значения программного компонента определяются на основе его спецификации. Затем значения группируются в множества с чётко определёнными границами. Каждое множество (или раздел) содержит значения, которые должны обрабатываться компонентом одинаково. Принципы разделения диапазонов тестовых данных поясняются в методике разделения на классы эквивалентности. Важно учитывать как валидные, так и невалидные разделы при проектировании тест-кейсов.

Продемонстрировать применение анализа граничных значений можно на примере функции на языке Java:

class Safe {
    static int add(int a, int b)
    {
        int c = a + b ;

        if (a >= 0 && b >= 0 && c < 0)
        {
            System.err.println("Overflow!");
        }
        if (a < 0 && b < 0 && c >= 0)
        {
            System.err.println("Underflow!");
        }

        return c;
    }
}

Исходя из этого кода, входные векторы (a,b) делятся на разделы. Необходимо охватить обработку условий переполнения (overflow), недополнения (underflow), а также отсутствие этих ситуаций, то есть получается три класса эквивалентности на основе анализа кода.

undefined

Пример: если значения месяцев года представлены целыми числами, то параметр 'месяц' может иметь следующие разделы:

       ... -2 -1  0 1 .............. 12 13  14  15 .....
     --------------|-------------------|-------------------
невалидный раздел 1   валидный раздел   невалидный раздел 2

Граница между разделами — это место, где меняется поведение приложения; само по себе граница не обязательно является реальным числом. Граничное значение — это минимальное (или максимальное) значение, находящееся на границе. Например, 0 — максимальное значение первого раздела, 1 — минимальное значение второго раздела; оба эти значения будут граничными. Тест-кейсы должны генерировать входные или выходные данные, попадающие на границу и по обе стороны от неё; таким образом, на каждую границу приходится по два случая. Величина смещения задаётся минимально возможным шагом для соответствующего типа данных, например для целого это 1, а для десятичного с двумя знаками после запятой — 0,01. В приведённом примере граничные значения: 0, 1 и 12, 13 — все они должны быть протестированы.

Анализ граничных значений не требует наличия невалидных разделов. Например, если обогреватель включается при температуре 10 градусов и ниже, существуют два раздела (температура ≤ 10, температура > 10) и два граничных значения (температура = 10 и температура = 11).

Если граничное значение попадает в невалидный раздел, тест-кейс должен убедиться, что компонент корректно обрабатывает такое значение. Анализ граничных значений может использоваться на всех этапах тестирования и одинаково применим на всех фазах.

Примечания

  1. Craig, Rick David. Systematic Software Testing / Rick David Craig, Stefan P. Jaskiel. — Artech House, 2002. — P. 155–156. — ISBN 9781580537926.

Ссылки

Категории