Покрытие кода (путь выполнения кода C++)

Скажем, у меня есть этот код:

int function(bool b)
{
    // execution path 1
    int ret = 0;
    if(b)
    {
        // execution path 2
        ret = 55;
    }
    else
    {
        // execution path 3
        ret = 120;
    }
    return ret;
}

Мне нужен своего рода механизм, чтобы удостовериться, что код вошел в любой возможный путь, т.е. выполнение соединяет каналом 1, 2 и 3 в коде выше.

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

Проблема состоит в том, что я ничего не буду видеть о путях, которые не "проверяли".
Какая-либо идея, как я делаю это? Как "зарегистрировать" строку кода во время компиляции, таким образом, во времени выполнения I видят, что оно еще не "проверяло"?

Я надеюсь, что я ясен.

9
задан Poni 31 May 2010 в 13:29
поделиться

5 ответов

Обычно утилиты покрытия (такие как gcov) поставляются вместе с компилятором. Однако обратите внимание, что они обычно дают только C0 покрытие. Т.е.

  • C0 - каждая строка выполняется хотя бы один раз. Обратите внимание, что a ? b : c помечается как выполненная, даже если было использовано только одно ответвление.
  • C1 - каждая ветвь выполняется хотя бы один раз.
  • C2 - каждый путь выполняется хотя бы один раз

Таким образом, даже если ваши тесты показывают 100% покрытие C0, вы можете не поймать все пути в коде - и, возможно, у вас нет времени на это (количество путей растет экспоненциально по отношению к ветвям). Однако полезно знать, есть ли у вас 10% C2 или 70% C2 (или 0,1% C2).

7
ответ дан 2 November 2019 в 23:59
поделиться

Довольно часто в комплекте с вашим компилятором поставляется утилита для проведения подобного анализа покрытия кода. Например, в GCC есть утилита gcov.

2
ответ дан 2 November 2019 в 23:59
поделиться

Вы можете использовать директивы препроцессора FILE и LINE :

#define TRACE(msg) MyTraceNotify(msg,__FILE__,__LINE__)

Просто вставьте макрос TRACE (msg) в свой код в тех местах, где вы хотите track, с вашим собственным сообщением, и напишите свою функцию MyTraceNotify.

void MyTraceNotify(const char *msg, const char *filename, ULONG line)
{
    /* Put your code here... */    
}
0
ответ дан 2 November 2019 в 23:59
поделиться

Вам нужна программа покрытия кода (gcov, bullseye, dev partner) и модульное тестирование (unittest ++, cppunit и т. Д.). Вы пишете тест, который проверяет эту функцию.

TEST( UnitTestFunction )
{
    CHECK( function(true) == 55 );
    CHECK( function(false) == 120 );
}

Затем модульные тесты в этом случае не только проверяют целостность (хотя они все еще это делают), но также проверяют покрытие.

2
ответ дан 2 November 2019 в 23:59
поделиться

Попробуйте SD C++ TestCoverage для инструмента покрытия тестов, совместимого с VisualStudio. Я полагаю, что он на самом деле расскажет вам о тестовом покрытии a?b:c тоже.

1
ответ дан 2 November 2019 в 23:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: