どうも、いっとくです。
プログラムの世界において、テストはめちゃくちゃ大事です。
テスト駆動設計という言葉は色々な部分で聞くし、テストをどうやってやっているかという類の話はいろいろなところで目にします。
更には「プログラマが知るべき97のこと」という本では、3割位の内容がテストのこと書いてるんじゃないかと思うくらいしつこくテストテスト言われます。
だからこそ、どんなエンジニアに「テストは大事だと思いますか?」と聞けば、ほどんどの人がYESと頭を縦に振ると思うんです。
でもね、僕はそこから1歩踏み込んで聞いてみたい。
「テストはなんで大事だと思いますか?」と。
多分この質問をぶつけることで、先程YESと答えた人の中の一部、とりわけ周りのすごい人がテストは大事だと言っているから大事だと思っている人は答えに詰まるような気がするのです。
そして、更にそこから踏み込んで、「テストを実施する目的は?」「テストでバグを見つけるために気をつけていることは?」「カバレッジはどれくらいを目指していますか?」「どんな手法でテストをしていますか?」と聞きまくると、周りのすごい人がテスト大事だから大事だと思っていた人をどんどん炙り出せるような気がしています。
そして、その全ての質問をくぐり抜けた、テストの本質を理解して実行している人にこう言いたい。
「安西先生…!テストがしたいです…!」
正しいテストがしたくなってきた
僕はエンジニアになってこの方、テストをちゃんとやるという環境で仕事をしてきていません。
もちろんリリース前にテストをやることはありますが、設計もクソもない、場当たり的なフィーリングによるテストです。
なんとなく、変な文字を突っ込んでみたりパラメータをいじってみたり、ポチポチボタンクリックしてみたり。
もちろんリリース後にバグが見つかることもありました。
またそんなフィーリング駆動の結合テストしかしていなかったため、単体テストのテストコードを書くという部分における経験はほぼゼロ。
アサーションを通すためのテストは書けるが、バグを見つけたり品質を担保するという観点において適切なコードを書けている気が全くしないというレベル感です。
まぁ、そんな環境で働いてきた僕こそが、冒頭で言っていたすごい人達が口を揃えてテスト大事だと思うからテストを大事だと言っていた張本人なのであります!
たちが悪いことに、表向きはテスト大事だと言いながら、そんなにしっかりやっても時間の無駄じゃね?くらいに思っていました。
でも、ちょっと最近テストコードを書いたりレビューする必要に迫られたので、しっかりテストの知識をつけねばとなったわけです。
しかし、そのテスト手法について仰ぐメンターがそばにいるわけでもないので、ここは本に頼ろうということでこちらの本を読んでみました。
どちらかというと今回は、単体テストのコードの書き方知りたいという目的が合ったので、その目的を直接達成してくれるような内容ではありませんでした。
しかし、どのような観点でテストケースを作成すればよいのかという点では、かなりたくさんの学びが合ったので、これを今のタイミングで読んだというのは非常に良い選択だったと思います。
ということでざっくり概要を説明します。
初めてのソフトウェアはいろんなテスト手法を学ぶことに特化している
本書を一言で言うと、テストのための道具箱です。
恐らく文章の流れからしても、著者もそういう目的で書いたと思います。
テストというのはやってみると奥深くて、リソースの限界があるため、全ての組み合わせをテストするのは不可能です。
そこで、最小限のリソースで最大限のバグを発見するためにいろいろな手法が確立されています。
- ブラックボックステスト
- ホワイトボックステスト
- 同値クラステスト
- 境界値テスト
- ペア構成テスト
- ドメイン分析
- トランザクションテスト
- データフローテスト
- スクリプトテスト
- 探索的テスト
- etc…
そして、良いテストというのは、現状のリソースでたくさんのバグを発見し、ソフトウェアの品質を保つための道具を適切に選び出すということなのです。
各道具はそれぞれ用途が異なっているため、ネジ回しとハンマーのどちらが優れているかという議論になってしまうのです。
なので、多くの道具について熟知し、都度適切な道具を取り出すということが、優れたテストを行う技術に繋がっていきますよということなのです。
本章はそんなテストの一つ一つの道具について、とてもわかり易く解説しています。
特に僕くらいのフィーリング駆動テストの実践者ともなると、境界値テストくらいしか知りませんでしたから。
直交表を使った、ペア構成テストの組み方なんかは結構広く活用できそうなテストケース作成手段だな〜と思いました。
そんなわけで、当初の目的であった単体テストのテストコードの書き方については別途勉強する必要はあると感じつつも、テストに関する基本的なテクニックを一気に知ることができたので、テストの重要性はわかったけども、具体的にどうすればいいかわからんぞよという方はかなり学びの多い書籍だと思います!
余談ですが、8月は引きこもりまくっていたので結構本を読んでいたのですが、やっとアウトプットが終わりました。もう少し中身を掘り下げたアウトプットもしていきたいですね。
ちなみに引きこもりすぎてGoogleから送られてきたレポート見たら活動範囲3kmでした。足がもやしになりそう。
それでは、よいテストライフを!
コメント