rake statsを晒してみる

こんにちは。那由多屋の加藤です。

みなさん、今日も元気にテストコード、書いてますか?

那由多屋では、Webアプリケーションの開発にRuby on Railsを使っています。そんなRailsプロジェクトのテストコードの変遷を、ここに晒して見たいと思います。

なお、各プロジェクトのメトリクスは「rake stats」の出力結果で、テスティングライブラリにはtest/unitを使用しています。

Nayuzonβ(ナユゾン)

2007年3月に公開。プロダクトコードは457行、テストコードは89行、コード比は0.2。Subversionのリビジョン番号は434。

この時点で、Rails歴2ヶ月くらい。テストコードはほとんど無いに等しい。

NTTドコモJavaアプリケーション(iアプリ)であり、Java側のソースコードは2,014行(空行、コメント含む)。

+----------------------+-------+-------+---------+---------+-----+-------+
| Name                 | Lines |   LOC | Classes | Methods | M/C | LOC/M |
+----------------------+-------+-------+---------+---------+-----+-------+
| Controllers          |   289 |   226 |       3 |      19 |   6 |     9 |
| Helpers              |   222 |   195 |       0 |       5 |   0 |    37 |
| Models               |    48 |    36 |       5 |       3 |   0 |    10 |
| Libraries            |     0 |     0 |       0 |       0 |   0 |     0 |
| Components           |     0 |     0 |       0 |       0 |   0 |     0 |
| Integration tests    |     0 |     0 |       0 |       0 |   0 |     0 |
| Functional tests     |    36 |    26 |       4 |       6 |   1 |     2 |
| Unit tests           |    83 |    63 |       4 |       8 |   2 |     5 |
+----------------------+-------+-------+---------+---------+-----+-------+
| Total                |   678 |   546 |      16 |      41 |   2 |    11 |
+----------------------+-------+-------+---------+---------+-----+-------+
  Code LOC: 457     Test LOC: 89     Code to Test Ratio: 1:0.2

それ、Lingrで。(それりん)

2007年6月に公開。プロダクトコードは147行、テストコードは177行、コード比は1.2。リビジョン番号は337。

Rails歴5ヶ月くらい。データベースを使わないWebアプリケーションであり、モデルなし。

ほとんどがJavaScriptで書かれており、JavaScriptの単純行数は1,819行(空行、コメント含む)

+----------------------+-------+-------+---------+---------+-----+-------+
| Name                 | Lines |   LOC | Classes | Methods | M/C | LOC/M |
+----------------------+-------+-------+---------+---------+-----+-------+
| Controllers          |    94 |    69 |       3 |       7 |   2 |     7 |
| Helpers              |    82 |    78 |       0 |       4 |   0 |    17 |
| Models               |     0 |     0 |       0 |       0 |   0 |     0 |
| Libraries            |     0 |     0 |       0 |       0 |   0 |     0 |
| Components           |     0 |     0 |       0 |       0 |   0 |     0 |
| Integration tests    |     0 |     0 |       0 |       0 |   0 |     0 |
| Functional tests     |   215 |   177 |       4 |      15 |   3 |     9 |
| Unit tests           |     0 |     0 |       0 |       0 |   0 |     0 |
+----------------------+-------+-------+---------+---------+-----+-------+
| Total                |   391 |   324 |       7 |      26 |   3 |    10 |
+----------------------+-------+-------+---------+---------+-----+-------+
  Code LOC: 147     Test LOC: 177     Code to Test Ratio: 1:1.2

Stack Stock Books - スタック・ストック・ブックス 〜いっぱい積んでる?〜

2007年8月に公開。プロダクトコードは6,997行、テストコードは19,501行、コード比は2.8。リビジョン番号は2853。

Rails歴7ヶ月くらい。もっとも長くメンテナンスされているコード。

RailsでのWebアプリケーション開発と、テストファーストでの開発にだいぶ慣れてきた感じ。

現在、がりがりとリファクタリング中。

