Статьи

Автоматизированные обзоры кода для PHP

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

Например, я слышал от ребят из Ideato, что часто им приходится поддерживать проект по 100 тыс. Строк , и я не знаю, с чего начать его анализ. Таким образом, они используют автоматизированные инструменты, чтобы выяснить, какие из них являются самыми сложными, самыми крупными или непроверенными.

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

В целом, автоматические проверки кода, выполняемые с помощью инструментов, а не человеческого интеллекта, могут стать отправной точкой для поиска проблемных зон кодовой базы. Тогда человек может войти, так как он также должен очистить код: его вмешательство было уже запланировано.

Инструменты

Эти инструменты часто являются следующим шагом для улучшения процесса непрерывной интеграции после тестирования средств автоматизации и сборки / развертывания. В экосистеме PHP эти инструменты медленно созревают и теперь могут использоваться как значения по умолчанию в новом проекте.

В основном речь идет о статическом анализе, выполняемом с исходным кодом, а не с кодом во время выполнения. Обратите внимание, что поскольку вы запускаете эти инструменты на своем компьютере или на сервере CI, вам никогда не придется искать хостинг-сервис, который их поддерживает. Я думаю, что это большой фактор, способствующий их принятию.

Покрытие кода PHPUnit

sudo pear channel-discover pear.phpunit.de
sudo pear install phpunit/PHPUnit

PHPUnit не только полезен для тестирования, но и может использовать возможности xdebug (если они установлены) для генерации отчетов о покрытии кода, которые сообщают вам, сколько классов, методов и строк кода выполнено хотя бы в ходе теста.

PHPUnit также генерирует индекс CRAP (Change Risk Analysis and Prediction), который смешивает покрытие с цикломатической сложностью; этот индекс говорит вам, где находятся болевые точки с высокой сложностью (многие операции, циклы и вызовы методов), которые не проверены надлежащим образом.

PHP_CodeSniffer

sudo pear install PHP_CodeSniffer

PHP_CodeSniffer выполняет статический анализ для выявления нарушений стандартов кодирования. Это действительно хорошо с базовыми точками, такими как длина строки, неправильный отступ, неправильные скобки; при условии, что вы согласны с определением запахов кода.

phpcs также может быть запущен в хуке pre-commit / pre-push для предотвращения вставки кода, нарушающего основные правила кодирования, в репозиторий.
Проблема с phpcs заключается в том, что он не содержит так много сниффов из коробки, но вы можете использовать стандарты Generic, Pear или Zend для обнаружения большей части запахов кода, процитированных ранее:

phpcs --standard=Generic folder/or/file/path 

PHP_Depend

sudo pear channel-discover pear.pdepend.org
sudo pear install pdepend/PHP_Depend

PHP_Depend генерирует статические аналитические графические отчеты, включающие, например, отношения между классами. Для поддержки графической части я использовал пакет php5-imagick ubuntu, который проще в установке, чем расширение ImageMagick, предоставляемое через PECL.

Графические отчеты легко анализировать на глаз, особенно если вы просматриваете их много каждый день. Два образца этих отчетов?

  • График абстрактности / устойчивости дяди Боба для классов (по крайней мере, я впервые увидел его в работах дяди Боба)
  • Обзорная пирамида, содержащая сводку количества методов, классов, строк кода, цикломатической сложности …

 

PHPMD

sudo pear channel-discover pear.phpmd.org
sudo pear channel-discover pear.pdepend.org
sudo pear install --alldeps phpmd/PHP_PMD

PHP Mess Detector использует метрики PDepend, чтобы найти болевые точки, один из случаев использования, которые мы описали ранее; он производит вывод в текстовом или XML-формате. Он работает на повышенном уровне абстракции по отношению к PDepend и особенно к PHP_CodeSniffer.

Вот пример того, что phpmd может вам сказать:

phpmd . text codesize,unusedcode,naming
/home/giorgio/code/practical-php-testing-patterns/CustomAssertionTest.php:2 This class has too many methods, consider refactoring it.
/home/giorgio/code/practical-php-testing-patterns/CustomAssertionTest.php:93    Avoid unused parameters such as '$speed'.
... # more lines of output

Дженкинс Работа шаблон

(Jenkins — это название свободного форка сервера непрерывной интеграции Hudson, после его приобретения Oracle в рамках сделки Sun.)

Использование этих инструментов вручную возможно, но небольшая автоматизация может улучшить опыт; он будет включать их в процесс сборки, чтобы они выполнялись при каждой регистрации и результаты публиковались.

Себастьян Бергманн, один из пионеров обеспечения качества в мире PHP, создал шаблон задания для Jenkins, который автоматически запускает все эти инструменты как часть сборочного файла Ant (стандарт, используемый Jenkins, который в конце концов является инструментом Java).

Он предъявляет множество требований, как к подключаемым модулям Jenkins, так и к инструментам на основе PEAR, доступным на компьютере, но при хорошей интеграции отчеты, которые мы видели в этой статье, автоматически восстанавливаются во время сборки и размещаются Jenkins на своем HTTP-сервере. Также для завершения всех артефактов потребуется немного времени, но именно поэтому у нас есть отдельный сервер для непрерывной интеграции, верно?