「単䜓テスト」再入門 é–‹ç™ºã®çŸå Žã§ãƒã‚°ã‚’確実に掗い出す最適な手法ず、テストケヌスの䜜り方

単䜓テストの定矩から手法、未来の展望たでを、日本における゜フトりェアテストの第䞀人者・高橋寿䞀さんが解説したす。

「単䜓テスト」再入門 é–‹ç™ºã®çŸå Žã§ãƒã‚°ã‚’確実に掗い出す最適な手法ず、テストケヌスの䜜り方

゜フトりェアのテストにおいお、最初のフェヌズである単䜓テスト。若手Web゚ンゞニアの䞭には、いきなり単䜓テストを任されお戞惑った方もいるでしょう。仕方なく珟堎で螏襲されおいるやり方に埓っおいるだけ、ずいうこずもあるのではないでしょうか

今回は、単䜓テストの定矩から手法、未来の展望たでを、日本における゜フトりェアテストの第䞀人者・高橋寿䞀さんが解説したす。

単䜓テストずは各瀟ばらばらな単䜓テストの定矩を再定矩

゜フトりェア開発においお、甚語の定矩は非垞に重芁です。そこで、単䜓テストの手法を解説する前に、たずは単䜓テストの定矩を再定矩したいず思いたす。

さお、この「単䜓テスト」ずいう蚀葉。䌚瀟や人によっお意味するずころが少しず぀違うな  ず思ったこずはありたせんか それも仕方ありたせん。単䜓テストUnit testの定矩が迷走しおきた歎史は長く、昚日今日始たったこずではないからです。

「単䜓テスト」ずいう蚀葉が初めお䞖に出おくるのは、1970幎の『Managing the Development of Large Software Systems』ずいう論文に遡りたす{$annotation_1}。

次の図でいう「CODING, UNIT TESTコヌディングず単䜓テスト」が単䜓テストになりたす。

1

しかし日本で仕事をしおいるず、単機胜のテストプリントできたっせ、URLゞャンプしたっせ等々も単䜓テストず蚀われるケヌスがありたす。

先に曞いたように、甚語の定矩は重芁です。開発をスタヌトする前に、コヌドに察する確からしさを確認するのを単䜓テストず呌ぶのか、もしくは単機胜に察するテストのこずを指すのかを明確にした方がよいでしょう。

コヌドベヌスの単䜓テスト

「コヌドベヌスの単䜓テスト」ずはなんだか聞き慣れない甚語ですね。でもそういう蚀い方をここではしおいこうず思いたす。

「単䜓テストずは䜕か」ずいう厳密な定矩はなく、ISTQBの甚語集にもありたせん。昔はあったような気もしたすが、今はありたせん。それほど曖昧な甚語であり、私の参加する䞖界䞭の委員䌚でい぀も揉めおいたした。

そこで本皿では、「コヌドベヌスの単䜓テスト」ずいう甚語を䜿うこずにしたす。この甚語を厳密に衚珟するず、「関数の網矅率を蚈枬し、ロゞックの確からしさを確認するテスト」ずいうこずになりたす。これはホワむトボックステスト手法ずも蚀いたす。この定矩に埓っお話を進めおいきたす。

単䜓テストの手法は、機胜単䜍の単䜓テストブラックボックステストず、コヌドベヌスの単䜓テストホワむトボックステストの2぀に倧きく分かれたす。コヌドベヌスの単䜓テストは、厳密な゜フトりェア品質を求められる自動車や医療の゜フトりェアでは必ず行われるテストで、ISO等々で行うこずをルヌル化されおいたす。

さらに、コヌドベヌスの単䜓テストの䞭には、呜什網矅C0カバレッゞ、分岐網矅C1カバレッゞずいった、いく぀かの手法がありたす。

ここではよく䜿われる呜什網矅ず分岐網矅を玹介したす。

呜什網矅C0カバレッゞ

呜什網矅テスト、たたはC0網矅{$annotation_3}ず呌ばれる網矅を説明したす。呜什網矅でのテスト基準は、少なくずも1回はプログラムの党おの呜什文ステヌトを実行するこずです。䟋えば、以䞋のようなコヌドがあったずしたす。

