stringtranslate.com

Эквивалентное разбиение

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

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

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

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

int safe_add ( int a , int b ) { int c = a + b ; if ( a > 0 && b > 0 && c <= 0 ) { fprintf ( stderr , "Переполнение (положительное)! \n " ); } if ( a < 0 && b < 0 && c >= 0 ) { fprintf ( stderr , "Переполнение (отрицательное)! \n " ); } return c ; }                                                          

На основе кода разделяются входные векторы [ a , b ] . Блоки, которые нам нужно охватить, — это переполнение в положительном направлении, отрицательном направлении и ни одно из этих 2. Это приводит к 3 эквивалентным классам, из самого обзора кода.

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

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

мы отмечаем, что существует фиксированный размер целого числа (информатика) , поэтому 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 ..... --------------|-------------------|--------------- ------ недействительный раздел 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), Основы тестирования программного обеспечения: основные алгоритмы и методы , Pearson India, стр. 96, ISBN 978-81-317-0795-1