こんにちは。yukiです。
今日はテストや普段の開発に便利なツールのご紹介をしたいと思います。PHP限定のツールですので、ご了承下さい。
ZyngaJapanでは、昨日リニューアルオープンした「ファームビレッジ」でも、Jenkins(旧Hudson)によるCIを行って開発しており、TDDやJenkinsでのCIを利用する文化がだんだんと浸透してきています。Jenkinsのプラグインとして利用できるものも多くありますが、当然ながらコマンドラインからも利用出来ますので、コミット前に自分のコードをチェックすることもできます。
phpcpd
コードの中でコピー&ペーストで記述されている部分を検出してくれます。
どの程度の重複から検出するかを柔軟に設定できるので、まず大きな部分から修正するなど判断ができ便利です。
$ phpcpd /path/to/project phpcpd @package_version@ by Sebastian Bergmann. Found 13 exact clones with 339 duplicated lines in 17 files: - hoge/fuga/Foo.php:55-104 hoge/fuga/Bar.php:85-134 0.50% duplicated lines out of 68425 total lines of code. Time: 10 seconds, Memory: 33.00Mb
phpdcd
どこからもコールされていないメソッドなどを検出してくれます。リファクタリング対象として確認に役立ちます。
$ phpdcd /path/to/project phpdcd 0.9.2 by Sebastian Bergmann. - Foo::execute() declared in Foo.php:42 - Bar::getActionName() declared in Bar.php:27 - Hoge::execute() declared in Hoge.php:34
phploc
以下のようにphpファイルの構成要素を算出してくれます。(数字は全てダミーです)
$ phploc /path/to/project phploc @package_version@ by Sebastian Bergmann. Directories: 999 Files: 9999 Lines of Code (LOC): 999999 Cyclomatic Complexity / Lines of Code: 0.01 Comment Lines of Code (CLOC): 99999 Non-Comment Lines of Code (NCLOC): 999999 Namespaces: 9 Interfaces: 99 Classes: 999 Abstract: 99 (9.99%) Concrete: 999 (99.99%) Average Class Length (NCLOC): 999 Methods: 9999 Scope: Non-Static: 9999 (99.99%) Static: 9 (9.99%) Visibility: Public: 9999 (99.99%) Non-Public: 999 (99.99%) Average Method Length (NCLOC): 99 Cyclomatic Complexity / Number of Methods: 9.99 Anonymous Functions: 99 Functions: 9 Constants: 999 Global constants: 9 Class constants: 999
phpmd
if文のネスト階層数などの複雑さ、短すぎる、または長すぎる変数名や、使われていない変数の検出など様々な条件に応じて検出を行ってくれます。
$ phpmd /path/to/project text codesize,unusedcode,naming /path/to/project/hoge/huga/AAA.php:76 Avoid unused local variables such as '$foo'. /path/to/project/hoge/huga/AAA.php:129 Avoid unused local variables such as '$bar'. /path/to/project/hoge/huga/AAA.php:185 Avoid unused local variables such as '$foo'. /path/to/project/hoge/huga/BBB.class.php:29 Too many fields /path/to/project/hoge/huga/foo/CCC.php:20 Avoid variables with short names like $a /path/to/project/hoge/huga/foo/CCC.php:20 Avoid variables with short names like $b /path/to/project/hoge/huga/foo/EEE.php:5 The method create() has a Cyclomatic Complexity of 12. /path/to/project/hoge/huga/foo/EEE.php:5 The method create() has an NPath complexity of 288. /path/to/project/hoge/huga/foo/FFF.php:10 Avoid unused local variables such as '$type'. /path/to/project/hoge/huga/foo/GGG.php:7 Avoid unused private fields such as '$object'. /path/to/project/hoge/huga/bar/HHH.php:64 Avoid unused parameters such as '$status'. /path/to/project/hoge/huga/bar/HHH.php:74 Avoid unused private methods such as 'setStatus'. /path/to/project/hoge/huga/bar/JJJ.php:26 Avoid unused parameters such as '$status'. /path/to/project/hoge/huga/bar/KKK.php:3 This class has too many methods, consider refactoring it. /path/to/project/hoge/huga/bar/KKK.php:13 Avoid unused parameters such as '$status'. /path/to/project/hoge/huga/bar/LLL.php:44 Avoid unused parameters such as '$status'.
上記はJenkinsのプラグインとして使えるものもありますので、是非検討してみてはいかがでしょうか。