if(con1 == 0){
  x = x + 1;
}
if(con2 > 1){
  x = x * 2;
}

この堎合、呜什網矅テストでは、䞋蚘の党おの四角を通る経路をテストしたす。

2

テストケヌスは以䞋のようになりたす。

con1 = 0, con2 = 2

そうなるず赀矢印の郚分を通るテストが抜けたす。はいそうです。呜什網矅ずいうのは䞍完党なテストなのでやっおはいけたせん。

しかし倚くの組織で、呜什網矅で単䜓テストを達成しようずしおいたす。コヌドの単䜓テストは劎力のかかる仕事ですが、䞭途半端な呜什網矅はせずに、次に玹介する分岐網矅をしっかり行うこずをオススメしたす。

分岐網矅C1カバレッゞ

分岐網矅たたはC1網矅ず蚀われるテストが、䞊蚘で瀺したC0網矅の問題を解決する網矅手法です。分岐網矅では、それぞれの刀定条件がTRUE、FALSEの結果を少なくずも1回ず぀持぀ようテストケヌスを曞きたす。

3

条件分岐に比べお網矅性が高いため、ほずんどのケヌスではこの網矅手法で単䜓テストを行った方がよいず思いたす。

先のプログラム䟋では、次の2぀のパタヌンでデヌタでテストすれば、テストが完了になりたす。

テストケヌス1con1 = 0, con2 = 2
テストケヌス2con1 = 1, con2 = 0

よくあるコヌドベヌスの単䜓テストの間違い

よくある単䜓テストの間違いですが、「呜什網矅や分岐網矅の網矅率が100に達すればいいんだ」ず考える人が少なくありたせん{$annotation_4}。

䞊蚘のような簡単な䟋ならいいのですが、䞀般に゜ヌスコヌドは巚倧で、各関数も数癟行になり、ある関数からたた別の関数を呌び出しおいる、ずいったケヌスもありたす。なので、網矅率を100%に持っおいくこずはなかなか難しいです。

単䜓テストの目的は、コヌドロゞックの正しさを「網矅」によっお論理的に蚌明するこずにありたす。そしおコヌドロゞックが正しいず蚌明されれば、それは単䜓レベルの凊理機胜のバグがないずいうこずを意味したす。

ここたでは、呜什網矅・分岐網矅ずいうコヌド経路の網矅手法を玹介しおきたしたが、「網矅」には、もう1぀別の芖点がありたす。

それが、入力倀の網矅です。入力倀ずは、関数に枡される匕数、キヌボヌドから入力される倀ずいった、プログラムに察しお䞎えられるデヌタですこれに察し、関数の戻り倀、画面に出力する倀ずいったデヌタを出力倀ずいいたす。

単䜓機胜のバグをなくすには、分岐網矅の網矅率を100%にするのがコスト面やスケゞュヌル面で難しい堎合でも、入力倀のパタヌンを100%網矅し、それに察する期埅倀入力倀に察するプログラムの仕様通りの出力倀が正しいかチェックする必芁がありたす{$annotation_5}。

4

入力倀に察する期埅凊理を確認するこずが必芁

しかし、珟堎の担圓者は埀々にしお、期埅倀の確認をメンドりだず蚀っお行わず、コヌドが網矅されおいるこずで満足しおいたす。そしお、単䜓テストで芋぀けるべきバグを、次のフェヌズである統合テスト6で発芋し、品質担保で苊しんでる組織が倚いのではないでしょうか

コヌドベヌスの単䜓テストは、ほずんどのバグを芋぀けられる個人的意芋では、80以䞊のバグを芋぀けられるテスト手法です。しっかりテストをするこずにより、埌工皋でのバグの数を著しく枛らせたす。単䜓テストでは分岐網矅に、より倚くのテスト工数を割くこずをオススメしおいたす。

機胜単䜍の単䜓テスト

ここたでは、コヌドベヌスでの単䜓テストを説明したした。次は「機胜単䜍の単䜓テスト」を説明しおいきたす。これはブラックボックステスト手法ずも呌ばれたす。

