Do You PHP はてブロ

Do You PHPはてなからはてブロに移動しました

どれぐらいテストコード書いてるのか、phplocで調べてみた

本体のコードの679倍もあるテストコードとは。。。


3月に公開された最新バージョンのSQLite 3.6.23。本体のソースコードは約6万7200行(67.2KSLOC、Kilo Source Lines of Code:空行やコメントを除いた行数)なのに対し、テストコードはなんと4567万8300行(45678.3KSLOC)だと紹介されているのです! これはテストコードが本体の約679倍もの大きさだということになります。

現在担当している自社サービスのサーバ側アプリについてはテストコードを書いてますが、LOCでどれぐらいなのか計ったことなかったので、phplocで調べてみました。

phplocって?

PHPUnitの作者であるSebastian Bergmann氏が作成したLOC/CLOC/NCLOCを計測するツールです。この辺を参照。

phplocのインストール

まずは、phplocのインストール。手順は、この辺を参照。

# pear channel-discover pear.phpunit.de
# pear channel-discover components.ez.no
# pear install phpunit/phploc
# phploc
phploc 1.5.1 by Sebastian Bergmann.

Usage: phploc [switches] <directory|file> ...

  --count-tests            Count PHPUnit test case classes and test methods.

  --log-xml <file>         Write result in XML format to file.

  --exclude <directory>    Exclude <directory> from code analysis.
  --suffixes <suffix,...>  A comma-separated list of file suffixes to check.

  --help                   Prints this usage information.
  --version                Prints the version and exits.

  --verbose                Print progress bar.
# 

計測

とりあえず、ユーザーが利用する側のロジック部分だけを対象にやってみました。symfony本体のコードやActionクラス、テンプレート、ORMで生成されたコードなど、他のクラスやファイルは含まれてません。まずは、テスト以外のコード。

$ phploc --suffixes .class.php /path/to/logic/
phploc 1.5.1 by Sebastian Bergmann.

Directories:                                         23
Files:                                              631

Lines of Code (LOC):                              56619
  Cyclomatic Complexity / Lines of Code:           0.06
Comment Lines of Code (CLOC):                     20652
Non-Comment Lines of Code (NCLOC):                35967

Namespaces:                                           0
Interfaces:                                           8
Classes:                                            623
  Abstract:                                          43 (6.90%)
  Concrete:                                         580 (93.10%)
  Average Class Length (NCLOC):                      62
Methods:                                           2768
  Scope:
    Non-Static:                                    2440 (88.15%)
    Static:                                         328 (11.85%)
  Visibility:
    Public:                                        1338 (48.34%)
    Non-Public:                                    1430 (51.66%)
  Average Method Length (NCLOC):                     13
  Cyclomatic Complexity / Number of Methods:       1.82

Anonymous Functions:                                  0
Functions:                                            0

Constants:                                          144
  Global constants:                                   0
  Class constants:                                  144
$ 

次にテストコードだけ。ちなみに、テスティングフレームワークはPHPUnit3使ってます。

$ phploc --suffixes Test.php /path/to/logic/
phploc 1.5.1 by Sebastian Bergmann.

Directories:                                         19
Files:                                              644

Lines of Code (LOC):                             110472
  Cyclomatic Complexity / Lines of Code:           0.01
Comment Lines of Code (CLOC):                     15225
Non-Comment Lines of Code (NCLOC):                95247

Namespaces:                                           0
Interfaces:                                           0
Classes:                                            644
  Abstract:                                           0 (0.00%)
  Concrete:                                         644 (100.00%)
  Average Class Length (NCLOC):                     145
Methods:                                           5610
  Scope:
    Non-Static:                                    5610 (100.00%)
    Static:                                           0 (0.00%)
  Visibility:
    Public:                                        4259 (75.92%)
    Non-Public:                                    1351 (24.08%)
  Average Method Length (NCLOC):                     16
  Cyclomatic Complexity / Number of Methods:       1.16

Anonymous Functions:                                  0
Functions:                                            0

Constants:                                           10
  Global constants:                                   0
  Class constants:                                   10
$ 

まとめ

LOC比で、56619:110472。2倍弱かぁ。コメントを含まないNCLOC比だと、35967:95247ということで2.6倍強。うーん、テストコードのメンテコスト(というより労力・めんどくささw)の割に、意外と量は書いてないのか。。。まあ、重点的にテストやるところとそうでないところを区別してるので、カバレッジ100%じゃないしなぁ。。。
ただ、あちこちで言ってますけど、テストがあること/テストをパスすることで積極的に本体のメンテができるのは、精神衛生上ものすごくいいですよ。もうテストがないと本体のメンテが不安な身体です。