К дипломному проекту icon

К дипломному проекту



страницы: 1   2   3   4   5   6   7
вернуться в начало
скачать
^

Глава 7.Оценка полноты тестирования


Набор тестов, используемый при тестировании, всегда конечен и, более того, ограничен соображениями экономической эффективности распределения ресурсов между разными видами деятельности при разработке ПО. Поэтому крайне важно строить его так, чтобы используемые тесты проверяли как можно больше разных аспектов функциональности системы в как можно большем разнообразии ситуаций. Чтобы систематическим образом перебирать существенно отличающиеся друг от друга ситуации, используют критерии полноты тестирования или критерии адекватности тестирования. Тестовый набор, удовлетворяющий заданному критерию полноты, называют полным по этому критерию. [13]

Чаще всего для определения критерия полноты некоторые из возможных тестовых ситуаций рассматривают как эквивалентные и определяют количество классов неэквивалентных тестовых ситуаций, встретившихся или «покрытых» во время тестирования. Такие критерии полноты называются критериями тестового покрытия. При этом определяется и числовая метрика тестового покрытия — доля покрытых классов ситуаций среди всех возможных. Критерий полноты может использовать различные значения метрики, например он может требовать, чтобы полный тестовый набор всегда покрывал 100% выделенных классов ситуаций, или же считать достаточным покрытие 85% классов ситуаций. Поскольку для одной метрики покрытия можно определить много критериев полноты, далее речь, чаще всего, идет о различных метриках тестового покрытия.

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

  • На основе структурных элементов тестируемой системы, которые выполняются или задействуются в ходе тестирования.

  • На основе структуры входных данных, используемых во время тестирования.

  • На основе элементов требований, проверяемых при выполнении тестов.

  • На основе явно сформулированных предположений об ошибках, выявление которых должны обеспечить тесты.
^

7.1Структурные критерии


Критерии полноты тестирования и метрики тестового покрытия, основанные на структуре тестируемой системы, называются структурными, а тестирование, проводимое с их использованием — структурным тестированием.

В основе структурных критериев полноты лежит простая идея: если ошибка находится в какой-то конструкции кода, в каком-то компоненте тестируемой системы, то выполнив эту конструкцию или заставив работать этот компонент, мы, скорее всего, сможем ее обнаружить. Соответственно, если в двух ситуациях выполняются одни и те же элементы кода, такая ошибка будет либо проявляться в обеих ситуациях, либо не проявляться ни в одной, поэтому их можно объявить эквивалентными и проверять всегда только одну из таких ситуаций.

Это предположение редко выполняется на практике, однако как эвристика для определения метрик тестового покрытия, оно достаточно полезно. Далее для некоторых конкретных структурных метрик будут приведены примеры простых программ, в которых выполнение одной и той же конструкции в некоторых случаях вскрывает ошибку, а в некоторых — нет.

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

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

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

Структурные метрики покрытия для одной функции или метода на основе потока управления базируются на исполняемых в ходе теста элементах кода этой функции или этого метода.

Наиболее простая из таких метрик — метрика покрытия инструкций (statement coverage), равная доле выполненных во время тестирования инструкций кода функции по отношению ко всем ее инструкциям. Поскольку в большинстве современных языков программирования принято писать не более одной инструкции в строке, эта метрика чаще всего коррелирует с метрикой покрытия строк исходного кода. Однако всегда при разговоре о строках кода стоит уточнять, насколько они соответствуют инструкциям, потому что часть строк содержит декларативную, неисполняемую информацию, и информация об инструкциях позволяет точнее оценить ситуацию. В том случае, если часть инструкций не достижима, т.е. не может быть выполнена ни при каких условиях, долю покрытых инструкций определяют только по отношению ко всем достижимым инструкциям.

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

Для определения ветвей нужно рассмотреть граф потока управления программы. Каждый условный оператор (также как и оператор цикла или выбора) имеет несколько ребер графа, ведущих из него, в соответствии с возможным ходом выполнения инструкций, то есть определяет разветвление потока управления. Каждое ребро, выходящее из вершины графа, из которой выходят и другие ребра, называется ветвью.

Условному оператору соответствуют два выходящих из его вершины ребра, оператору проверки условия цикла — тоже два (выйти из цикла или нет), а оператору выбора может соответствовать много выходящих ребер — по числу указанных вариантов значений выражения, по которому осуществляется выбор.

Однако верно, что, если тесты дают 100% покрытия ветвей, они же всегда дадут и 100% покрытия инструкций. Для величин покрытия, меньших 100%, никаких общих соотношений между покрытием инструкций и ветвей указать нельзя. С одной стороны, количество инструкций может значительно превышать количество ветвей, с другой стороны, половина ветвей программы может не содержать инструкций. Поэтому покрытие 95% инструкций может соответствовать только 5% покрытых ветвей и наоборот, покрыв 95% ветвей, можно покрыть только 5% инструкций.