補品にそれほどの高品質を芁求されない堎合は、この機胜単䜍の単䜓テストのみが実斜されるこずが倚いです。たた、先に説明したコヌドベヌスの単䜓テストを実斜したうえ、さらにUIから機胜単䜍特に耇雑な機胜の単䜓テストを実斜する堎合もありたす。

Webアプリケヌションにおいお、䞀般的には「UIから䜕かを入力しお期埅する倀が衚瀺される」こずが単䜓テスト、ずシンプルに考えがちです。しかし、耇雑な機胜に぀いおもバグを芋逃さないよう、たた無意味なテストケヌスを膚倧に曞くこずにならないよう、適切なテストケヌスを抜出するこずが重芁です。

䟋耇雑な゜ヌト機胜のテスト

耇雑な機胜の䟋ずしお、今回は教科曞的な぀たらない単䜓テストの䟋ではなく、䞋のような、デヌタを゜ヌトする機胜確認を想定しお解説しおいきたす。

5

この機胜では、各列の▜ボタンを抌すず、その列をキヌに昇順でデヌタが゜ヌトされるものずしたす。

もし、列内に同じ倀がある堎合䟋えば、名前の列に同性が2人は、その右隣の列この堎合は幎霢の倀によっお゜ヌトしたす。

テスト実斜者に知らされおいる情報は、以䞊の仕様のみです。ブラックボックステストですから、コヌドのロゞックには着目したせん。

さお、たぶん初心者は▜ボタンを抌しお、幎霢通り゜ヌトできおるな、入瀟幎床ごずに゜ヌトできおるな、配眮ごずに゜ヌトできおるな、ずいった具合に4぀のボタンを抌しお、「単䜓機胜確認できたした」ず報告するず思いたす。

しかしテストのプロは違いたす。確実にこの郚分からバグを芋぀け出すために、最適な数のテストケヌスを䜜成しおいきたす。

機胜単䜍の単䜓テスト手法の基本は、次の2぀です。

  • 単機胜境界倀テスト
  • 組み合わせテスト

境界倀テスト

たず、境界倀を考えおみたしょう。簡単なずころから幎霢です。たず人間が生きられる幎霢は0150歳ぐらいですかねヌ。たあ0歳が入瀟できるかはおいずいお。

なので、プログラムが0歳が゚ラヌなく凊理できるか、たたその境界の-1歳が゚ラヌ凊理できるかを芋たす。䞊限の境界は150歳ぐらいですかねヌ、たた1,000歳の堎合゚ラヌ凊理したすかねヌ、ず境界を探りながらテストをしおいきたす。

ここで「1,000歳でも正垞凊理しおいいんじゃん」ずいう意芋もあるかもしれたせん。しかし、倧きい数の凊理はコンピュヌタは苊手ですし、想定倖の桁数は衚瀺゚リアからはみ出す可胜性もありたす。「このプログラムにおける、適切な゚ラヌ凊理はどうあるべきなのか──䟋えば、1,000歳のずきは正垞凊理されるべきか、それずも゚ラヌダむアログが衚瀺されるべきか」ずいうこずは、垞に考える必芁がありたす。

たた、幎霢にアルファベットが入っおいた堎合にどうなるか、ずいうような確認も必芁です。

もう1぀、デヌタ件数の境界倀も考える必芁がありたす。デヌタの件数が0のずき、1のずき、件数がずおも倚いずき、ずいうのも境界倀テストの条件になりたす。

組み合わせテスト

次に、組み合わせを考えおいきたしょう。テストにおける組み合わせずは、入力倀など、䞎える条件の2぀以䞊の組み合わせを指したす。

䞀般的に組み合わせを考える堎合は、そこからバグが出やすいかどうかずいう怜蚎が必芁です。もしその怜蚎をしないず、テストケヌス数が爆発しおしたいたす。

それでは゜ヌトプログラムではどういう堎合にバグが出るでしょうか 少し耇雑なデヌタで考えおみたしょう。

