Ваша разница ошибок покрытия исходит от PHPUnit и связанного с ним механизма вычисления покрытия кода в терминах "исходных строк".В этом нет ничего плохого, если это можно сделать хорошо.
Поскольку механизм XDebug понимает только номера строк тех строк, которые он на самом деле выполняет, я не думаю, что он может "сделать это правильно".«учитывая, что ваш стиль помещает« исходные строки »в места, которые он не может« выполнить ».
Подумайте, что произойдет, если вы напишите:
1: foo() { return;
2: ...1000 comment lines...
1002: }
То, что XDebug видит, - это выполнениевозвращение в строке 1, поэтому одна строка четко покрыта (не совсем верно, см. пример ниже);PHPUnit видит (я думаю) 1002 строки кода.Я думаю, что это даст вам 0,1% покрытия, если запустить самому(В более крупных программах такой экстремальный код маловероятен, и средние значения становятся лучше).
Таким образом, охват, который вы получаете, серьезно зависит от вашего стиля кодирования.Более неясный вариант:
1: bar() { if (a) { $x=2; if (b) { $y=3 } } }
Поскольку XDebug явно отслеживает только номера строк, если вызывается bar (), строка 1 будет выполнена, и у вас будет одна строка источника, так что вы получите 100%охват.Я полагаю, что инструмент отображения графики покажет всю строку как «покрытую».Однако, если условие (a) равно false , второе условие вообще не имеет шансов быть выполненным.Вы могли бы обоснованно утверждать, что был покрыт только 50% кода (первый, если не второй).А графическое отображение неверно, поскольку $ y = 3 показано как покрытое, но это не так, поэтому вы вводите в заблуждение детали.
Чтобы получить более точное число, инструмент должен знать, чтоколичество отдельно управляемых исполняемых блоков кода (называемых "базовыми блоками" в литературе по компилятору) и количество таких блоков, которые были выполнены.В примере foo есть только один базовый блок, и если он будет выполнен, вы должны получить 100% охват всех базовых блоков, а если нет - нулевой процент, независимо от того, как вы форматируете свой код.В примере с баром есть два основных блока (запись функции и $ y = 3 внутри второго if), и вы должны получить покрытие 50%, если второй блок не выполнен, и 100%, если оно есть, независимо ото том, как он отформатирован.
Поскольку я не думаю, что PHPUnit / XDebug понимает основные блоки, я не вижу, как он может дать более точное число.(По статистике, они довольно близки; вы сказали, что ушли на 6%, и если ваша цель - набрать 80%, вам, возможно, придется набрать 74-86% в зависимости от вашего форматирования, чтобы получить 80% «распечатанного» покрытия).
Цена, которую вы платите за решение с базовыми блоками, состоит в том, что покрытие не в терминах «строк исходного кода», а скорее в терминах исполняемых блоков. Я думаю, что последний вариант является более подходящим, но ваш переход можетразличаются, и боссы обычно путаются из-за различий.
Наш инструмент PHP Test Coverage имеет это понятие базовых блоков, полученное путем точного анализа вашего исходного кода компилятором.будет производить более точные числа. Его инструмент отображения также понимает, что в строке может быть несколько операторов, и будет правильно окрашивать выполненные и невыполненные части.