Edited at

Web / モバイル開発における自動テストの効率性の証明

More than 1 year has passed since last update.

数学的証明っぽいノリで、自動テストのほうが手動テストより正しいことを示してみた。

(数学的に完全ではない。文系に数学的完全性を求めてはいけない。)

英語版も書いてあります。

最初に、変数、というか定数の定義。

a = (1つの機能に対する自動テストの作成時間)

m = (1つの機能に対する手動テスト1回にかかる時間)

ここで、1つの自動テストを作成するのにかかる時間を、1回の手動テストの10倍と定義します。

(そんなにかからないとは思うけど、取り敢えず多めに見積もっておく)

a = 10 × m ... (1)

ここでもう1つ変数を定義。

t = (ソフトウェアに対して行うテストの回数)

そうすると、プロジェクトを通して、その機能に対する手動テストに必要な時間は、(t × m) になるわけです。 ... (2)

自動テストの実行時間は無視できるので、(2) より、以下の式が成立する場合には、自動テストを作成した方が、効率が良いということになります。

a < (t × m) ... (3)

(1) より (3) を式変形して、

(10 × m) < (t × m)

10 < t

つまり、10回以上テストを行わなければならない場合、手動テストより自動テストの方が効率的である、ということになります。

Web サーヴィスやモバイルサーヴィスの場合、Continuous Integration を導入する場合も多いですから、リリースの回数は非常に多くなります。例えば Github のような大規模な企業では、1日に複数回リリースを行っています。(出典 / 日本語訳)

リリースの前には当然全ての機能のテストを行うことが原則です。

当団体は小規模チームで開発を行っていますから、毎日リリースするということはないかもしれません。少なめに見積もって、1週間に1回リリースを行うと仮定しましょう。この場合、そのプロジェクトが10週間以上続くのであれば、自動テストの方が効率的です。

10週間以内で潰れる Web サーヴィスはまずないので (もし潰れたとしたら明らかな失敗である。) 自動テストを作る方が明らかに効率的であると言えるでしょう。

これは Web サーヴィスのような、継続的にメンテナンスされるプロジェクトを前提としていますので、受託開発のような、リリースを1回しか行わないようなプロジェクトでは、手動テストの方が効率的かもしれません。