Но тот факт, что 100% покрытие ветвей автоматически означает 100% покрытия инструкций, уже достаточно важен. Он показывает, что метрика покрытия ветвей «не грубее» метрики покрытия инструкций, выделяет не меньше разнообразных ситуаций. Если 100% покрытия по одной метрике тестового покрытия влечет 100% покрытия по другой метрике, говорят, что первая метрика сильнее или тоньше. Соответственно, вторая слабее или грубее первой. Если одна метрика сильнее другой, а та тоже сильнее первой, они эквивалентны.

Еще более сильной метрикой является метрика комбинаций условий. Комбинации условий определяется следующим образом. Выделим условия всех ветвлений в коде программы, определяемых условными операторами, операторами цикла или операторами выбора. Эти условия являются предикатами, составленными при помощи логических операций (отрицания «не», конъюнкции «и», дизъюнкции «или», равенства, неравенства или исключающего «или») из элементарных условий — логических формул, которые уже не разлагаются на составляющие логические формулы. Выделив все элементарные условия из ветвлений в коде заданной программы, мы можем составлять комбинации из этих условий и их отрицаний, или, что то же самое, из их значений true и false (1 и 0).

Комбинация значений элементарных условий покрывается тестом, если во время его выполнения эти условия в некоторый момент имеют в точности эти значения.

Метрика покрытия комбинаций условий (multiple condition coverage) определяется как доля покрытых текстами комбинаций значений элементарных условий, участвующих в условиях ветвлений программы, по отношению к общему количеству выполнимых комбинаций значений элементарных условий.

В общем случае вопрос о выполнимости различных комбинаций достаточно непрост, поскольку элементарные условия могут быть связаны неявно. Например, они могут использовать глобальные переменные, значения которых подчиняются нетривиальным ограничениям, скажем, одна из переменных может представлять список каких-то объектов, а вторая — индекс одного из объектов в этом списке, либо –1, если список пуст. В общем случае определить выполнимость комбинации значений произвольных формул оказывается достаточно сложно, поскольку для этого нужно знать смысл используемых в условиях переменных и функций. Поэтому вычисление тестового покрытия по метрике покрытия комбинаций условий в общем случае не автоматизируется.

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

Наиболее слабая из таких метрик — метрика покрытия условий и ветвей (condition/decision coverage или condition/branch coverage). Считается она следующим образом. Для каждого элементарного условия определяется, сколько значений оно может принимать при всех возможных сценариях выполнения программы. Обычно, если нет специфических ограничений, оно может принимать два значения. Но иногда встречаются постоянные условия, которые либо всегда равны true, либо всегда равны false, при всех выполнениях программы. Определяется общее число возможных значений элементарных условий, в которое каждое обычное условие вносит 2 значения, а постоянное условие — 1. Метрика покрытия условий и ветвей вычисляется как отношение общего количества значений, которые все элементарные условия принимали в ходе теста, сложенного к количеством выполненных ветвей к сумме общего возможного числу возможных значений условий и числа достижимых ветвей.

Если при этом не учитывать покрытие ветвей, получится метрика покрытия условий (condition coverage), которая, однако, может оказаться не сильнее метрики покрытия ветвей — то, что все элементарные условия принимали все возможные значения, еще не гарантирует, что все ветви были покрыты.

При наличии n элементарных условий в программе метрика покрытия условий и ветвей определяет не более 2n ситуаций. Она, как легко видеть, сильнее метрики покрытия ветвей. Однако в нашем примере тесты, дающие 100% покрытия ветвей, дают и полное покрытие условий и ветвей, не обнаруживая внесенную ошибку.

Более сильная метрика покрытия — метрика модифицированного покрытия условий и ветвей (modified condition/decision coverage, MC/DC). Набор тестов считается достигающим 100% покрытия по этой метрике, если

  • каждая достижимая ветвь покрывается этим набором;

  • каждое непостоянное элементарное условие принимает оба возможных значения при выполнении этого набора;

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

Проще говоря, в полном тесте по метрике MC/DC должно быть продемонстрировано, что каждое элементарное условие, способное влиять на результирующее значение включающего его условия ветвления, действительно изменяет его значение независимо от остальных элементарных условий.




оставить комментарий
страница5/7
Дата18.11.2011
Размер0,85 Mb.
ТипДиплом, Образовательные материалы
Добавить документ в свой блог или на сайт

страницы: 1   2   3   4   5   6   7
Ваша оценка этого документа будет первой.
Ваша оценка:
Разместите кнопку на своём сайте или блоге:
rudocs.exdat.com

Загрузка...
База данных защищена авторским правом ©exdat 2000-2017
При копировании материала укажите ссылку
обратиться к администрации
Анализ
Справочники
Сценарии
Рефераты
Курсовые работы
Авторефераты
Программы
Методички
Документы
Понятия

опубликовать
Документы

наверх