たとえるなら
自動車工場の検査です。部品ひとつずつの検査(単体テスト)、エンジンとタイヤを組み合わせた検査(結合テスト)、完成車で実際に走らせる検査(総合テスト)と段階を踏みます。いきなり完成車だけ検査すると、不具合がどの部品のせいか特定に苦労します。
もう少しくわしく
テストは、作ったプログラムが意図したとおりに動くかを確認する工程です。「正しい入力で正しく動くか」だけでなく、「間違った入力をされても壊れないか」「同時にたくさんの人が使っても耐えられるか」など、さまざまな角度から確かめます。開発の工程では実装のあとに置かれ、リリース前の関所の役割を果たします。ここを通らないと利用者に届けない、という考え方です。
テストには段階があります。部品ひとつずつを確かめる単体テスト、部品同士をつなげて確かめる結合テスト、利用者と同じ操作で通しで確かめる総合テスト。どの段階でも、あらかじめ「何をしたら、どうなるはずか」を一覧にしたテストケースを作り、一件ずつ結果を記録します。一覧から抜けた項目は、どれだけ丁寧に実施しても見つかりません。段階の呼び方は現場によって少し違うので、入ったら確認しておくと安心です。
混同されやすいのがデバッグとの違いです。テストは問題があるかどうかを見つける作業、デバッグは見つかった問題の原因を探して直す作業です。テストで見つけ、デバッグで直す、という順番の関係になります。また、判定の基準になるのは担当者の感覚ではなく仕様です。「なんとなく変」ではなく「仕様と違う」と言えて初めて、不具合として扱えます。「仕様に書かれていない」と気づいた場合も、立派な報告になります。
現場の流れは、まず何をどこまで確かめるかを決め、テストケースを書いて、レビューを受けてから実施に入ります。見つかった不具合は一覧に登録し、直ったあとにもう一度同じ手順を試します。実施した証拠として画面の記録(エビデンス)を残すのが、特に受託開発では定番です。単体テストは作ったエンジニア自身が、総合テストは専門の担当者や発注側が行うことが多いです。
落とし穴の代表は、うまくいく操作ばかり試してしまうことです。現実の不具合は、空欄で送信した、想定より長い文字を入れた、途中で戻るボタンを押した、といった操作から出てきます。もうひとつは、日程が押したときにテストの時間から削られること。ここを削っても問題は消えず、公開後に出てくるだけで、対応の手間はむしろ大きくなります。遅れているときこそ、どこを重点的に確かめるかを決め直すのが正しい対処です。
働きはじめたばかりの人は、テストの担当から任されることが多いはずです。地味に見えますが、システム全体の動きを覚えられるいちばん早い場所です。不具合を見つけたら「どの画面で、何をしたら、どうなったか」を具体的に書いて報告してください。エンジニアではない立場の人も公開前に実際の業務の流れで触る役目を担うことがあり、この目線でしか見つからない問題があります。
覚えておきたいのは、テストそのものが品質を上げるわけではないということです。テストは今の品質を測る作業で、良くするのは修正のほうです。そして、すべての使われ方を確かめ尽くすことは原理的にできません。だからこそ、壊れたときに困る部分から重点的に確かめる判断が必要になります。どこを厚く確かめるかは、業務の重みを知っている人ほど上手に決められます。壊れて困る順に並べる作業だと考えると、わかりやすくなります。
現場での使われ方
「実装は終わったので、これからテストに入ります」
機能を作る工程が完了し、正しく動くかを確認する工程へ進むという進捗報告です。ここで不具合が見つかると実装に戻ることもあり、まだ完成ではありません。
「テストで不具合が3件見つかりました」
リリース前の確認で問題を検出できたという報告です。悪い知らせに聞こえますが、本番で利用者に見つかるよりずっと良い知らせとして扱われます。どこで見つけたかも一緒に記録します。
「テストケースのレビューをお願いします」
確認する項目の一覧に抜けがないか見てほしいという依頼です。項目自体が足りていなければ、いくら丁寧に実施しても抜けた部分の問題は見つかりません。
「その修正、テストのやり直しが必要です」
コードに手を入れたので、確認済みだった範囲も改めて確かめ直したいという意味です。どこまで戻ってやり直すかは、変更の内容を見て決めます。念のための確認が、いちばん効く場面です。
よくある質問
テストをすればバグはゼロになりますか?
なりません。テストは「用意した確認項目の範囲では問題がない」ことを示すもので、すべての使われ方を網羅することは不可能です。それでも、壊れたときに困る部分を重点的に確かめておけば、大きな事故が起きる可能性は大きく下げられます。そこが力の入れどころです。
テストは誰がやるのですか?
単体テストは実装したエンジニア自身が書くことが多く、総合テストは専門のテスト担当者(QAと呼ばれます)や、発注側の担当者が行うこともあります。体制の呼び方も会社によって違うので、自分がどこを受け持つのかは最初に確認しておくと安心です。テストを専門の会社に任せる現場もあります。
テストとデバッグは何が違うのですか?
テストは問題があるかどうかを見つける作業、デバッグは見つかった問題の原因を探して直す作業です。順番としては、テストで見つけてデバッグで直す関係になります。テストを担当する側は、見つけた事実を正確に書くところまでが役目になることが多いです。原因の調査まで担当するかは、体制によって違います。
単体テスト・結合テスト・総合テストはどう違うのですか?
確かめる範囲の広さが違います。単体テストは部品ひとつずつ、結合テストは部品をつなげた状態、総合テストは利用者と同じ操作で全体を通します。小さい単位から順に固めると原因の場所を絞り込みやすくなりますが、区切り方や呼び方は現場によって違います。呼び方が違っても、確かめる範囲の広さで考えれば整理できます。
未経験からテストの仕事に入ることはよくあるのですか?
珍しくありません。プログラムを書く前にシステムの動きを覚えられるため、入口として置かれることがよくあります。仕様を読む力や不具合を分かりやすく伝える力が身につき、テストを専門の職種として続ける道もあるため、通過点だけの仕事ではありません。入口として選んで損はありません。