unoh.github.com

PHPで利用出来るテストと開発に便利なツール

2011-03-24 05:41:12 +0000

こんにちは。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のプラグインとして使えるものもありますので、是非検討してみてはいかがでしょうか。