「事業立ち上げではスピード感重視なのでテストは書かない」という台詞をスタートアップでたまに聞く。上場企業でも「テストは割に合わない」と聞いた。
私の意見は「基本的にテストを書くべきで、テストがあった方が開発早い」なのだが、どうも違和感があった。テストに対するコスト感が違いすぎるのである。
テスト書くことでそんなに開発が遅れるわけないだろ、と思っていたが、どうやらテストを書くと本当に遅くなるらしい。
テスト導入を推進する方の記事では、当たり前すぎて意外と語られないので、当たり前なことながら記事にまとめます。
追記: Twitterでご指摘があったのですが、この記事については少なくとも数ヶ月は稼働させる予定のプロダクションを想定して書きました。プロトタイプの段階では色々と異なる点があるため、本記事ではスコープから外します。
三行で
- 「テストを書いた方がよい」に反対する人はテストのコストを異常に高く見積もっている
- 理由は、テストファーストでないと(実装の直後であっても)テストのコストは本当に高いから
- ごく当たり前のことだがテストは実装前に書かなければならない
なぜテストを書くべきか
テストを書くべき理由は軽く済ます。調べればいくらでも出てくる。
個人的には、フルタイムの負債返済係をやった経験が大きい。開発という名目だったが、同僚も含め負債返済と障害対応がほとんどだった。(余談だが、若手のうちにこういう経験をしとくと良い。生涯で書く恥ずかしいコードが格段に減る)
「10行の変更を加えるためにすべてのソースコードを読み直す」という状況を経験すれば、誰だってテストを書くべきと思うはずだ。
「テストを書かない人」がテストを嫌い、テストのコストを高く見積もるのはなぜか
テストを書きたがらない人にとって(テストファーストの概念を知らない人にとって)、テストのコストは本当に高いから。
実装を先にしてしまった時点で、どんなに頑張ってもテストのコストは高い。障害対応係を雇ったほうがマシなくらい高い。
テストを書く前提で書かれないコードは書き直さないとテストを追加できない。
「テストを書く人」が、テストのコストを低く見積もるのはなぜか
テストファーストだとテストを書くコストが低いから。
「最終的にテストを書くコードである」という前提なら、テストを前提としないコードを書くメリットはほぼない。
要するに
私がいう「テストを書く」と、ダメなスタートアップがいう「テストを書く」は全く意味が違う。
- テストを書く人にとってのテストはただの習慣であり、テストなしで開発するほうが遅くなることさえある。
- テストを書かない人にとってのテストは、すでに見かけ上は動いているコードの書き直しであり、二度手間である。
実際のコストは
「コンフリクト頻発」とか「常時障害対応」とか「ソースコードが魔境で改変が命がけ」とか
テストがあればリソース半分以下で済むでしょう。
テストがないコードにテストを書くのは、気が遠くなるほど大変。というかほぼほぼリプレイスになる
追記:テストの品質について
Twitterでエゴサーチしたところ、2パターンでのテスト品質の違いについて記述が欲しいとのコメントがあったため、私の経験を追記します。
私の経験において、テストファーストでないコードに対し実装の変更なしでテストが書かれた事例はほとんど見たことがありません。そういったコードにテストを書いた経験がありますが、リポジトリ単位での結合試験より小さなものを書くためには、実装の書き直しが必要でした。(そういうコードは内部もおかしく、普通に書き直すだけで25%くらい性能が上がった)
以上より、「テストファーストでないコードのテスト品質」という観点は持っていませんでした。書けないので。
スピード感ではなく本物の早さを求める新規開発がやるべきこと
- テストファーストを実践する
- 最低限テストを書く人を雇う
- 理由なくテストを書かない開発者に考えを改めてもらう
追記:開発者がすべきこと
- テストファーストな実装
- テストを書きたがらない人への対応
- テストファーストがない、あるいはテストファーストでないコードに関する仕事を軽々しく引き受けない(おそらくその仕事は思っている以上に大変)
まとめ
「テストを書く」の齟齬を解消しよう。
「テストを書く」の意味は私とあなたで全く異なる。
個人的ToDo
すでに生み出されて動いているレガシーコードにどう立ち向かうか