Скажем, у меня есть этот код:
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 видят, что оно еще не "проверяло"?
Я надеюсь, что я ясен.
Обычно утилиты покрытия (такие как gcov) поставляются вместе с компилятором. Однако обратите внимание, что они обычно дают только C0 покрытие. Т.е.
a ? b : c
помечается как выполненная, даже если было использовано только одно ответвление. Таким образом, даже если ваши тесты показывают 100% покрытие C0, вы можете не поймать все пути в коде - и, возможно, у вас нет времени на это (количество путей растет экспоненциально по отношению к ветвям). Однако полезно знать, есть ли у вас 10% C2 или 70% C2 (или 0,1% C2).
Довольно часто в комплекте с вашим компилятором поставляется утилита для проведения подобного анализа покрытия кода. Например, в GCC есть утилита gcov.
Вы можете использовать директивы препроцессора 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... */
}
Вам нужна программа покрытия кода (gcov, bullseye, dev partner) и модульное тестирование (unittest ++, cppunit и т. Д.). Вы пишете тест, который проверяет эту функцию.
TEST( UnitTestFunction )
{
CHECK( function(true) == 55 );
CHECK( function(false) == 120 );
}
Затем модульные тесты в этом случае не только проверяют целостность (хотя они все еще это делают), но также проверяют покрытие.
Попробуйте SD C++ TestCoverage для инструмента покрытия тестов, совместимого с VisualStudio. Я полагаю, что он на самом деле расскажет вам о тестовом покрытии a?b:c тоже.