Разделение эквивалентности
Эта статья нуждается в дополнительных цитатах для проверки . ( август 2008 г. ) |
Разделение эквивалентности или разделение классов эквивалентности ( ECP ) [1] это метод тестирования программного обеспечения , который делит входные данные программного модуля на разделы эквивалентных данных, из которых могут быть получены тестовые примеры. В принципе, тестовые примеры предназначены для охвата каждого раздела хотя бы один раз. Этот метод пытается определить тестовые примеры, которые выявляют классы ошибок, тем самым уменьшая общее количество тестовых примеров, которые необходимо разработать. Преимуществом этого подхода является сокращение времени, необходимого для тестирования программного обеспечения, за счет меньшего количества тестовых случаев.
Разделение эквивалентности обычно применяется к входам тестируемого компонента, но в редких случаях может применяться к выходам. Разделы эквивалентности обычно создаются на основе спецификации требований к входным атрибутам, которые влияют на обработку объекта тестирования.
Фундаментальная концепция ECP исходит из класса эквивалентности , который, в свою очередь, происходит из отношения эквивалентности . Программная система, по сути, представляет собой вычислимую функцию , реализованную в виде алгоритма на некотором языке программирования . Учитывая входной тестовый вектор , некоторые инструкции этого алгоритма покрываются (подробнее см. Покрытие кода ), другие — нет. Это дает интересную взаимосвязь между входными тестовыми векторами: является отношением эквивалентности между тестовыми векторами a, b тогда и только тогда, когда площадь покрытия векторы a, b совершенно одинаковы, то есть охватывают одни и те же инструкции на одном и том же шаге. Это, очевидно, означало бы, что покрытие отношения C разделит область определения тестового вектора в класс множественной эквивалентности . Это разделение называется разделением тестового ввода по классам эквивалентности. Если существует N эквивалентных классов, то только N для полного покрытия системы достаточно векторов.
![]() | этого раздела Фактическая точность оспаривается . ( Апрель 2021 г. ) |
Демонстрацию можно провести с помощью функции, написанной на C :
int safe_add( int a, int b )
{
int c = a + b;
if ( a > 0 && b > 0 && c <= 0 )
{
fprintf ( stderr, "Overflow (positive)!\n" );
}
if ( a < 0 && b < 0 && c >= 0 )
{
fprintf ( stderr, "Overflow (negative)!\n" );
}
return c;
}
На основе кода входные векторы [ a , b ] разбиваются . Блоки, которые нам нужно охватить, — это переполнение в положительном направлении, отрицательном направлении и ни в одном из этих двух. Это приводит к трем эквивалентным классам из самого обзора кода.

Для решения входной задачи воспользуемся неравенством
мы отмечаем, что существует фиксированный размер целого числа (информатика) , следовательно, z можно заменить на:
- INT_MIN ≤ x + y ≤ INT_MAX
и
с x ∈ { INT_MIN , ... , INT_MAX } и y ∈ { INT_MIN , ... , INT_MAX }
Значения тестового вектора при строгом условии равенства, то есть INT_MIN = x + y и INT_MAX = x + y, называются граничными значениями. Анализ граничных значений содержит подробную информацию об этом. Обратите внимание, что график охватывает только случай переполнения, первый квадрант для положительных значений X и Y.
Как правило, входные данные имеют определенные диапазоны, которые являются действительными, и другие диапазоны, которые являются недействительными. Неверные данные здесь не означают, что данные неверны, это означает, что эти данные лежат за пределами определенного раздела. Лучше всего это можно объяснить на примере функции, принимающей параметр «месяц». Допустимый диапазон для месяца — от 1 до 12, что соответствует периоду с января по декабрь. Этот допустимый диапазон называется разделом. В этом примере есть еще два раздела недопустимых диапазонов. Первый недопустимый раздел будет иметь размер ≤ 0, а второй недопустимый раздел будет ≥ 13.
... -2 -1 0 1 .............. 12 13 14 15 ..... --------------|-------------------|--------------------- invalid partition 1 valid partition invalid partition 2
Теория тестирования, связанная с разделением эквивалентности, гласит, что для оценки поведения программы для соответствующего раздела необходим только один тестовый пример каждого раздела. Другими словами, достаточно выбрать один тестовый пример из каждого раздела, чтобы проверить поведение программы. Использование большего количества или даже всех тестовых случаев раздела не приведет к обнаружению новых ошибок в программе. Значения внутри одного раздела считаются «эквивалентными». Таким образом, количество тестовых случаев может быть значительно сокращено.
Дополнительным эффектом от применения этой техники является то, что вы также обнаружите так называемые «грязные» тестовые случаи. У неопытного тестировщика может возникнуть соблазн использовать в качестве тестовых примеров входные данные от 1 до 12 за месяц и забыть выбрать некоторые из недопустимых разделов. Это приведет к появлению огромного количества ненужных тестовые примеры, с одной стороны, и отсутствие тестовых примеров для «грязных» диапазонов, с другой стороны.
Тенденция состоит в том, чтобы связать разделение эквивалентности с так называемым тестированием черного ящика , при котором строго проверяется программный компонент на его интерфейсе, без учета внутренней структуры программного обеспечения. Но если присмотреться к этой теме, то можно обнаружить случаи, когда она применима к тестированию «серого ящика» и . Представьте себе интерфейс компонента, который имеет допустимый диапазон от 1 до 12, как в примере выше. Однако внутри функция может иметь дифференциацию значений от 1 до 6 и значений от 7 до 12. В зависимости от входного значения внутреннее программное обеспечение будет проходить по разным путям для выполнения немного разных действий. Что касается входных и выходных интерфейсов компонента, эта разница не будет заметна, однако при тестировании «серого ящика» вы хотели бы убедиться, что проверены оба пути. Для этого необходимо ввести дополнительные разделы эквивалентности, которые не потребуются для тестирования «черного ящика». Для этого примера это будет:
... -2 -1 0 1 ..... 6 7 ..... 12 13 14 15 ..... --------------|---------|----------|--------------------- invalid partition 1 P1 P2 invalid partition 2 valid partitions
Чтобы проверить ожидаемые результаты, вам нужно будет оценить некоторые внутренние промежуточные значения, а не выходной интерфейс. Нет необходимости использовать несколько значений из каждого раздела. В приведенном выше сценарии мы можем взять -2 из недопустимого раздела 1, 6 из действительного раздела P1, 7 из действительного раздела P2 и 15 из недопустимого раздела 2.
Разделение эквивалентности не является самостоятельным методом определения тестовых примеров. Его необходимо дополнить анализом граничных значений . Определив разбиения возможных входных данных, необходимо применить метод анализа граничных значений, чтобы выбрать наиболее эффективные тестовые примеры из этих разбиений.
Ограничения [ править ]
В тех случаях, когда диапазоны или наборы данных подразумевают простоту подхода (пример: 0–10, 11–20, 21–30) и тестирование всех значений было бы практично, следует рассмотреть возможность полного тестового покрытия с использованием всех значений внутри и на границе диапазонов. Полное тестовое покрытие может выявить ошибки, которые не удалось бы обнаружить с помощью метода эквивалентного разделения, если программное обеспечение включает в себя подразделы, неизвестные тестировщику. [2] Кроме того, в упрощенных случаях польза от сокращения количества тестовых значений с помощью разделения эквивалентности уменьшается по сравнению со случаями, включающими более широкие диапазоны (пример: 0–1000, 1001–2000, 2001–3000).
Дальнейшее чтение [ править ]
- Веб-сайт Рабочей группы по стандартам тестирования
- Parteg — бесплатный инструмент для создания тестов, который сочетает в себе создание пути тестирования из конечных автоматов UML с созданием классов эквивалентности входных значений.
- https://books.google.com/books/about/Software_Testing_Techniques.html
Ссылки [ править ]
- ^ Бернштейн, Илен (2003), «Практическое тестирование программного обеспечения» , Springer-Verlag, стр. 623, ISBN 0-387-95131-8
- ^ Матур, Адитья (2007), Основы тестирования программного обеспечения: фундаментальные алгоритмы и методы , Pearson India, стр. 96, ISBN 978-81-317-0795-1