とあるIT屋の独白

ITや経営について主に書きます

テストコードの価値について考えてみる

テストコードを書くことについて、一昔前と比べると認知されるようになってきて、その有効性を否定する人は少ないかなと感じます。ただ、それがどういう価値を生むか、なんでテストコードを書くべきなのか、という点は個人的にあまり掘り下げられてなかったので、今回少し書いてみたいと思います。
まずは、そもそもテストコードとは何かという点について、下記のスライドにまとめられています。「テストコードとは書いたプログラムについて、そのロジックが想定通りの動きをしているか 確認するためのプログラム」となります。基本はメソッド単位での実行になって、インプットとして渡す引数が想定取りに処理されて結果が返ってくることを確認します。

【テストコード入門】
https://www.slideshare.net/sh-ogawa/ss-72206317


テストコードでは実装したロジックを全て通さなければいけないか、というとそうではありません。下記の記事にある通り、ある程度は濃淡をつけないと工数ばかりが膨らんで、本質なところに時間がさけないという状態になってしまいます。基本的にテスト対象は重要な機能であったりとか、テストを通さないと不安といった箇所をメインにしていく感じになります。

【【初心者向け】テストコードの方針を考える(何をテストすべきか?どんなテストを書くべきか?)】
https://qiita.com/jnchito/items/2a5d3e15761fd413657a

さて、そんなテストコードですが多くの現場で運用されていると思います。現場にジョインした時に、すでにテストコードが運用されているという状況も珍しくないと思います。それは悪いことではないのですが、下記の記事でt_wadaさんが指摘している通り、あまり深く考えずにカバレッジを追い求めるような方向にも行ってしまいがちになってしまうリスクもあります。記事にもある本来的に目指すべきテストコードは「ソフトウェアの設計をより良くするための足掛かり」であるはずが、ルーティンになってしまっているかもしれません。

【希薄化したTDD、プロダクトの成長のために必要なものは?】
https://twop.agile.esm.co.jp/what-do-we-need-for-growth-of-future-65c43b5a8fe2


テストコードの役割として品質面と設計面があって、設計面をより良くすることがテストコードの価値を大きくすることにつながると思います。
その気付きとして、使えそうなのが下記の記事で紹介されているツールです。変更した箇所を自動で判定し、必要なテストのみ実行してくれます。これによって変に影響が発生してるコードとかも検知できて、より良い設計の示唆になるかなと感じます。

ソフトウェアテストの実行を機械学習で効率化する。Jenkins作者の川口氏が立ち上げた「Launchable」で実現しようとしていることとは】
https://www.publickey1.jp/blog/20/jenkinslaunchable.html