Процент покрытия кода не очень хороший
-
06-07-2019 - |
Вопрос
Я установил на свой компьютер C ++ Test только с лицензией UnitTest (только лицензия Unit Test) в качестве плагина Visual Studio 2005 (cpptest_7.2.11.35_win32_vs2005_plugin.exe).
У меня есть пример, подобный следующему:
bool MyFunction(... parameters... )
{
bool bRet = true;
// do something
if( some_condition )
{
// do something
bRet = CallToAFunctionThatCanReturnBothTrueAndFalse....
}
else
{
bRet = false;
// do something
}
if(bRet == false)
{
// do something
}
return bRet;
}
В моем случае после запуска инструмента покрытия у меня получаются следующие результаты (для функции, аналогичной ранее упомянутой):
[LC=100 BC=100 PC=75 DC=100 SCC=100 MCDC=50 (%)]
Я действительно не понимаю, почему у меня нет 100% покрытия, когда дело доходит до PathCoverage (PC). Также, если бы кто-то, имеющий опыт работы с C ++ Test, Parasoft мог бы объяснить для меня низкий охват MCDC, это было бы здорово.
Что я должен сделать, чтобы увеличить охват? как у меня нет идей в этом деле. Указания (некоторые части) к документации приветствуются.
Спасибо,
Юлианский
Решение
Это хороший справочник по различным типам покрытия кода: http: //www.bullseye. ком / coverage.html .
MCDC . Чтобы улучшить охват MCDC, вам нужно взглянуть на some_condition
. Предполагая, что это сложное логическое выражение, вам нужно посмотреть, используете ли вы необходимые комбинации значений. В частности, каждое логическое подвыражение должно выполняться как true и false.
Путь . Одна из вещей, упомянутых в приведенной выше ссылке как недостаток покрытия пути, состоит в том, что многие пути невозможно использовать. Это может быть в вашем примере.
Другие советы
Я не могу помочь с конкретным инструментом, который вы используете, но общая идея с охватом пути состоит в том, что каждый возможный путь через код должен быть выполнен.
Если вы рисуете потоковую диаграмму через программу, разветвляясь на каждый if / break / continue и т. д., вы должны увидеть, какие пути проходят ваши тесты через программу. Чтобы получить 100% (что не является абсолютно необходимым и не гарантирует идеального теста), ваш тест должен пройти по каждой ветви кода, выполняя каждую строку.
Надеюсь, это поможет.
Вам нужно как минимум два тестовых случая, чтобы получить 100% охват. Тот, где some_condition является истинным, и тот, где его нет. Если у вас есть, вы должны получить 100% покрытие.
Хотя вы должны увидеть 100% покрытие как идеальное. В этом случае вам потребуется 3 теста, чтобы можно было проверить все комбинации. Посмотрите цикломатическую сложность, чтобы узнать больше об этом.
Есть четыре гипотетических пути через эту функцию. Каждое условие if удваивает количество путей. Каждый оператор if - это ветка, в которой вы можете пойти двумя разными путями. Таким образом, всякий раз, когда ваш инструмент встречает " if " ;, он предполагает, что код может принять " true " ветвь или "ложь" ветка. Однако, это не всегда возможно. Рассмотрим:
bool x = true;
if (x) {
do_something();
}
" ложь " ветвь оператора if недоступна. Это очевидный пример, но когда вы учитываете несколько операторов if, становится все труднее увидеть, возможен ли путь.
В вашем коде только три возможных пути. Путь, который принимает «ложь» переход в первом операторе if и " true " ветвь во втором недоступна.
Ваш инструмент недостаточно умен, чтобы понять это.
Тем не менее, даже если инструмент идеален, получение 100% покрытия пути, вероятно, маловероятно в реальном приложении. Однако очень низкий охват пути является верным признаком того, что ваш метод имеет слишком высокую цикломатическую сложность.
Лично я считаю, что начинать ЛЮБУЮ функцию с
плохоbool retCode = true; Р>
Вы делаете явное предположение, что по умолчанию он будет успешным, а затем при определенных условиях потерпит неудачу. Р>
Программисты, которые придут за вами, не сделают этого предположения Р>
Неудачи быстро, неудачи рано. Р>
И как уже говорили другие, если вы хотите тестировать случаи сбоев, вы должны тестировать код, который не проходит. Р>