Инструмент может использовать разные типы покрытия, включая
- покрытие строки
- покрытие выписки
- покрытие ветки / решения
для f1(); if (a || b) { f2(); } f3();
имеем:
- 1 строка
- 5 операторов (
a
, b
, f1
, f2
, f3
) - 4 ветви (
a==(true|false)
, b==(true|false)
-> 2 + 2) - 3 пути (
{a, b}=={true, _}
, {a, b}=={false, false}
, {a, b}=={false, true}
)
Нет реальных отношений между этими показателями
Один прогон будет проверять один путь и любое количество других показателей.
Ваше безусловное l oop (как for (int i : {4, 8, 15, 16, 23, 42})
) действительно не увеличит количество путей, не увеличит количество ветвей на единицу и не увеличит количество операторов. Но любой путь, принимающий этот безусловный l oop, будет охватывать все операторы и ветви вашего безусловного l oop.
Ваш условный l oop (for (int i : my_numbers)
) увеличит количество ветвей на единицу, может увеличиться номер пути (пустота контейнера уже исправлена предыдущим шагом пути) и увеличить количество операторов. Если вы запустите путь с использованием непустого контейнера, вы охватите все операторы и ветви, но на самом деле не обязательно все пути.
Большинство инструментов не используют покрытие пути (поскольку оно слишком сильно увеличивается, чтобы его можно было использовать)
и условное против безусловного l oop имеет значение только для этих показателей.