はじめに
BASE株式会社でシニアエンジニアを務めているプログラミングをするパンダ(@Panda_Program)と申します。本連載はPHPカンファレンス2022での発表「実践!ユニットテスト入門」を再構成して記事としたものです。
対象読者
本連載の対象読者は、自動テストの必要性をわかっているものの、まだテストコードを書いたことがない開発者の方です。
テストを書くモチベーション
まずはテストの重要性を簡単に紹介します。ソフトウェア開発において、テストは手動テストと自動テストの2つに分けられます。手動テストは、いわゆる「画面ポチポチ」と言われるような、ブラウザ上でソフトウェアを動かして動作を確認するものです。
多くの現場では、手動テストで確認することが多くなると、スプレッドシートの一行一行に検証内容を書いて、テストを任された人が上から順に実施することがよくあります。手動テストはこのようなイメージです。
手動テストが必要な場合もあるため、手動テストは必ずしも悪いものだとは言えません。しかし、仮に1行コードを変更しただけなのに、100件の検証を手動で実施しなければならないとすれば、テストのコストが過剰であると判断できるでしょう。そのような場合に自動テストを採用することを検討します。
自動テストは、テスト用のソフトウェアが人間の代わりに繰り返し行う動作確認を自動で実行するというものです。例えば、ローカル環境で自分が書いたコードが正しいのかを確認するためにはコマンド一発でテストを実行してスピーディに検証できるほか、CI(継続的インテグレーション)が整備されていればCI上でコミットをプッシュするたびに全てのテストを実行して、自分が開発した箇所のみならず、他の箇所が壊れていないかを確認できます。
小さいソフトウェアであれば、毎回ブラウザを立ち上げてソフトウェアが壊れていないか手動で確認することはそれほど手間ではないかもしれません。しかしソフトウェアは時間と共に成長していきます。開発期間が長く、複雑な機能を備えたソフトウェアの動作確認を毎回全て手動でテストするのは現実的ではありません。
自動テストであれば些細な点から既存の処理を組み合わせた複雑な処理まで、コマンド一つでバグがないかを確認できます。自動テストは時間と手間の短縮になります。
一言で自動テストと言っても内容は多岐に渡ります。本記事では、一番シンプルなユニットテストに焦点を当てて、読者の皆さんを自動テストの世界に誘おうと思います。
ユニットテストから始める
さて、ユニットテストは自動テストの中でどのように位置づけられるでしょうか。ソフトウェアの自動テストを大まかに分類したものとして、マイク・コーン氏が考案した有名なテストピラミッドというものがあります。
テストピラミッドによるとユニットテストには3つの特徴があります。
- ユニットテストは他のテストに比べて最も数が多い
- ユニットテストの実行速度は他のテストより速い
- ユニットテストは他のテストに比べてより独立している
これらはソフトウェアの構成要素の内で最小単位(ユニット)をテストするという性質から導き出される特徴です。
本記事は入門であるため他のテストには触れず、ユニットテストの解説に徹します。他のテストについてもさらに知りたいという方はJSTQBが翻訳しているISTQBテスト技術者資格制度 Foundation Levelのシラバスをご覧ください。