こんにちは、@codeship_techです。
本日の質問がこちら。
テストコードってなぜ書く必要があるのですか?
ということで、開発のテスト工程についての質問ですね。
プログラミングの勉強をしていてテストってどんなことするんだろう?と考えたことはありませんか?
存在は知ってはいるものの本でもオンラインの教材でも、テストってなかなか勉強できる機会ってないですよね。
今回はそんなテストに関しての解説です!
それではこちらの質問に答えていきます。
プロダクトコードは変更を加えるたびに、どこかの箇所が機能しなくなる恐れがあるからです。
テストコードを書く必要性
システム開発における「テスト」とは、プロダクトがちゃんと動くかを確かめるチェックのことです。
システム開発を行うとき、それを学習として行うのか、サービスとして運用するために行うのかの大きな違いの一つに、テストコードを書くかどうかがあると思います。
テストコードとは、開発したソースコードが意図した通りに動くかを確かめるテスト用のソースコードのことです。
例えば、「formから送られてきた文字列は、ちゃんとサニタイズされているかどうかを判定する」といった具合です。
テストコードは、実際の開発では基本的に必要とされます。
(非常にサイクルの早いごく小規模なアジャイル開発や労力の足りていない現場では簡略化されることがあります…)
開発したプロダクトが意図した通りの挙動をすることを客観的に保証する必要があるからです。
テストコードを書く以外のテスト手法ですが、手動でテストを行う方法があります。
すなわち、ある処理を人間が直接操作して、その処理の結果が期待していたものと同じであるかどうかを、チェックリストにまとめていく方法です。
これならテストは処理が正しいかどうかを目視して終わりなので、テストコードを書く手間は発生せず、短期的には楽に見えます。
学習教材ではテストコードを書く機会が得られにくい
Web開発の学習教材では、多くの場合テストコードを書く指示がありません。
これは、テストコードを書くことで得られる利益が「コードがちゃんと動くことの保証」であることが原因です。
学習教材では、当然ですが教材の執筆者・指導者がコードが動くことを事前に確認した上で指導が行われます。
したがって「コードが動くこと」を改めて確認する必要性は、その教材の中ではなかなか発生しません。
また、テストコードをどこからどこまで書く必要があるのかの見極めは実は難しく、その判断のノウハウだけで専門書がまとめられているほどです。
よってテストコードを書くこと自体が、その教材で行いたいこととはまた分離した一つの困難な課題となり、敬遠されがちなのです。
テストすべき量は、肥大化する
学習用コードではテストを記述することが敬遠されがちであることを前述しました。
また、テストコードを書かないのなら手動でテストを行う方法があることも前述しました。
ところで、開発プロダクトは基本的に、ユーザからの要望が増えるのに連なり、そのソースコード量が肥大化していきます。
また、ソースコードを書いている最中に、ある箇所で行なっている処理とまた別の箇所で行なっている処理が極めて似ているので、共通部分を抜き出してそれをひとまとめにする改修をしたくなるとします(こういった既存コードの改修をリファクタリングと言います)。
リファクタリングの過程で、コードの書き方が変わったことによってとある機能が不全になる可能性があります。
すなわち、ある部分の改修がそれまでの昨日の全体的な整合性を乱してしまうということです。
そういった機能の不全は、ある箇所の変更を加えるごとに、変更を加えた箇所のテストだけでなく、プロダクト全ての機能が正常動作するかどうかを再度テストすることでのみ検証することができます。
つまり、プロダクトに機能を付け加えるたびに、既存機能全領域のテスト+新機能のテストを行わなければなりません。
これは機能が増加することによってテストの量が急速に増大し、恐ろしく手間のかかる工程になっていくことが分かるかと思います。
これをもし手動で行っていたとしたら、果たしてテストにどれだけの工数を割かなければならないのでしょうか。
リグレッションテストによって
こうした手間を最小限にするために、リグレッションテスト(回帰テスト)が役に立ちます。
リグレッションテストとは、上記の「既存機能全領域のテスト+新機能のテスト」を一括に半自動で行うことで、リファクタリングによる機能不全をいち早く検知する方法で、様々な開発現場で重宝されています。
システムが長く使っていくことを見越したものであるなら、リグレッションテストを記述することが工数削減につながるのです。
Web開発の学習においてテストを書くことのメリット
前述の通り、学習教材においてはテストは書かれない傾向にあるのでした。
ところで、あなたが学習成果を発揮するためのポートフォリオとしてWeb開発プロダクトを作成し、面接に持参するのならば、そこではしばしば「あなたのポートフォリオで力を入れたところはどこですか」と聞かれます。
合わせて読みたい:エンジニア面接で聞かれる内容↓↓↓↓
この質問は、志望者が「自分の頭で考えてコーディングを行なったか」を確認するためにされるのですが、テストコードを書くことははまさに、「このプロダクトがちゃんと動くかを確かめる」ために志望者が自分の頭で考えて、何をテストしたらいいかを見極めようとしたことの証拠になりえます。
すなわち、ポートフォリオでテストコードを頑張って記述すると、他の志望者から効果的に差別化が行えます。
また、「テストを書く箇所を見極める」という技術は前述の通りそれ単体で専門領域であり、またこの見極めの技術はあらゆる開発の現場で役に立ちます。
したがって、テストの書き方を学ぶことは費用対効果が高い学習方法だと言えるでしょう。
本日は、開発のテスト工程について解説しました。
授業日記についてのご意見
CodeShipの授業について「こんな事が知りたい・紹介して」というご意見・ご提案がありましたら、CodeShip公式Twitterアカウント(【CodeShip】プログラミングスクール)までDMまたはリプライにてお寄せください。