単体テストの数とコードの行数の関係

興味深い記事を見つけた。

Cyclomatic Complexity and Lines of Code: Empirical Evidence of a Stable Linear Relationship

http://dx.doi.org/10.4236/jsea.2009.23020

コードの行数(LOC)と循環的複雑度には強い相関があるとのことだ。

循環的複雑度とは、プログラム内のif, for, whileといった制御構文の数に1を足した数である。つまり、プログラム内の分岐の数を示している。分岐の多いプログラムは複雑度が高く、分岐の少ないプログラムは複雑度が低い。サブルーチンの循環的複雑度は10ぐらいにしておくのが、最も障害が少ないとのことだ。*1

また、循環的複雑度はプログラム内の分岐の数であるので、C1カバレージを100%にするテストの数と一致している。したがって、単体テストの数の目安は、循環的複雑度と同じぐらいにすればよい。

しかしながら、複雑度という指標を持ちだしたところで、計測も面倒なばかりか、毎回定義から説明しないと通じないわけです。*2

そこで、この調査の結果が有用となります。SourceForgeにあるコードを調査した結果、以下のようにLOCと循環的複雑度の間には強い相関があって、比例関係にあることが示されました。

f:id:fjkz:20160403223105p:plain

CCとLOCの関係は以下の表のようになります。

言語 CC / LOC
C/C++ 0.179
Java 0.187

この数字は単体テストの数の目安にもなります。理想的には1000行あたり190個のテストケースが必要ということです。

それなりに科学的根拠がありそうなテストの数の基準値が導かれました。

*1:Cyclomatic Complexity Revisitedによる。このデータの出処は辿れなかったのでどこまで信用できるか分からないが、感覚とは一致している。小さすぎてもバグが増えるのは、切り分けを細かく過ぎたら部品の数が増えすぎて整理しきれなくなるということだろうか?

*2:LOCも定義がないと指標になりえないと思うけどね。この調査も計測ツールは明記されているが、LOCの定義が書いてないのだよね。最低でも計測ツールぐらいは決めないと度量衡が統一されない。