Возможные формы отчетов о покрытии

Типичный отчет о покрытии представляет собой список структурных элементов покрываемого программного кода (функций или методов), содержащий для каждого структурного элемента следующую информацию:

· Название функции или метода

· Тип покрытия (по строкам, по ветвям, MC/DC или иной)

· Количество покрываемых элементов в функции или методе (строк, ветвей, логических условий)

· Степень покрытия функции или метода (в процентах или в абсолютном выражении)

· Список непокрытых элементов (в виде участков непокрытого программного кода с номерами строк)

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

Пример такого отчета о покрытии приведен ниже

Coverage Report

Generated 10/07/2006 for file Testing_Facilities.cpp

----------------------------------------------------

1) function main_Menu()

Coverage: Instructions

Elements: 25 structured lines of code (SLOCs)

Covered: 22 lines (88%)

Not covered:

291 default:

292 return -1;

293 break;

Coverage: Branches

Elements: 5 branches

Covered: 4 branches (80%)

Not covered (starting and ending lines only):

default:

break;

----------------------------------------------------

2) function item_Help()

Coverage: Instructions

Elements: 180 structured lines of code (SLOCs)

Covered: 180 lines (100%)

Coverage: Branches

Elements: 2 branches

Covered: 2 branches (80%)

----------------------------------------------------

Total functions: 2

Total instructions coverage: 98.5%

Total branches coverage: 86%

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

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

Пример такого отчета приведен ниже:

Coverage report for BaseCalculator.AnalaizerClass.Format method.

Generated on 25/07/2006

public static string Format()

{

string formstr = "";

string prev = "";

if (expression.Length <= 65536) {

for (int i = 0; i < expression.Length; i++) {

switch (expression[i]) {

case '0': {

if (prev == "число" || prev == "") {

formstr += expression[i].ToString();

} else {

formstr += " " + expression[i].ToString();

}

prev = "число";

break;

}

}

}

} else {

MessageBox.Show("Слишком длинное выражение.");

Program.res = 7;

return "&Error 07";

}

}

Зеленым цветом отмечены выполненные в результате тестирования участки метода, красным – не выполненные.

Конкретная форма отчета о покрытии определяется инструментарием и технологическими процессами проекта.

Рассмотрим, например, отчет о структурном покрытии, генерируемый полученного при помощи средства для анализа программного кода CodeTEST компании Metrowerks.

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

  CodeTEST Advanced Coverage Tools Modified Condition Decision Coverage Report (MCDC), DO-178B Level A CodeTEST Report Generator 2.2.04 Report generated on Sun Aug 21 14:28:16 2005 IDB File: <Path_to_IDB_file> 42963330-1C0 Thu May 26 21:36:00 2005

Далее выводится информация о проценте покрытия по всем модулям в совокупности (в данном случае, это 33 модуля):

  Overall Summary (MCDC): 33 Files 1405 true-false decisions 674 48.0% covered 494 35.2% partially covered 237 16.9% not covered 1928 conditions in the decisions 1068 55.4% covered 571 29.6% partially covered 289 15.0% not covered 278 case branches 154 55.4% covered 124 44.6% not covered 581 coverage events 504 86.7% covered 77 13.3% not covered

Рассмотрим более подробно каждую из характеристик:

true-false decisions – количество логических выражений, в данном случае их 1405. Из этого числа на оба возможных значения (True и False) покрыто лишь 674, еще 494 покрыто на какое-то одно из значений, а 237 не покрыто вообще.

conditions in the decisions – количество логических условий внутри логических выражений. Как можно догадаться, их количество не может быть меньше количества логических выражений. Непокрытие логических условий явным образом влечет за собой непокрытие логических выражений. Факт, что если все условия будут покрыты, то все выражения также будут покрыты.

case branches – количество веток ветвления операторов выбора (select). Ветка считается покрытой, если выражение, стоящее в условии оператора select, принимает значение, соответствующее данному варианту выбора (case), в результате чего ветка выполняется.

coverage events – в данном случае, это количество точек входа / выхода в функциях. Точка входа в функцию считается покрытой, если эта функция была вызвана хотя бы один раз. Точками выхода являются точка окончания функции (}), когда управление передается в место вызова этой функции, а также операторы возврата (return), после выполнения которых управление также передается в место вызова функции.

Затем выводится информация для первого модуля, а именно: имя модуля, путь к файлу на диске, дата последнего изменения, контрольная сумма. После этого выводится суммарная информация о покрытии только для этого модуля (для всех его функций, количество которых также указывается). Структура этой информации аналогична структуре, описанной выше:

  1. File <Module_1_name.cpp> in <Path_to_module_1> Last Modified: Fri Oct 15 18:34:14 2004 Checksum: CEDBAB67 File Summary (Extended MCDC): 6 Functions 24 true-false decisions 10 41.7% covered 11 45.8% partially covered 3 12.5% not covered 39 conditions in the decisions 20 51.3% covered 15 38.5% partially covered 4 10.3% not covered 0 case branches 12 coverage events 12 100.0% covered 0 0.0% not covered

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

COVERED – участок полностью покрыт в понятиях типа, к которому он приписан;

PARTIALLY covered – участок частично покрыт. Применимо только к логическим выражениям и условиям и указывает на то, что выражение (условие) покрыто на какое-то одно из двух возможных значений;

NOT covered – участок не покрыт. Это означает, что данный участок не выполнялся в процессе работы скомпилированного программного кода.

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

  1.1 Function <Function_1> void Function_1(void) Function Summary (MCDC): 3 true-false decisions 0 0.0% covered 2 66.7% partially covered 1 33.3% not covered 5 conditions in the decisions 1 20.0% covered 3 60.0% partially covered 1 20.0% not covered 0 case branches 2 coverage events 2 100.0% covered 0 0.0% not covered coverage line 266: function entry COVERED decision line 267: if statement if ((A == B) && (... T F 1: *ttt *fxx ((A ==...)&& COVERED 2: *ttt tfx ((C...)&& PARTIALLY covered 3: *ttt ttf ((D == 0) PARTIALLY covered decision line 271: if statement if (E <= 0) T F 1: t *f (E <= 0) PARTIALLY covered decision line 276: if statement if (D == 0) T F 1: t f (D...) NOT covered coverage line 291: function end } COVERED

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

if ((A==B) && (C > 0) && (D == 0))

и пусть результат покрытия для него такой, как приведен выше (decision line 267: if statement). Для этого выражения строится таблица, где в каждой строке помещается информация для каждого из логических условий, входящих в это логическое выражение. Нумерация логических условий начинается с 1, в нашем случае их 3.

В первом столбце указывается комбинация значений логических условий (с участием рассматриваемого условия), которую необходимо выставить, чтобы логическое выражение приняло значение True. В данном случае, так как все условия соединены логическим оператором «И» (&&), то такой комбинацией может быть только TTT. Если указанная комбинация была сформирована в процессе тестирования программы, то она помечается символом (*).

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

Третий столбец – это вырезка текста логического условия, позволяющая легче ориентироваться в коде при анализе покрытия.

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

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

Отчеты о покрытиях, создаваемые Microsoft Visual Studio Team Edition будут рассмотрены на семинарских занятиях.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: