Обнаружение мертвого кода в PHP
У меня есть проект с очень грязным кодом - много дублирования и мертвого кода здесь и там.
Некоторое время назад на модульных тестах было нулевое покрытие кода, но теперь мы пытаемся написать весь новый код в T.D.D. способ и снижение технического долга путем покрытия "старого" кода с помощью модульных тестов (тест-последний метод).
Сложность бизнес-логики довольно высока, и иногда никто не может ответить, используются ли какие-то методы или нет.
Как можно найти эти методы мертвого кода? Обширная регистрация? Более высокий охват тестирования? (Это не очень просто, потому что клиенты хотят, чтобы новые функции выходили)
Ответы
Ответ 1
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.
?>
Ответ 2
Немного поздно, но PHPDCD утверждает, что делает это статически, что должно дать вам гораздо более информативный результат, чем Выполнение фактического кода профиля с помощью xprof/xdebug.
Ответ 3
Я не знаю способа обнаружения полностью неиспользуемого кода, который может оказаться вне возможностей всех инструментов. Но с точки зрения инструментов там, нажмите http://phpqatools.org/ для хорошего изложения их.
-
До сих пор один из моих фаворитов в phploc, который разрывает ваш код с объектно-ориентированной точки зрения и дает вам подробную информацию о том, сколько классов против количества функций против количества тестов против среднего loc для каждой функции против Cyclomatic Complexity.
-
Мой следующий фаворит - phpcpd, который является "PHP Copy-Paste Detector". Он расшифровывает всю вашу базу кода, ищет общие подписи и предоставляет список файлов с номерами строк.
-
На этой странице есть много других инструментов, выберите те, которые вам полезны.
Мы активно используем эти инструменты в web2project, и за два года с тех пор, как мы раздвоены из dotProject, мы опустились 35% кодовой базы от рефакторинга, устраняя дублирование (первоначально 12%, теперь около 2,5%) и в целом лучше структурирует. И это подсчет наших 15k + строк Unit Tests.:)
Ответ 4
Я бы порекомендовал работать через систему с профайлером xdebug (http://xdebug.org/docs/profiler).
Пропустите систему, чтобы просмотреть журналы с http://code.google.com/p/webgrind/ и физически увидеть, что называется.
Ответ 5
Что касается инструментов профилирования, если вы решите пойти таким путем, вы можете взглянуть на xhprof
http://developers.facebook.com/xhprof/
Он имеет меньшие размеры выходных файлов и веб-интерфейса, которые вы можете внедрить в свое приложение для непрерывного отслеживания. Он способен генерировать визуальное представление дерева вызовов. Я рекомендую его для xdebug
для этой цели.
Ответ 6
См. Инструмент покрытия PHP PHP Test Coverage Tool. Вы реализуете свой код любым способом, в том числе (или нет), запуская тестовые пакеты любым способом. В конце выполнения вы можете увидеть, какой код был выполнен (на сайте есть скриншоты). Код, который не выполняется, может быть мертвым и требует некоторого анализа с вашей стороны, но если вы хорошо выполняете систему, неисполненный код является обработчиком ошибок или действительно мертвым. Средство проверки PHP-теста не требует каких-либо изменений на вашем сервере PHP.
Инструмент SD CloneDR находит дубликат кода на очень больших исходных кодах. Он чувствителен к языку (охватывает C, С++, Java, С#, Ada, Fortran, а также PHP4 и PHP5), поэтому его не обманывают изменения форматирования, пробелов или наличия или отсутствия комментариев. Он обнаружит точные копии клонов и близкие клоны. На веб-сайте показаны примеры клонирования для нескольких языков.
Ответ 7
Я считаю, что кто-то внедрил аромат Structure101g, который использует данные xdebug - s101 затем обнаружит любые неиспользуемые кластеры, то есть файлы, которые используют друг друга, но отключены от основной кодовой базы.