+----------------------+-------+-------+---------+---------+-----+-------+
| Name                 | Lines |   LOC | Classes | Methods | M/C | LOC/M |
+----------------------+-------+-------+---------+---------+-----+-------+
| Controllers          |  5048 |  3959 |      65 |     279 |   4 |    12 |
| Helpers              |   616 |   522 |       0 |      44 |   0 |     9 |
| Models               |  2038 |  1659 |      19 |     138 |   7 |    10 |
| Libraries            |  1102 |   857 |       1 |      67 |  67 |    10 |
| Components           |     0 |     0 |       0 |       0 |   0 |     0 |
| Integration tests    |    93 |    62 |       1 |       1 |   1 |    60 |
| Functional tests     | 15690 | 11379 |     122 |     817 |   6 |    11 |
| Unit tests           | 10382 |  8060 |      29 |     500 |  17 |    14 |
+----------------------+-------+-------+---------+---------+-----+-------+
| Total                | 34969 | 26498 |     237 |    1846 |   7 |    12 |
+----------------------+-------+-------+---------+---------+-----+-------+
  Code LOC: 6997     Test LOC: 19501     Code to Test Ratio: 1:2.8

LDR candle - livedoor Readerの未読数を株式チャート風に表示!

2008年7月に公開。プロダクトコードは958行、テストコードは3,084行、コード比は3.2。リビジョン番号は311。

Rails歴1年6ヶ月くらい。無駄なテストコードが減り、要点を押さえたテストコードを書けるようになってきた頃(な気がする)。無駄なテストコードが減ったため、テストの実行時間がだいぶ短くなった。

+----------------------+-------+-------+---------+---------+-----+-------+
| Name                 | Lines |   LOC | Classes | Methods | M/C | LOC/M |
+----------------------+-------+-------+---------+---------+-----+-------+
| Controllers          |   542 |   404 |       7 |      34 |   4 |     9 |
| Helpers              |    18 |    17 |       0 |       1 |   0 |    15 |
| Models               |   510 |   425 |       7 |      38 |   5 |     9 |
| Libraries            |   158 |   112 |       0 |      16 |   0 |     5 |
| Integration tests    |     0 |     0 |       0 |       0 |   0 |     0 |
| Functional tests     |   631 |   469 |       6 |      39 |   6 |    10 |
| Unit tests           |  3788 |  2615 |       8 |     137 |  17 |    17 |
+----------------------+-------+-------+---------+---------+-----+-------+
| Total                |  5647 |  4042 |      28 |     265 |   9 |    13 |
+----------------------+-------+-------+---------+---------+-----+-------+
  Code LOC: 958     Test LOC: 3084     Code to Test Ratio: 1:3.2

とある非公開プロジェクト

非公開。プロダクトコードは7,072行、テストコードは26,733行、コード比は3.8。リビジョン番号は2097。日々、成長中。

コントローラ内の実装が減り、シンプルで見通しが良くなっています。また、個々のテストの目的が、より明確になっています。

+----------------------+-------+-------+---------+---------+-----+-------+
| Name                 | Lines |   LOC | Classes | Methods | M/C | LOC/M |
+----------------------+-------+-------+---------+---------+-----+-------+
| Controllers          |  2658 |  1971 |      34 |     195 |   5 |     8 |
| Helpers              |   129 |   119 |       0 |       6 |   0 |    17 |
| Models               |  5946 |  4759 |      69 |     395 |   5 |    10 |
| Libraries            |   263 |   223 |       0 |      22 |   0 |     8 |
| Components           |     0 |     0 |       0 |       0 |   0 |     0 |
| Integration tests    |   205 |   145 |       2 |      12 |   6 |    10 |
| Functional tests     | 12844 |  9592 |      66 |     896 |  13 |     8 |
| Unit tests           | 21398 | 16996 |      72 |    1516 |  21 |     9 |
+----------------------+-------+-------+---------+---------+-----+-------+
| Total                | 43443 | 33805 |     243 |    3042 |  12 |     9 |
+----------------------+-------+-------+---------+---------+-----+-------+
  Code LOC: 7072     Test LOC: 26733     Code to Test Ratio: 1:3.8

ふりかえり

Railsを使い始めて丸2年。プロダクトコードとテストコードの比率は0.2→1.2→2.8→3.2→3.8と、改善されてきています。もちろん、行数がすべてではありませんが、一つの指標として。

なんとなく、C0カバレッジが100%近くの時に3.0前後、さらに条件網羅率を高めようとすると3.5前後で推移しているような気がします。

みなさんのコード比は、どんな感じですか?