改めてCost-Benefit Analysis of Test Automationを読んでみた

システムテストの自動化を行うにあたり、費用対効果（ROI：Return on Investment）がどのくらいあるのかを計算してステークホルダーに説明しなければいけない場面がある。しかし、ROIを正確に測ることは難しく、それゆえ説明に窮する場面も多々見受けられる。

とはいえ「効果があるかはわからないけれどもやりましょう」というのは乱暴なので、一定の説明は必要。かつ、何も知らずに（いいかげんに）ROIの試算をすると、実態から大きく離れた試算をしてしまって判断を誤る可能性もある。

そこで、テスト自動化のROIに関する論文　[Cost Benefits Analysis of Test Automation](https://www.cmcrossroads.com/sites/default/files/article/file/2014/Cost-Benefit%20Analysis%20of%20Test%20Automation.pdf)　※PDF注意　を改めて読んで参考にし、ROIの概算を計算するうえでの良くないパターン・良いパターンについて検討しようと考えた。もっと素直に言うと、本記事は”論文を読んでちょっと考えてみたメモ”にあたる。

”改めて”というのは私が過去に読んだ（理解したとは言い難い）ことがあったのをもう一度読んだよ、というだけの意味合い。



## ROIの計算方法4種類

論文中では、ROIの計算式が4種類紹介されている。これらは全てが推奨されているわけではなく、1から4にかけてだんだんと良くなっていくイメージ。
  

### (1) 手動テストに対する自動テストの実行コストを求める式（同じ回数実行）

テスト自動化のROI計算における「良くない例」のひとつ。
自動テストと手動テスト、それぞれ同じ数だけ作成＆実行するコストを比較している。

- $A_a$：自動テストのコスト
- $A_m$：手動テストのコスト
- $V_a$：テスト仕様書作成とテスト実装にかかる費用
- $V_m$：テスト仕様書作成にかかる費用
- $D_a$：自動テストの実行1回と、その後のinterpretation（ここでは結果確認の意味だと捉えたい）の費用
- $D_m$：手動テストの実行1回の費用
- $n$：テストの実行回数

としたとき、手動・自動のテスト実行コストの比$E_n$を以下のように計算する。

```math
E_n = A_a/A_m = \frac{(V_a + n*D_a)}{(V_m + n*D_m)}
```

$E_n$の値が小さければ小さいほど、自動化による効果が高い＝手動実行時に比べて多くのコストが削減できている、と捉える。

しかし、この計算方法には多くの問題がある。例えば、自動化したテストや自動化環境のメンテナンスコストが考慮されていない。テストを$n$回実行する過程で自動テストが動かなくなることもあるため、上記の単純な計算式でコスト比率を計算はできないはず。

また、その他前提になっている＆その前提がほぼほぼ誤っている点として以下が挙げられる。

- 手動テストと自動テストが同じ回数・頻度実行される前提
- 一般に、自動化したほうが実行回数が増える
- テスト実行1回目とN回目の価値が等しい前提
- 初回の実行のほうが後続の実行よりも問題を見つける可能性が高い
- 手動テストと同数の自動テストを作るリソース（人手の意味と解釈）がある前提
- 多くの場合、ない。そのため、自動化したテストのほうが少なくなりがち。

### (2) 手動テストに対する自動テストの実行コストを求める式（異なる回数実行）

(1)よりはマシなパターン。同じく、手動テストからどのくらいのコストが削減できたか、を見ている。

- $A_a$：自動テストのコスト
- $A_m$：手動テストのコスト
- $V_a$：テスト仕様書作成とテスト実装にかかる費用
- $V_m$：テスト仕様書作成にかかる費用
- $D_a$：自動テストの実行1回と、その後のinterpretation（ここでは結果確認の意味だと捉えたい）の費用
- $D_m$：手動テストの実行1回の費用
- $n_1$：自動テストの実行回数
- $n_2$：手動テストの実行回数

としたとき、手動・自動のテスト実行コストの比$E_n$を以下のように計算する。

```math
E_n = A_a/A_m = \frac{(V_a + n_1*D_a)}{(V_m + n_2*D_m)}
```

手動・自動それぞれの実行回数が異なる点が考慮されている、というところは(1)の計算式よりマシ。一方で、まだ考慮されていない点がある。

- 固定費
- 自動テストのメンテナンス
- テストセットの比率（自動テストと手動テストそれぞれの集合を、$n_1$回および$n_2$回の実行で全実行することになっている。実行ごとにテストケースを選んだりはしない、という前提での計算になっている。）

### (3)時間$t$におけるテスト自動化のROI、一般的な形

(1), (2)とは異なり、手動テストに対するコスト削減比率ではなく、自動化によるROIを計算している。自動化のコストに対する効果（ベネフィット）の比。

```math
ROI_{automation} = \frac{自動化の効果}{自動化のコスト} = \frac{B_a}{C_a}
```

- $B_a$:自動化の効果
- $C_a$:自動化のコスト

ROIの値が1より大きければ、コストに対して効果が上回っているという意味。  

- テストを自動化して
- 実行して
- メンテナンスする

コストが考慮されている。

一方で、テスト自動化の効果を絶対量として計算するのは難しい。
  

### (4)時間tにおける、手動実行時と比較したテスト自動化のROI

相対的なROIの計算式。
自動テストを追加するコストと、自動化によって得られる追加効果を計算している。
(3)と同様、ROI計算として一般的な形でありつつも、手動テストとの相対的な効果（＝手動テストに対する自動化の価値）を計算している。

計算式3本からなる。

```math
ROI_{automation} = \frac{\Delta(手動に対する自動化の効果)}{\Delta(手動に対する自動化のコスト)} \\
= \frac{\Delta B_a}{\Delta C_a}
```

```math
\Delta{B_a}(t) = \Sigma(改善される自動テストの固定コスト \times (t/UsefulLife)) \\
+ \Sigma(期間 t において n_2 回の手動テスト実行にかかる変動コスト) \\
- \Sigma(期間 t において n_1 回の自動テスト実行にかかる変動コスト)
```

```math
\Delta{C_a}(t) = \Sigma(増加する自動テストの固定コスト \times (t/UsefulLife)) \\
+ \Sigma(自動テストの開発にかかる変動コスト) \\
- \Sigma(手動テストの開発にかかる変動コスト) \\
+ \Sigma(自動テストの保守にかかる変動コスト) \times (n_1/N)
```

$ROI_{automation}$は1より大きければリターンが大きいということになる。（期間$t$が経過した時点で、の話）

この$\Delta{B_a}(t)$についての式が自分としては直観的ではなく、読み解くのに少し苦労した。（理解がおかしかったらコメントがほしいです）
$\Delta{B_a}(t)$はテスト自動化によるベネフィット＝効果のことなので、まず自動テストの固定コストについては減るほうが嬉しい。ので、「改善されるコスト」である差分をまずは足している。
次に手動テスト実行にかかる変動コスト。これは、素直に考えると手動テストのコストが増えるほど自動化のベネフィットが大きくなる、ように見えてしまう。おそらくそうではなく、あくまでも変動コストの差分のことを指している。つまり、自動化によって、例えばいままで100時間かかっていた手動テストが60時間に減らせたとする。（そうはならないけれども、ごく単純化すると、総テストケースの4割を自動化できれば、100時間が60時間になるかもしれない。）その場合はここで計算されるのは40時間（分のコスト）ということになる。
次の、自動テスト実行にかかる変動コストは、基本ゼロにはならず、自動化によって「増える」コスト。これは自動化による効果を一部相殺する。特に違和感はない。

ということで、くだけた表現に変えると

```math
\Delta{B_a}(t) = \Sigma(改善される自動テストの固定コスト \times (t/UsefulLife)) \\
+ \Sigma(期間 t において n_2 回手動テスト実行を行う過程で削減できるコスト) \\
- \Sigma(期間 t において n_1 回自動テスト実行を行うのにかかったコスト)
```

となるのではないか。


ただし、この式を使おうと思うと全てのコストと効果を特定する必要がある。細かく測ろうとするとかえって計算が混乱してしまう。
細かい単位まで正確に計算したいわけではなく、「自動化への投資で得をするのか損をするのかが知りたい」が思いのはず。この、損か得かがおおよその値の推定で判断できればよい、と考えよう。

その観点で、上記の式を以下のように置き換えることが可能。

```math
  \Delta{B_a}(t) = \Sigma(改善される自動テストの固定コスト \times (t/UsefulLife)) \\
+ \Sigma(期間 t における手動テスト実行にかかる変動コスト) \\
- \Sigma(時間tの間に自動テストの実行にかかる変動コスト)
```

```math
\Delta{C_a}(t) = \Sigma(増加する自動テストの固定コスト \times (t/UsefulLife)) \\
+ \Sigma(自動テストの開発にかかる変動コスト) \\
- \Sigma(手動テストの作成にかかる変動コスト) \\
+ \Sigma(時間tの間に自動テストのメンテナンスにかかる変動コスト)
```

今回置き換えたように、コストの一般化は合理的である。

## ROIの構成要素

4つの計算式において、以下の要素が出てきた。

- 手動テストの固定コスト
- 自動テストの固定コスト
- 手動テストの変動コスト
- 自動テストの変動コスト
- 自動化の効果

この他に「手動テスト・自動テストに共通するコスト」もあるが、自動化によるROI計算からは除外する。これらは一般的に自動化によって増加するが、手動テストに対しても同様に有益なため。

※論文中での共通コストの記載が少し怪しいように見えた。たとえば不具合報告のコストが、変動コストと共通コストの両方に含まれている。

論文中で挙げられている例は以下。

- 自動テストの固定コスト（固定＝実行頻度やテストケース数に依存しないもの）
	- ハードウェア
	- 自動化ツールのライセンス（論文発行時期的に、昨今のSaaSのようなツールを想定していない。昨今のSaaS型自動化ツールの場合、テストケースや実行頻度が増えるとライセンス費用も増える。）
	- 自動化ツールのサポート
	- 自動テストシステムの設計と実装（原文はEnvironmentだがTAEシラバス的にはTASのことだと思われる）
	- 自動テストシステムのメンテナンス
	- ツール作成
	- 自動化ツールのトレーニング
	- ツール紹介と立ち上げ
- 自動テストの変動コスト
	- 自動化向けのテスト設計
	- テスト実装
	- テストのメンテナンス
	- テストオラクルの作成
	- テスト実行
	- テスト結果分析
	- 不具合報告
	- テスト結果報告
	- 業後の自動実行
- 自動化の効果
	- テスト実行の省力化
	- 業後のテスト実行


手動テストのコストについては特に言及がない。論文中で最も実態に近いと言われている(4)の式（の二番目）では、細かいタスク毎のコストではなく関わる人のコストで試算する形になっている。

※ここまでの話から、エンジニア単価×工数で計算するのは十分合理的、ということだと理解。

- 手動テストの固定コスト
- 手動テストの変動コスト

についてはここでは触れられていない。

自動化の効果については、手動実行からどのくらい効率化されたのか、が主な試算対象となっている。


### 注意が必要な点

既存の手動テストを単純に自動テストに置き換える話、ではない点に注意。自動テストの変動コストに「自動化向けのテスト設計」がある点からもわかる。「本当であれば自動でやるべきなのに今手動でやってしまっているテストを自動化したらどう効率的になるか」のほうが”正しい”考えに近いかもしれない。（若干言葉遊びだけれども）

## 得られる学びとただの感想

まずは、テスト自動化のROI計算において必要な大小項目例が挙がっている点で、自組織のROI計算をするうえで本来必要な項目を見逃しにくくなる、というところが、おそらく一番ミクロな学び。

あとは論文中に書かれているように、コスト、特に変動するコストと、自動化による効果の全てを詳細に特定することはおそらく不可能。得をするのか損をするのか、という元の問いに答えられる程度に抽象化をするのが良い。

参考資料に上げたマネーフォワードさんのROI計算例でも、論文中の(4)式の要素は抑えつつもある程度粒度を大きくして計算している。（もちろんあくまでも外に公開する記事上の都合で、内部ではもっと詳細に試算している可能性はあるけれども）（かくいう自分も内部では細かいROI試算の仕組みを用意している）

また、本論文中で出てきていない効果（不具合修正にかかる開発側のコスト低減効果）などもあり、こう言っては元も子もないけれども「テスト自動化のROIを正確に計算することはほぼ無理」とも言えそう。

個人的には、まだまとまりきっていないものの、テスト自動化による品質コストへの効果、についても興味があるところ。


## 参考

- [テスト自動化ROI試算式の構成要素と5つの例。そしてCBAとは何か：テスト自動化のROIを計算してみよう（2）（1/2 ページ） - ＠IT](https://atmarkit.itmedia.co.jp/ait/articles/1406/13/news016.html)
- [ROIの試算例から見る、日本でテスト自動化が進まない理由：テスト自動化のROIを計算してみよう（終）（1/2 ページ） - ＠IT](https://atmarkit.itmedia.co.jp/ait/articles/1406/27/news047.html)
- [E2E自動テスト導入の第1手としてROIを計算してみた話](https://zenn.dev/moneyforward/articles/500a1a0a3e96ff)