神を信じますか? 自動テストを信じていますか?
- 自動テストに対する2つの派閥
- 自動テスト懐疑論
- よく言われる自動テストの効能
- 自動テストの本来の効能
- 自動テストせざるを得ない状況がある
- 自動テスト論の問題は、適用範囲の問題
- 「コードがきれいになる」のおかしさ
- テストコードを過信してはいけない
- 使い捨てで良いのでは?
自動テストに対する2つの派閥
自動テスト(Unitテスト)は二つの勢力があります。
信者
自動テストを書かないと地獄に落ちる派
懐疑派
自動テストのメリットを信じていない派
ちなみに最大勢力は「自動テストを信じているけど、今はやれていない派」です。
地獄に落ちないように、会社に対して呪いをかけることで精神の安定を保っています。
懐疑派はあまり声を大にして自動テストを否定しません。戦争になるので。
ただひたすらゴニョゴニョ言って信者を妨害します。
これらの戦いは、かれこれ20年以上は続いているのではないかと思います。
自動テスト懐疑論
冗談はここらへんにして。
私の最近の主張は「自動テストは良いツールだが、世の中の信者は期待しすぎている」です。
ちなみにこれはデザインパターン(MVVMとかMVPとかクリーンとか)に対しても同じ立場です。銀の弾丸はありません。
こう言うと、信者には「それは当たり前だ、でも自動テスト書いていないのはあり得ない」と言われるのですが、私の信じている自動テストはもっと狭い領域です。
よく言われる自動テストの効能
よく言われるものですが。
- 品質向上
- 速度向上
- コードがきれいになる
- 仕様書の代わりになる
ここらへんでしょうか。
これらについては非常に懐疑的です。温泉の効能くらい信じていません。
どうにも結果的に起きる副次効果でしかなく、これらの項目ってテストし辛いんですよね。
正直肯定も否定もしづらいです。
自動テストの本来の効能
- 大量のテストが可能
- 深い領域のテストが可能
- モジュール単位でテストが可能
これです。
自動テストについてまとめられた本やドキュメントなどには、普通にこのように書かれています。よく言われる、何か病気が治る的な謎効能は書いていないはずです。
自動テストせざるを得ない状況がある
テスト(手動、自動)というのはザックリ言えば、ある条件に対して入力と出力を得ることでチェックすると思います。
ですが、
- 手動では入力できない
- 入力が大量になってしんどい
- 何度も同じテストを行わなければならない
- モジュール毎にテストが必要
と言った状況が発生します。
この時にテストを使います。使わないというのは、テストしないということです。
自動テスト論の問題は、適用範囲の問題
問題なのは、目的となる効能が本来のものとは異なる点に置かれているため、本来必要性の薄い箇所にまで自動テストを適用してしまう点です。
なぜそんな厄介なことになっているかと言えば、おそらく
- ジャンルによって自動テスト必須対象の差が大きい(ほとんど全部だったり、ほとんど無かったり)
- 何が自動テスト必要かについてあまり語られていない(手動テストと分けられていない)
- 副次的な効能が、そもそも計測しづらい
- やらなきゃいけない雰囲気
ここらへんだと思います。皆混乱しているだけです。
特にバックエンド側の開発を中心にされている方は信じられないかもしれませんが、自動テスト必須とするような箇所が殆どないプログラムというのは結構存在します。
(※ここではUITestを無視しています。あちらはまた別の文脈になるので)
具体的に言えば、フロントエンドやアプリなどでは効果が薄いです。もちろんゼロではありませんが。
「コードがきれいになる」のおかしさ
ここらへんはTDDの話なのかもしれません。
自動テストが可能なコード = 綺麗なコード
ではないし、綺麗なコードを書けば自動テストが楽になるわけでもないです。
両者は確かに少し被っていますが、人間はテストコードではないので、人間にとって読みやすいコードと、テストが読みやすいコードは違います。
却って難しくなるケースも多々あります。
もちろん難しくなるケースにおいて、テストが必須な対象であれば仕方ないのですが、テストが必須ではない対象なら難しくするのはむしろ品質と速度を落とすのではないでしょうか。
テストコードを過信してはいけない
私達は、コードに不安があるからテストコードを書くし、手動テストを書きます。
ですがテストコードのテストは基本的にされません。
手動テストであれ、自動テストであれ、正しさというのは限界があります。
数学的に正しいプログラムというのも研究されていますが、極狭い領域しか担保できないらしいです。用途不明だったり、大量だったりするテストコードは却ってプロジェクトの足をひっぱるかもしれません。(ただしそれを計測するのは難しいです)
使い捨てで良いのでは?
どうしても自動というと、「効率化」「品質向上」「速度向上」という側面が期待されてしまいますが、上で書いた通り本来の自動テストの効果は「テストができる」という点に集約されます。
結果的にテストの再利用が可能なこともあるでしょうが、基本的に自動テストは使い捨てする気持ちでいいのではないかと思っています。
コードの方だけ修正した時、テストが通るかどうか確認して、通ったら安心するというのはオカシイです。自動テストコードが正しいか、都度チェックしなければなりません。でもそうするとチェック対象が大量になるし、影響範囲がわけわからなくなりませんか?? 技術的負債になると思うんですが。
あわせてよみたい