組み合わせを考える堎合は、1、2、nを垞に頭にいれる必芁がありたす。デヌタが1぀の堎合に゜フトりェアがちゃんず動いおいるかは、䞊蚘の単機胜境界倀で確認したした。次は2です。

圓然、同性が2人いた堎合を考えなければならないので、同性の名前があった堎合に、幎霢が正しく゜ヌトできおいるかを確認したす。䞋のようなデヌタを䜜成しお、正しく゜ヌトできるかを芋おみたしょう。はい、名前の次のデヌタである幎霢で゜ヌトされおいたすね

6

続いお同幎霢の堎合の゜ヌトを確認しおみたしょう。䞋のようなデヌタを䜜成しお、幎霢の次の入瀟幎床で゜ヌトされおいるかチェックしたす。

7

このように、2぀の組み合わせでその機胜がちゃんず動いおいるか確認しおいく必芁がありたす。同じように、入瀟幎床ず配眮の組み合わせ、配眮ず名前の組み合わせ、ずテストケヌスを䜜成したす。

皆さんの䞭にはひょっずするず、次のように耇雑なデヌタを䜜っお、いろいろテストを詊したいず思われる方がいるかもしれたせん。「幎霢」で゜ヌトしたずき、同幎霢の堎合は次の「入瀟幎床」で゜ヌト、か぀「入瀟幎床」が同じ堎合は次の「配眮」で゜ヌト、か぀「配眮」が同じ堎合は次の「名前」で゜ヌト。

8

次は、の゜ヌトを䞊蚘の図で芋おみたしょう。確かに、こういう゜ヌトはケヌスずしおはありえたすが、これは曞き始めるず無限倧の数になりたす。こんなテストケヌスを曞いおバグを芋぀けるこずは、宝くじを圓おるようなもので、あたり意味がありたせん。

なので、たず1ず2を確実に網矅し、nずいうテストケヌスを適切数埀々にしお数個曞けば、品質的にはほずんど問題はありたせん。

それでもバグが出たらどうするんですか っお質問しおくる方もいたすが、い぀も私は自信を持っお「こんなバグはたず出たせん。たたほずんどの堎合、バグは怜出できたせん 確率統蚈的に経隓則的に適圓ず思われるそれっぜい蚈算匏を瀺し、怜出するには○○億円かかりたすが、その費甚かけたす」ずマネヌゞャに聞きたす。いたたで1人も「よしその費甚をかけよう」ず蚀っおくれた人はいたせんでした。

確かに、開発者が思いもよらない倉なコヌドを曞き、3぀以䞊の条件でのバグが出るこずはありたすが、それを防ぐための適切なテスト手法がないものも事実なので、諊めるしかありたせん7。

機胜単䜓の単䜓テストにおける組み合わせのバグ怜出確率ずいうものは、コヌドベヌスの単䜓テストよりかなり䜎いずいう認識を持぀必芁はありたす。そしおたた、このようなバグを芋぀けるのはテスト担圓者ではなく、開発者もしくはそのコヌドをレビュヌしおいるレビュヌワヌだずいうこずを忘れおはいけたせん。

珟代の巚倧゜フトりェアでは、開発者自身もテスト担圓者の意識を持぀こずが重芁です。䜙談ではありたすが、こういった単機胜が耇雑な堎合には自動化テストをオススメしたす。たあ䞀晩䞭流しおおけば安心感はかなり埗られたすよ。

ブラックボックステストずホワむトボックステスト

ここたで、コヌドベヌスでの単䜓テストホワむトボックステストず、機胜単䜍の単䜓テストブラックボックステストを説明しおきたした。それでは、私の補品はどちらの単䜓テストをやるべきですか 䞡方やるべきですか ずいう問いがあるでしょう。

しかし、珟実䞖界においお私の長いコンサルタント経隓からしおも、それを問われるこずが実は少ないこずも事実です。なぜなら各瀟・各事業郚で昔からあるやり方に疑問を持たず螏襲しおおり、珟堎の担圓者はドラスティックな改善にあたり前向きではないからです。品質が悪くなれば、今たで螏襲しおきたやり方でテストケヌスを远加するなどしお、泥瞄的にしのいでいたす。

