Безусловное ветвление и покрытие кода

Итак, я узнал, что покрытие ветвей отличается от покрытия решений, поскольку покрытие ветвей обычно включает также безусловные ветви, например. вызовы методов, использование throw, break и других ключевых слов в C#. Но интересно, действительно ли такое покрытие ветвей используется в анализаторах кода? Я подозреваю, что они используют покрытие решений, следя за тем, чтобы были покрыты все результаты решений (т.е. результирующие ветви). Я имею в виду, что следующий код имеет 2 условных, но 5 безусловных ветвей:

if(A)
  B();
  C();
  D();
  E();
else
 X();

И я считаю, что если я напишу тест, оценивающий A как просто false, анализаторы кода скажут мне, что покрытие ветвей составляет 50%. Но с точки зрения безусловных ветвей больше выполняться не будет. Это правильно?


person Pietross    schedule 05.05.2016    source источник
comment
Это действительно зависит от анализатора. dotCover идентифицирует строки кода, затронутые тестами, поэтому их можно использовать для определения того, будут ли выполнены все возможные строки кода.   -  person drz    schedule 05.05.2016
comment
@drz: OP не спрашивал о покрытии line. Он спросил о покрытии ответвлений и решений.   -  person Ira Baxter    schedule 05.05.2016


Ответы (1)


Покрытие ветвей не сообщает вам, было ли решение проверено как истинное, так и ложное.

Пример:

 if (c) {
    x=...
 }
 y=...

Если c оценивается как TRUE, выполняется блок, содержащий x=..., и покрытие ветвей обнаружит это. Он также обнаружит, что код, начинающийся с y, был выполнен. Таким образом, вы получите 100% охват, если C истинно, не имея ни малейшего представления о том, что произойдет, если C ложно.

С покрытием решения вы бы знали, что C был оценен и дает как ИСТИНА, так и ЛОЖЬ, если бы у вас было 100% покрытие.

Если в условном операторе if есть блок then и блок else, то покрытие ветвлений и покрытие решений дадут вам одну и ту же информацию.

person Ira Baxter    schedule 05.05.2016
comment
Да, я так думаю. Но тогда я понятия не имею, почему практически во всех книгах (проверьте книги Google) говорится, что охват ветвей — это то же самое, что охват решений. - person Pietross; 05.05.2016
comment
Но я не уверен в этом примере - я думаю, что если это действительно точка ветвления, и покрытие ветвей действительно обнаруживает, что другая ветвь не была запущена - из графа потока управления это очевидно. - person Pietross; 05.05.2016
comment
Представьте, что у меня есть оператор bool z = ( i › j) ; Скорее всего нет филиалов. (Машинный код x86 для этого: mov r1,i; cmp r1, j; setle r1; mov z, r1... без ответвлений). Но решение явно есть. - person Ira Baxter; 05.05.2016
comment
Да, я думаю, именно поэтому DO-178B считает покрытие решения более сильным. По их словам, он также должен иметь дело с логическими присваиваниями. Но большинство других определений этого не принимают. - person Pietross; 05.05.2016
comment
Если бы покрытие решений и покрытие ветвей были одинаковыми, DO-178B не мог бы считать одно более сильным, чем другое :-} Да, это вопрос определения, но в общих условиях покрытие ›› покрытие решения ›› покрытие ветвления. Существует около 150 определений покрытия кода, из которых эти 3 являются наиболее распространенными. С практической точки зрения людям трудно достичь 80% охвата филиалами. Низкая планка, чтобы вы могли чего-то добиться, вероятно, неплохо для начала. - person Ira Baxter; 05.05.2016