попытка измерить покрытие простого скрипта с помощью phpdbg

#code-coverage #php-7.4 #phpdbg

Вопрос:

Я пытаюсь измерить тестовое покрытие без тестовой среды, используя phpdbg

Мой тестовый тестовый скрипт выглядит так:

 $ cat hello.php
<?php

if (0) {
  echo "byen";
} else {
  echo "hellon";
}
 

поэтому он просто выводит hello следующим образом:

 $ php hello.php 
hello
 

кстати, это моя версия php

 $ php --version
PHP 7.4.3 (cli) (built: Aug 13 2021 05:39:12) ( NTS )
Copyright (c) The PHP Group
Zend Engine v3.4.0, Copyright (c) Zend Technologies
    with Zend OPcache v7.4.3, Copyright (c), by Zend Technologies
 

Я попытался угадать, как измерить тестовое покрытие этого скрипта с помощью phpdbg , и это то, что я придумал

 $ mkdir coverage
$ phpdbg -qrr hello.php --coverage-html coverage
hello
$ find coverage
coverage/
 

каталог пуст

Я надеялся найти там отчет о покрытии

Кто-нибудь знает, что я должен сделать по-другому?

Ответ №1:

Мое понимание того, как работает покрытие кода в PHP, заключается в том, что отладчик (или phpdbg или Xdebug ) генерирует журнал каждой строки и phpunit может использовать его для синтеза ожидаемого результата (HTML-страница с цветными строками, указывающими, сколько раз эта конкретная строка была нажата и т.д.). На самом деле --coverage-html аргумент не за phpdbg , а за phpunit . В этом посте показан пример полной командной строки, минимальная версия которой будет:

 phpdbg 
  -qrr vendor/phpunit/phpunit/phpunit 
  -c phpunit.xml 
  --coverage-html coverage
 

но, очевидно, это связано с использованием phpunit и запуском тестов, что не соответствует вашему варианту использования.

Мне стало любопытно, как все это работает, и я собрал этот игрушечный инструмент покрытия, который будет работать для очень простого скрипта, который вы предоставили. Результат выглядит примерно так:

  | <?php
 | 
1| if (0) {
0|     echo "byen";
 | } else {
1|     echo "hellon";
 | }
 

но если вы посмотрите Profiler::render_coverage , вы увидите, что было бы не слишком сложно адаптировать это к любому формату вывода, который вы хотите.

Комментарии:

1. вау, спасибо! Я надеялся на другой ответ (отсутствующий аргумент) (потому что я думал, что он будет больше похож nyc на python), но это тоже здорово!

2. Вы также можете взглянуть на выходные phpdbg -qrr -v данные or -O logfile , которые будут выводить строки, коды операций и имена файлов. Однако исходный код PHP не выводится.