そうした状況に譊鐘を鳎らすべく、「埡瀟の補品は特にコヌド品質が悪いので、ホワむトボックスでの単䜓テストを远加したらどうでしょうか」ずコンサルタントずしお顧客に提案するこずもありたす。担圓者からは「そんな時間も予算もありたせん、䜕幎間も開発し続けた膚倧な゜ヌスコヌドの単䜓テストを1からやるなんお土台無理です」ず䞀蹎されたす。

それでも匕き䞋がらず、「いえいえ、珟代の゜フトりェア理論では、゜ヌスコヌド党䜓の20皋床をテストすれば十分な品質になる単䜓テスト手法もありたすが、どうですか」ず提案したりもしたす。

グヌグルはコヌドの品質向䞊のため「バグ予枬アルゎリズム」を採甚しおいる  Publickey

だいたいの堎合、その埌顧客からの連絡がなくなりたす。残念ですが、これ、よくある䌚話の䞀幕なのです。芁は、新たなテスト手法を远加したくないのが、日本の゜フトりェア組織のようです。

コヌドベヌスでの単䜓テストをやるか吊かは、過去の本番皌働においお、コヌドベヌスの単䜓テストをやっおおけば防げたはずの問題が発生したかどうかで刀断すればよいでしょう。

ブラックボックステストで党おのバグを芋぀けられれば、ブラックボックステストよりコストのかかるホワむトボックステストをやる必芁はありたせん。

ずはいえ、䞀般的には、ブラックボックス・テストずホワむトボックステストで芋぀けられるバグの範囲は違っおいたす。むメヌゞでいえば䞋の図のようになりたす。

9

もしホワむトボックステストをはしょれば、バグがいく぀か残りたす。それが軜埮なバグならばよい──䟋えば、無料スマホアプリで、たたに動かなくなっおもかたわない──ずいう堎合は、この方法でも問題ありたせん。

それでは、自動車の゜フトりェアはどうでしょうか 最近の車はコンピュヌタだらけで、その゜フトりェアで問題が起きれば事故に぀ながり、最悪ドラむバヌが死んでしたいたす。なので、車の゚ンゞンやミッションコントロヌルの゜フトりェアでは、ホワむトボックステストが必須です。しかし、カヌナビゲヌション゜フトりェアのほずんどはホワむトボックステストを行っおいたせん。たあカヌナビが故障したら困るけど、スマホの地図でなんずか代甚できたすしね。

たずめ

今回、単䜓テスト・ホワむトボックステスト・ブラックボックテストの効甚、および適甚方法に぀いお説明しおきたした。

Webや曞籍を芋おも、テスト手法を説明するものは倚いですが、珟堎でどの手法を最適に採甚するべきかを論ずる情報は倚くありたせん。昔日の日立やNECや䞉菱ずいった、日本の゜フトりェアを支えおきた䌚瀟には膚倧な内郚資料があり、そのデヌタを元にどういうテストを行うべきだずいう指針がありたした。

しかし、日本の家電の゜フトりェアが凋萜し、GAFAが゜フトりェアの䞖界を握るようになった今、私たちはテストの基瀎技術を孊んだうえで、先端的技術に぀いおは圌らのやり方に远随するしかありたせん。ずころが、基瀎技術もおろそかになり、先端的技術の远随もうたくできないずいうのが、日本の゜フトりェア産業の珟状でもありたす。

それでは、日本が䞖界を牜匕する自動車産業の゜フトりェアはどうであろう ずいう問いかけもあるでしょう。実際のずころ、日本における自動車の゜フトりェア開発珟堎の技術力は、GAFAのそれず比べ倧きく遅れおいるず筆者は感じたす。

今埌、日本の゜フトりェア品質領域で掻躍する方々は、GAFAの技術をキャッチアップしながら自瀟゜フトりェアを䜜るずいう、倧倉な䜜業を匷いられるこずず想像しおいたす。そんな䞭でも、自瀟内で閉じた、あるいは継続されおきたやり方に流されず、「考え」「仮定し」「仮定をベヌスにした実隓的な取り組みをし、デヌタを取る」ずいうような健党な品質掻動にぜひ取り組んでほしいず思いたす。

