Разделение эквивалентности - Equivalence partitioning

Разделение эквивалентности или же разбиение классов эквивалентности (ECP)[1] это тестирование программного обеспечения метод, который разделяет входные данные программного модуля на разделы эквивалентных данных, из которых могут быть получены тестовые примеры. В принципе, тестовые примеры предназначены для охвата каждого раздела хотя бы один раз. Этот метод пытается определить тестовые примеры, которые выявляют классы ошибок, тем самым уменьшая общее количество тестовых примеров, которые необходимо разработать. Преимущество этого подхода - сокращение времени, необходимого для тестирования программного обеспечения, за счет меньшего количества тестовых примеров.

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

Фундаментальная концепция ECP исходит из класс эквивалентности что, в свою очередь, происходит от отношение эквивалентности.Программная система по сути вычислимая функция реализовано как алгоритм в некоторой реализации язык программирования.Дан ввод тестовый вектор покрываются некоторые инструкции этого алгоритма (см. покрытие кода для деталей) другие нет. Это дает интересную взаимосвязь между входными тестовыми векторами: является отношение эквивалентности между тестовыми векторами а, б тогда и только тогда, когда площадь покрытия векторов а, б точно такие же, то есть охватывают одни и те же инструкции на одном шаге. Это, очевидно, означало бы, что отношение покрывает C разделит вход векторное пространство из тестовый вектор на несколько класс эквивалентности. Такое разбиение называется разбиением тестового ввода на классы эквивалентности. Если есть N эквивалентные классы, только N векторов достаточно, чтобы полностью покрыть систему.

Демонстрация может быть выполнена с помощью функции, написанной на C:

int safe_add( int а, int б ){    int c = а + б;    если ( а > 0 && б > 0 && c <= 0 )    {        fprintf ( stderr, «Перелив (положительный)! п" );    }     если ( а < 0 && б < 0 && c >= 0 )    {        fprintf ( stderr, «Переполнение (отрицательное)! п" );    }     возвращаться c;}

На основе кода входные векторы [а,б] разделены. Блоки, которые нам нужно охватить, - это переполнение в положительном направлении, отрицательное направление и ни то, ни другое. Из самого обзора кода это приводит к 3 эквивалентным классам.

Демонстрация разделения классов эквивалентности

Чтобы решить проблему ввода, мы прибегаем к неравенство

отметим, что существует фиксированный размер Целое число (информатика) следовательно, z можно заменить на: -

INT_MIN ≤ Икс + у ≤ INT_MAX

и

с Икс ∈ {INT_MIN, ..., INT_MAX} и у ∈ {INT_MIN, ..., INT_MAX}

Ценности тестовый вектор при строгом условии равенства, т.е. INT_MIN = Икс + у и INT_MAX = Икс + у называются граничными значениями, Граничный анализ есть подробная информация об этом. Обратите внимание, что график охватывает только случай переполнения, первый квадрант для положительных значений X и Y.

Как правило, входные данные имеют определенные допустимые диапазоны и недопустимые диапазоны. Недействительные данные здесь не означают, что данные неверны, это означает, что эти данные находятся вне определенного раздела. Лучше всего это можно объяснить на примере функции, которая принимает параметр «месяц». Допустимый диапазон для месяца - от 1 до 12, то есть с января по декабрь. Этот допустимый диапазон называется разделом. В этом примере есть еще два раздела недопустимых диапазонов. Первый недопустимый раздел будет ≤ 0, а второй недопустимый раздел будет ≥ 13.

        ... -2 -1 0 1 .............. 12 13 14 15 ..... -------------- | --- ---------------- | --------------------- недопустимый раздел 1 допустимый раздел недопустимый раздел 2

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

Дополнительным эффектом применения этой техники является то, что вы также обнаружите так называемые «грязные» тестовые примеры. У неопытного тестировщика может возникнуть соблазн использовать в качестве тестовых примеров входные данные с 1 по 12 за месяц и забыть выбрать некоторые из недействительных разделов. Это привело бы к огромному количеству ненужных тестовых случаев, с одной стороны, и отсутствию тестовых примеров для грязных диапазонов, с другой стороны.

Существует тенденция относить разделение эквивалентности к так называемому тестирование черного ящика который строго проверяет программный компонент на его интерфейсе, без учета внутренней структуры программного обеспечения. Но при более внимательном рассмотрении предмета есть случаи, когда это применимо к тестирование серого ящика также. Представьте себе интерфейс для компонента, который имеет допустимый диапазон от 1 до 12, как в примере выше. Однако внутренне функция может иметь различие значений от 1 до 6 и значений от 7 до 12. В зависимости от входного значения внутреннее программное обеспечение будет проходить по разным путям для выполнения немного разных действий. Что касается входных и выходных интерфейсов компонента, эта разница не будет заметна, однако при тестировании серого ящика вы хотели бы убедиться, что проверены оба пути. Для этого необходимо ввести дополнительные разделы эквивалентности, которые не потребуются для тестирования методом черного ящика. В этом примере это будет:

        ... -2-1 0 1 ..... 6 7 ..... 12 13 14 15 ..... -------------- | ----- ---- | ---------- | --------------------- недопустимый раздел 1 P1 P2 недопустимый раздел 2 допустимые разделы

Чтобы проверить ожидаемые результаты, вам нужно будет оценить некоторые внутренние промежуточные значения, а не интерфейс вывода. Необязательно использовать несколько значений из каждого раздела. В приведенном выше сценарии мы можем взять -2 из недопустимого раздела 1, 6 из допустимого раздела P1, 7 из допустимого раздела P2 и 15 из недопустимого раздела 2.

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

Ограничения

В случаях, когда диапазоны или наборы данных предполагают простоту подхода (пример: 0–10, 11–20, 21–30) и тестирование всех значений будет практичным, следует рассмотреть охват тестовым покрытием с использованием всех значений в пределах и на границе диапазонов. Покрытие сплошным тестированием может выявить ошибки, которые не могут быть обнаружены с помощью метода эквивалентного разбиения, если программное обеспечение включает подразделы, которые неизвестны тестировщику.[2] Кроме того, в упрощенных случаях выгода от уменьшения количества тестовых значений за счет использования разделения по эквивалентности уменьшается по сравнению со случаями, включающими большие диапазоны (пример: 0-1000, 1001-2000, 2001-3000).

дальнейшее чтение

Рекомендации

  1. ^ Бернштейн, Илен (2003), Практическое тестирование программного обеспечения, Springer-Verlag, стр. 623, г. ISBN  0-387-95131-8
  2. ^ Матур, Адитья (2007), Основы тестирования программного обеспечения: основные алгоритмы и методы, Пирсон Индия, стр. 96, ISBN  81-317-0795-4