2009-11-22 1 views
31

У меня есть проект с очень грязным кодом - много дублирования и мертвого кода здесь и там.Обнаружение мертвого кода в PHP

Некоторое время назад на модульных тестах было нулевое покрытие кода, но теперь мы пытаемся написать весь новый код в T.D.D. манере и снижению технического долга путем покрытия «старого» кода с помощью модульных тестов (тест-последняя техника).

Сложность бизнес-логики довольно высока, и иногда никто не может ответить, используются ли какие-либо методы или нет.

Как можно найти методы этого мертвого кода? Обширная регистрация? Более высокий уровень охвата тестированием? (Это не очень просто, потому что клиенты хотят, чтобы у них появились новые функции).

ответ

12

xdebug Инструменты для охвата кода кода позволяют вам проверять, какие строки кода выполняются фактически, без необходимости указывать инструкции трассировки во всех функций/методов.

Пример:

<?php 
    xdebug_start_code_coverage(); 

    function a($a) { 
     echo $a * 2.5; 
    } 

    function b($count) { 
     for ($i = 0; $i < $count; $i++) { 
      a($i + 0.17); 
     } 
    } 

    b(6); 
    b(10); 

    var_dump(xdebug_get_code_coverage()); // array '/path/file.php' => array line_number => int 1 or 0. 
?> 
+0

Ben, могу ли я использовать его для кода, который не распространяется на модульные тесты? – ep3static

+3

«Покрытие кода» в смысле xdebug не означает охват тестированием. Эти два не связаны, поэтому вы можете использовать это, чтобы увидеть, какие строки выполняются, независимо от того, тестируются они или нет. –

+0

Вы можете получить данные о охвате кода во время тестов, просто включив сбор данных о покрытии кода прямо перед запуском всех своих тестов и сразу же отключите его. – Ether

3

Я не знаю способа обнаружить код, который полностью не используется, что может быть за пределами возможностей всех инструментов там. Но с точки зрения инструментов там, нажмите http://phpqatools.org/ за хорошее изложение их.

  • До сих пор один из моих любимых в phploc, который разрывает свой код с точки зрения объектно-ориентированным и дает вам подробную информацию о том, как много классов против как многих функций по сравнению, как много испытаний против среднего LOC на функцию против цикломатической сложности ,

  • Мой следующий фаворит - phpcpd, который является «PHP Copy-Paste Detector». Он расшифровывает всю вашу базу кода, ищет общие подписи и предоставляет список файлов с номерами строк.

  • Есть лоты других инструментов на этой странице, выберите те, которые вам полезны.

Мы активно используем эти инструменты в web2project и в течение двух лет с тех пор мы раздвоенными от Dotproject, мы упали примерно на 35% от кодового от рефакторинга, устранение дублирования (первоначально 12%, в настоящее время около 2,5 %), и в целом лучше структурировать. И это , подсчитывая наших 15k + линий тестов единиц. :)

+0

Не удается получить DNS-адрес phpqatools.org. –

2

Что касается инструментов профилирования, если вы решили идти по этому пути, вы можете взглянуть на xhprofhttp://developers.facebook.com/xhprof/
Он имеет меньший размер выходных файлов и веб-интерфейс, который можно встраивать в свое приложение для непрерывного отслеживания. Он способен генерировать визуальное представление дерева вызовов. Я рекомендую для этого более xdebug.

0

Я считаю, что кто-то внедрил аромат Structure101g, который использует данные xdebug - s101 затем обнаружит любые неиспользуемые кластеры, то есть файлы, которые используют друг друга, но будут отключены от основной кодовой базы.

2

См. SD PHP Test Coverage Tool. Вы реализуете свой код любым способом, в том числе (или нет), запуская тестовые пакеты любым способом. В конце выполнения вы можете увидеть, какой код был выполнен (на сайте есть скриншоты). Код, который не выполняется, может быть мертвым и требует некоторого анализа с вашей стороны, но если вы хорошо выполняете систему, неисполненный код является обработчиком ошибок или действительно мертвым. Средство проверки теста PHP не требует любых изменений на ваш PHP-сервер.

Инструмент SD CloneDR находит дубликат кода на очень больших исходных кодах. Он чувствителен к языку (охватывает C, C++, Java, C#, Ada, Fortran, а также PHP4 и PHP5), поэтому его не обманывают изменения форматирования, пробелов или наличия или отсутствия комментариев. Он обнаружит точные копии клонов и близкие клоны. На веб-сайте показаны примеры клонирования для нескольких языков.

13

Сейчас немного поздно, но PHPDCD заявляет, что делает это статически, что должно дать вам более информативный результат, чем профилировать фактическое выполнение кода с помощью xprof/xdebug.

+3

Он работает статически, поэтому он не работает для анонимных материалов, таких как методы переменных ($ object -> $ method) или call_user_func(). Это помогает, но это далеко не идеально. –

+1

Да, статический инструмент никогда не сможет справиться с этим надежно, к сожалению, поскольку фактическое поведение определяется только во время выполнения. –

+1

'phpdcd.phar --exclude vendor --recursive .' работает для меня. –