Вопрос или проблема
У меня есть программа для тестирования, и ей необходимо иметь достойное покрытие кода, включая покрытие по путям.
У меня всё еще есть непроверенный путь. Вот код:
if (0 == count($arr)) {
return -1;
}
for ($i = 0; $i < count($arr); $i++) {
// сделать что-то
}
PHPUnit говорит мне, что мне не хватает пути, где я не вхожу в if
и 0 раз не захожу в цикл for
. Вы и я можем увидеть, что это невозможно, но как мне сказать PHPUnit игнорировать этот путь?
.
Ответ или решение
Чтобы сообщить PHPUnit, что определённый путь в вашем коде невозможен для покрытия, вы можете использовать аннотацию PHP, известную как @codeCoverageIgnore
. Это позволит вам исключить конкретные части кода из анализа покрытия тестами.
В вашем случае, у вас есть следующий код:
if (0 == count($arr)) {
return -1;
}
for ($i = 0; $i < count($arr); $i++) {
// do something
}
В данном фрагменте кода существует вторая ситуация, когда count($arr)
возвращает ноль. Если массив пуст, условие if (0 == count($arr))
будет истинным, и программа выполнит возврат -1
, минуя цикл for
. Тем не менее, PHPUnit указывает, что существует путь выполнения, который не был протестирован, когда if
не выполняется, и цикл for
не выполняется, поскольку массив тоже пуст.
Чтобы сообщить PHPUnit, что эту часть кода можно проигнорировать в контексте покрытия, вы можете сделать следующее:
- Использование аннотации
@codeCoverageIgnore
: Эта аннотация говорит PHPUnit не учитывать эту часть кода при расчёте покрытия.
Пример применения:
/**
* @codeCoverageIgnore
*/
if (0 == count($arr)) {
return -1;
}
for ($i = 0; $i < count($arr); $i++) {
// do something
}
В этом примере аннотация @codeCoverageIgnore
помещена перед условием if
. Это означает, что PHPUnit будет игнорировать эту строку при просчёте покрытия, что решает вашу проблему.
- Использовать
@codeCoverageIgnoreStart
и@codeCoverageIgnoreEnd
: Если вы хотите игнорировать больше строк кода, вы можете использовать эти аннотации для начала и конца блока кода.
/**
* @codeCoverageIgnoreStart
*/
if (0 == count($arr)) {
return -1;
}
/**
* @codeCoverageIgnoreEnd
*/
for ($i = 0; $i < count($arr); $i++) {
// do something
}
Таким образом, вы информируете PHPUnit о том, что этот участок кода не нуждается в тестировании. Это полезно, если вы хотите сохранить активные проверки в остальных частях кода в то же время.
Заключение
С помощью аннотаций @codeCoverageIgnore
и связанных с ними, вы можете эффективно управлять тем, какие участки кода PHPUnit должен учитывать при вычислении покрытия. Это особенно полезно, когда машинные ограничения или бизнес-логика не позволяют тестировать определённые сценарии. Остальные ваши тесты смогут сосредоточься на более актуальных путях, обеспечивая оптимальное покрытие вашей программы.