高橋 寿䞀 たかはし・じゅいち

10
情報工孊博士。1964幎東京生たれ。フロリダ工科倧孊倧孊院で゜フトりェアテストを孊んだ埌、広島垂立倧孊にお゜フトりェアテスト研究により博士号取埗。米Microsoft瀟・独SAP瀟で゜フトりェアテスト業務に埓事、゜ニヌ株匏䌚瀟の゜フトりェア品質担圓郚長をぞお、2018幎1月から株匏䌚瀟ロゞギアゞャパンCEOに。著曞に『知識れロから孊ぶ゜フトりェアテスト』『バリバリ進む゜フトりェアテスト手法』など。

線集倧高友倪郎リブロワヌクス


  1. Managing the Development of Large Software Systems (Winston W. Royce, Symposium on Advanced Programming Methods for Digital Computers on 29 June 1956)↩

  2. ISTQBは、䞖界最倧の゜フトりェアテストにおける資栌団䜓です。↩

  3. 実はC0網矅ずいう蚀い方は正しくなく、呜什網矅ず蚀わなければなりたせん。なぜC0ずいう蚀い方がされだしたのかは、ながヌいストヌリヌになるのでここでは曞きたせん。↩

  4. 網矅率をどれくらいにするべきかずいうのは、コンサルタントをやっおいおい぀も聞かれたす。自動車などのミッションクリティカルな゜フトりェアの堎合は、100%ず自信を持っお答えたす。
     しかし、ミッションクリティカルではない゜フトりェアでも、コヌドベヌスでの単䜓テストを十分に行うこずは、埌半工皋のバグを枛らすなど、゜フトりェア品質の向䞊に倚いに圹立ちたす。そのような堎合の網矅率は80%でよい、ず私はやはり自信を持っお蚀い切っおしたいたす。実際は蚀い切れないんですが笑
     筆者は数十幎に枡るテスト関連の論文に目を通しおいたす。しかし、たっずうな論文にはその網矅率のゎヌルは曞いおいたせん。もちろんISOやIEEEの芏栌にも曞いおいたせん。なぜなら、そう曞いお臎呜的なバグが出るず責任を取らなければならないからです。
     なぜ筆者は80%を䞻匵するかずいうず、゜ヌスコヌドの20%皋床ぱラヌハンドリングの凊理なので、そこたで単䜓テストで網矅する必芁がないだろうず考えられるからです。実際にBoris Beizerずいう著名なテスト孊者もそう蚀っおいたす圌の本にはもちろん曞いおいたせんが、カンファレンスでの質問にはそう答えおいたした。↩

  5. 入力倀に察応する出力を網矅的にチェックするこずは、機胜単䜍のブラックボックステストであるずも考えられたす。しかし、コヌドを網矅し、コヌドのロゞックが正しいかを刀断するためのテストがホワむトボックステストなので、ここではあえおコヌドベヌスのホワむトボックスず仮定させおください。厳密には確かに異論はありたすが  。↩

  6. 「統合テスト」は「結合テスト」ず同様の意味で䜿われたすが、ISTQBの甚語集には結合テストずいう甚語はなく、統合テストず蚘茉されおいるため本蚘事ではこちらを䜿いたす。↩

  7. 数孊的感芚でいうず、2぀やれば組み合わせが網矅できるので、理論䞊品質に問題ないず蚌明できたす。そのため、組み合わせテストにはAll-pairずいう手法がありたす。たしかに、コヌドを曞く人の技術䞍足などで、3぀以䞊の条件によるバグが発生するこずもありたす。しかし3぀の条件たでチェックするずなるず、ほずんどの゜フトりェアで組み合わせテストケヌス数が爆発したす。2぀なら100テストケヌスなのが、3぀になるずれロが1぀増えお1000ケヌスになりたす。なので、珟実的な゜リュヌションずしおは、2぀たで頭で考えお理論的にカバヌし、3぀以䞊に関しおは感芚を信じ、いく぀かのテストをするずいうこずになるず思いたす。↩

若手ハむキャリアのスカりト転職