Как я могу сообщить PHPUnit, что путь невозможно покрыть?

Вопрос или проблема

У меня есть программа для тестирования, и ей необходимо иметь достойное покрытие кода, включая покрытие по путям.

У меня всё еще есть непроверенный путь. Вот код:

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, что эту часть кода можно проигнорировать в контексте покрытия, вы можете сделать следующее:

  1. Использование аннотации @codeCoverageIgnore: Эта аннотация говорит PHPUnit не учитывать эту часть кода при расчёте покрытия.

Пример применения:

/**
 * @codeCoverageIgnore
 */
if (0 == count($arr)) {
    return -1;
}

for ($i = 0; $i < count($arr); $i++) {
    // do something
}

В этом примере аннотация @codeCoverageIgnore помещена перед условием if. Это означает, что PHPUnit будет игнорировать эту строку при просчёте покрытия, что решает вашу проблему.

  1. Использовать @codeCoverageIgnoreStart и @codeCoverageIgnoreEnd: Если вы хотите игнорировать больше строк кода, вы можете использовать эти аннотации для начала и конца блока кода.
/**
 * @codeCoverageIgnoreStart
 */
if (0 == count($arr)) {
    return -1;
}
/**
 * @codeCoverageIgnoreEnd
 */

for ($i = 0; $i < count($arr); $i++) {
    // do something
}

Таким образом, вы информируете PHPUnit о том, что этот участок кода не нуждается в тестировании. Это полезно, если вы хотите сохранить активные проверки в остальных частях кода в то же время.

Заключение

С помощью аннотаций @codeCoverageIgnore и связанных с ними, вы можете эффективно управлять тем, какие участки кода PHPUnit должен учитывать при вычислении покрытия. Это особенно полезно, когда машинные ограничения или бизнес-логика не позволяют тестировать определённые сценарии. Остальные ваши тесты смогут сосредоточься на более актуальных путях, обеспечивая оптимальное покрытие вашей программы.

Оцените материал
Добавить комментарий

Капча загружается...