Praktyka ciągłej inspekcji rozszerza ideę ciągłej integracji przez przeprowadzanie kontroli kodu za każdym razem gdy jest on zmieniany. Możliwa jest detekcja niepożądanych zmian w kodzie takich jak np. zwiększające się skomplikowanie kodu i dostrzeżenie tych zmian zanim ich odwrócenie stanie się zbyt kosztowne.
Metryki oprogramowania.
Do śledzenia rozmiarów metryk projektu takich jak np. ilość linii kodu (LOC – Lines of Code) służyć może phploc.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
<target name="phploc" unless="phploc.done" description="Measure project size using PHPLOC and print human readable output. Intended for usage on the command line."> <exec executable="${phploc}" taskname="phploc"> <arg value="--count-tests" /> <arg path="${basedir}/src" /> <arg path="${basedir}/tests" /> </exec> <property name="phploc.done" value="true"/> </target> <target name="phploc-ci" unless="phploc.done" depends="prepare" description="Measure project size using PHPLOC and log result in CSV and XML format. Intended for usage within a continuous integration environment."> <exec executable="${phploc}" taskname="phploc"> <arg value="--count-tests" /> <arg value="--log-csv" /> <arg path="${basedir}/build/logs/phploc.csv" /> <arg value="--log-xml" /> <arg path="${basedir}/build/logs/phploc.xml" /> <arg path="${basedir}/src" /> <arg path="${basedir}/tests" /> </exec> <property name="phploc.done" value="true"/> </target> |
Wg powyższego przykładu PHPLOC będzie logował do pliku CSV i XML. Dane z plików mogą być plotowane przez plugin Jenkinsa Plot.
Innym narzędziem do obliczania szerokiej gamy metryk oprogramowania jest PHP_Depend. Poniżej przykład jak wywołać to narzędzie z poziomu Ant:
1 2 3 4 5 6 7 8 9 10 11 12 |
<target name="pdepend" unless="pdepend.done" depends="prepare" description="Calculate software metrics using PHP_Depend and log result in XML format. Intended for usage within a continuous integration environment."> <exec executable="${pdepend}" taskname="pdepend"> <arg value="--jdepend-xml=${basedir}/build/logs/jdepend.xml" /> <arg value="--jdepend-chart=${basedir}/build/pdepend/dependencies.svg" /> <arg value="--overview-pyramid=${basedir}/build/pdepend/overview-pyramid.svg" /> <arg path="${basedir}/src" /> </exec> <property name="pdepend.done" value="true"/> </target> |
O metrykach oprogramowania można poczytać tutaj.
Zduplikowany kod.
Utrzymanie kodu, który jest zduplikowany jest zdecydowanie trudniejsze, ponieważ wszystkie duplikaty muszą być spójne ze sobą, natomiast błędy znalezione w zduplikowanym kodzie muszą być poprawiane w wielu miejscach. PHP Copy/Paste Detector może być używany do automatycznej detekcji zduplikowanego kodu w projektach PHP.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
<target name="phpcpd" unless="phpcpd.done" description="Find duplicate code using PHPCPD and print human readable output. Intended for usage on the command line before committing."> <exec executable="${phpcpd}" taskname="phpcpd"> <arg path="${basedir}/src" /> </exec> <property name="phpcpd.done" value="true"/> </target> <target name="phpcpd-ci" unless="phpcpd.done" depends="prepare" description="Find duplicate code using PHPCPD and log result in XML format. Intended for usage within a continuous integration environment."> <exec executable="${phpcpd}" taskname="phpcpd"> <arg value="--log-pmd" /> <arg path="${basedir}/build/logs/pmd-cpd.xml" /> <arg path="${basedir}/src" /> </exec> <property name="phpcpd.done" value="true"/> </target> |
Naruszenie standardów kodowania.
W każdym rozwijanym projekcie ważne jest aby zespół używał jednolitego standardu kodowania. Wspólny standard kodowania pozwala na skupianiu się tylko na takich problemach jakie mają znaczenie dla projektu zamiast głowić się nad zrozumieniem innych stylów kodowania. PHP_CodeSniffer to narzędzie do wykrywania naruszeń standardów formatowania kodu. Dostarcza ono setki próbek, z których każda sprawdza jedną właściwość kodu. Możliwe jest zdefiniowanie własnego zestawu reguł lub używanie reguł wbudowanych takich jak PEAR lub Zend.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
<target name="phpcs" unless="phpcs.done" description="Find coding standard violations using PHP_CodeSniffer and print human readable output. Intended for usage on the command line before committing."> <exec executable="${phpcs}" taskname="phpcs"> <arg value="--standard=PSR2" /> <arg value="--extensions=php" /> <arg value="--ignore=autoload.php" /> <arg path="${basedir}/src" /> <arg path="${basedir}/tests" /> </exec> <property name="phpcs.done" value="true"/> </target> <target name="phpcs-ci" unless="phpcs.done" depends="prepare" description="Find coding standard violations using PHP_CodeSniffer and log result in XML format. Intended for usage within a continuous integration environment."> <exec executable="${phpcs}" output="/dev/null" taskname="phpcs"> <arg value="--report=checkstyle" /> <arg value="--report-file=${basedir}/build/logs/checkstyle.xml" /> <arg value="--standard=PSR2" /> <arg value="--extensions=php" /> <arg value="--ignore=autoload.php" /> <arg path="${basedir}/src" /> <arg path="${basedir}/tests" /> </exec> <property name="phpcs.done" value="true"/> </target> |
PHP Mess Detector skupia się nie na naruszeniu standardów formatowania kodu ale na takich kwestiach jak możliwe bugi, kod trudny do utrzymania, nieużywane parametry i zmienne, nie używane metody. Dostarcza wiele reguł, które sprawdzają konkretną właściwość kodu. Można także ustalać własne reguły.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
<target name="phpmd" unless="phpmd.done" description="Perform project mess detection using PHPMD and print human readable output. Intended for usage on the command line before committing."> <exec executable="${phpmd}" taskname="phpmd"> <arg path="${basedir}/src" /> <arg value="text" /> <arg path="${basedir}/build/phpmd.xml" /> </exec> <property name="phpmd.done" value="true"/> </target> <target name="phpmd-ci" unless="phpmd.done" depends="prepare" description="Perform project mess detection using PHPMD and log result in XML format. Intended for usage within a continuous integration environment."> <exec executable="${phpmd}" taskname="phpmd"> <arg path="${basedir}/src" /> <arg value="xml" /> <arg path="${basedir}/build/phpmd.xml" /> <arg value="--reportfile" /> <arg path="${basedir}/build/logs/pmd.xml" /> </exec> <property name="phpmd.done" value="true"/> </target> |
Dokumentacja kodu.
Dobrze napisany zorientowany obiektowo kod powinien dokumentować się sam. PhpDox to narzędzie, które wydobywa informacje z kodu i przedstawia je w formacje HTML. Domyślnie phpDox używa PHP-Parsera do zbierania informacji o kodzie PHP. Informacje te składowane są w dokumentach XML, które mogą być wzbogacone o dane z zewnętrznych źródeł takie jak logi XML, PHP_CodeSniffer, PHP Mess Detector (PHPMD) lub PHPUnit. Finalnie wszystkie informacje renderowane są do postaci HTML.
Przykład wywołania phpDox ze skryptu build Apache Ant.
1 2 3 4 5 6 7 |
<target name="phpdox" unless="phpdox.done" depends="phploc-ci,phpcs-ci,phpmd-ci" description="Generate project documentation using phpDox"> <exec executable="${phpdox}" dir="${basedir}/build" taskname="phpdox"/> <property name="phpdox.done" value="true"/> </target> |