
父と子のソフトウェアテスト入門(1)
はじめに
こんにちは、技術推進部の谷岡です。子供が2歳になり、教育番組を見る機会が増えてきました。番組はどれも見ごたえがあるもので自分が子供のころと比べ、小さな子供だけではなく大人も一緒に楽しめる構成のものが増えてきているように思います。かく言う私も一緒になって楽しんでいます。
なかでも「ピタゴラスイッチ」という番組で、ピタゴラ装置を使ったコーナーがあるのですが、毎回目を見張るものがあり、仕掛けのひとつひとつに魅せられています。実際の「ピタゴラスイッチ」については本家をご覧になっていただくとして、ピタゴラ装置って何?という方へは「Wikipedia」でもよいのですが、ピタゴラ装置はもともとルーブ・ゴールドバーグ・マシンの一種と言われており、海外でも取り上げられているコンテンツです。なかでもこちらの動画にはストーリーがあり面白くハラハラさせられます。
なぜこんな話をしているかというと、ピタゴラ装置を見ていくなかで、子供に自分の仕事(ソフトウェアテスト業)を伝えるのに有効な手段ではないかと考えたからです。
ピタゴラ装置は、いくつもの日常雑貨を組み合わせて大きな装置を作ります。このひとつひとつの部品を組み合わせて装置を作り、番組を構成するためにはいくつもの工程が必要になります。そのなかで、エンドユーザ(公式によると4~6歳児)にどんな価値を届けて、どんな教育を施すかを考えながら毎回作られているのではと想像します。
この取り組みは多くのプロダクトづくりに通じると感じています。プロダクトの品質を担保して価値を届けるためには、いくつものテストが必要です。本記事では具体的にどういったテストが必要になるか、4年後の息子君(6歳)を想像しながら書いてみました(笑)
父と子の緩い雰囲気で、楽しくソフトウェアテストを学んでいけたらと考えております。
《4年後を想像》ある土曜日の昼下がりのこと
子:ねぇお父さん。お父さんはどんな仕事をしているの?
父:お、ついに興味がわいてきたかい?(ここまで長かったな)お父さんはねシステムのテストをする仕事をしているよ。テレビや車、電車、パソコン、世の中の電気で動くものはシステムと呼ばれているのだけれど、そのシステムが思った通りに動いてくれるかどうかを確認する仕事をしているよ。
子:へぇ、なんだか難しいね。僕にはよくわからないや。
父:そうだよね、難しいよね。もうちょっとお話聞いてくれるかな。例えばさ、息子君が大好きなゲームの実況動画のサイトがあるだろ?ああいった動画サービスってみんな当たり前に使っているし、息子君が2歳の時には既に動画を再生したり止めたりできてたよね。
でもあれって、動画再生サービスのシステムが動いているからみんなが簡単に楽しく見られるんだよ。再生ボタンを押しても動かなかったり、自分が見たい動画と別の動画が出てきたりしたら嫌になってだれも使わなくなると思わない?

子:確かにそれは嫌だなぁ。じゃぁさお父さんはお仕事中ずっと動画見てるの?
父:なかなかいい質問だね(そしてグサリと来るね)。それでも確かにちゃんと動画が思った通り再生されるかは確認できるね。でもどれくらいのペースで世の中に動画がアップロードされていると思う? 【1秒に1時間分の動画がアップロードされている】ともいわれているよ。それだけ世界中の人が動画をアップロードしているんだね。とてもじゃないけれど、お父さんを何人集めてもすべての動画が思った通りに動いているかを確認することは難しいよ。

子:ふーん。でも変じゃない?じゃあさ、どうやってちゃんと動くか確認するの?ちゃんと好きな動画を毎日見れるということは、誰かが確認しているってことだよね?
父:もちろんそうだね、システムって使う人の数だけ使われるから、作った人や確認する人の数よりたくさん動いているんだ。だから誰にいつどれだけ使われてもちゃんと動くシステムになるように、工夫をしてテストしているんだよ。どういう風にシステムのテストがされているか、これから少しずつ息子君にもわかりやすいように説明するね。
子:えーなんかめんどくさいし、難しいからやだよ・・・。
父:まぁそういわずに聞いておくれよ・・・。あ、そうだ!お菓子でも買いに行かないかい。
駄菓子屋のふたり

子:お父さん〜なんで駄菓子屋に来たの。うれしいけど。
父:息子君のおやつ探しついでにちょっと面白いことを思いついてね。息子君はさ、ピタゴラ装置って知ってる?
子:え?毎朝やってるよね、おもしろいし好きだけどなんか関係あるの?父:あれさ、出来上がったものを毎日見ているけど、実際に作るのは大変そうじゃない?
子:面白そうだけど簡単にはできそうにないよ、だってまずどんなのを作ればいいか考えるところから大変そう。
父:そうなんだよ。これって実はシステムをつくるお話と似ているんだ。だから、これから疑似的に駄菓子を使って簡単な装置を作って説明していこうと思う。システムってそういうことかーっていうのが伝わればいいな。
子:よくわからないけど、お菓子でピタゴラ装置つくるの?おもしろそう!父:じゃぁこれとこれとこれを買って・・・。

子:買いすぎじゃない?おかあさんに怒られない?
父:おかあさんにはおやつカルパス買って帰れば大丈夫だよ。さぁおうちに帰ってさっそく作ってみよう!
単体テスト(Unit Test)をしてみよう

父:まずはこれだな。
子:え、これでいいの?

父:うん、これでいい。
子:ガム1つ立てただけじゃん!ねぇこれ食べていいの?当たりかなあ?
父:まぁちょっと待ってよ、これを指でつついたら倒れる?ちょっと倒してみて。
子:あれ、倒れない。なんかずれたりする。今度は変な方向に行くし、力加減が難しいね。
父:そうだよね、これ全く同じ向きに同じ倒れ方をさせるのって、すごい難しいことだと思うんだ。ましてや人の力は必ずしも一定じゃないし。
子:うーん、難しい、どうやったらきれいに倒れるのかな?
父:ガムにセロテープ貼ってみようか。今度はどう?


子:あ、ガムが変な方向に飛んでいかないし、きれいにパタッと倒れるようになったよ!でも、これなにやってるの?楽しくはないよ!
父:実はもうテストは始まっているんだよ。これを単体テスト (英語表記の頭文字をとってUT)っていうんだ。
子:急に専門用語が出てきた。ガムが1個倒れるかいろいろ試してただけだよ?
父:そう、それでいいんだ。思っている方向に、思っている力加減で、倒す。1つの(単体の)出来事が何回繰り返されても同じ挙動をすること。これがシステムを作るうえでの第一歩と言っていい。
最初ガムを立てただけだとうまく倒れなかったから、支えとなるセロテープを貼ったね。これはシステムを作る人が簡単な仕組みを作って試して、うまくいくように修正を加える作業に近いね。修正をするとうまく動くようになったね。
子:へーなんだか、だまされているような気がするけどそういうものなんだね?でもこれで終わりじゃないでしょ?ほかにもいっぱい買ったもんね。
結合テスト(Integration Test)できるかな
父:そう、まだ始まったばかりだよ。次にもう1個ガムを立ててみよう。1個目のガムが倒れた力で2個目のガムも倒れるかな?
子:そんなの簡単だよ、1個目のガムが倒れる位置に、ガムをもう1個置けばいいんだ。
父:そうだね!すごいその通りだ。同じ大きさのガムなら、なんとなく感覚でわかるよね。位置だけきれいに倒れるように調整したらいいね。さっき単体テストをやったけど、これを結合テスト(英語表記の頭文字をとってIT)っていうよ。結合テストでは、単体同士確認の取れているものを組み合わせたときに、思った通りに動くことを確認するんだ。

子:え?でもささっきガムがきれいに倒れることを単体テストで確認したんだったら、それが何個組み合わさってもうまく倒れるんじゃないの?
父:そう思うよね?でもそうならないこともあるんだ。例えば、単体テストをして確認したガムを同じ倒れる方向に置けばいいけど、逆方向に置いたらどう?
子:あ、セロテープの位置が逆になるから倒れないや。

父:そうだよね。例えばドアを作っている人がドアが開け閉めできることは確認していざトイレに取り付けたら便座のあるほうに開いちゃって狭くて扉があかないとか。実際にあることなんだ。だから単体テストだけして結合テストしないと永遠にトイレに閉じ込められることになっちゃう。怖いよね。
子:そんなの絶対やだよ、怖すぎるでしょ。
父:結合テストをしないことの怖さが分かったね。じゃぁこのガムの残り全部ならべてみようか。

子:並べてみると豪華だね。あたりは何個あるかな・・・あれ?2個目よりうしろのテープ外しちゃったの?
父:実はね。並べている途中で、並べながら倒して~を繰り返して試して、最後まで倒れるかの結合テストをしてたんだ。そしたらね、ガムテープを張っていると3個目以降はテープの力で倒れないことが分かったんだ。これは結合テストをしてみないとわからなかったことだ、確認できてよかった!よし、これをガム軍団と名付けて、次に行ってみよう。

父:今度はボールを勢いよく転がしてみよう!
子:面白そう!しかもこれスーパーボールだから跳ねるね!
父:今回は転がすだけにするよ、いろいろ終わったらあとで遊ぼうね。
子:でもこれどうやって転がせばいいの?転がし始める位置も方向も何も決まっていないからバラバラになっちゃうよ。
父:そうだね、そういうときはどうするんだったかな?何回やっても同じ結果になるようにはどうすればいいんだった?
子:セロテープを貼る?
父:惜しい!でもそういうことだね。今度はガムを倒すのと違うね。ガムの時は同じ方向に同じ力で倒れるようにだったけれど、今度はボールが同じ方向に同じ力で転がればいいんだ。つまり、ボールが転がるための線路をつくってあげればいいのと、ボールを転がし始める位置に印があるといいよね。
子:なるほど、そういうことか!
父:駄菓子屋さんで買った細長いゼリーを少し高い位置にテープで固定してごらん。

子:おー、テープの位置から転がしたら毎回同じところに転がっていくよ!
父:うまくいったね、じゃぁちょっと思い出してみてほしいんだけど、ゼリーで線路を作ることと、印をつけるのってさ、さっきのガムの例でいうと何にあたると思う?
子:あ、これはわかった、セロテープを貼るっていうことと一緒?
父:そうだね!我が子ながら天才かな?ボールが何度転がっても同じ結果になるように補正したんだね。これはさっきの単体テストとその修正と同じだ。この装置をボール滑り台って呼ぼう!
2つの結合テスト
父:じゃぁ続けてで大変だけど、さっきのガム軍団とボール滑り台を組み合わせたらどうなると思う?
子:ボールがガムにあたって、ガム軍団が倒れていくと思う!
父:正解!実はこれも結合テストなんだ。さっきはガムとガムの単体の動きの結合をテストしたね。ちょっと難しいけれど、こういう同じ仲間の部品同士の結合テストを内部結合テストって呼んだりするよ。一方で、ガム軍団とボール滑り台のように違う部品同士を結合させてテストすることを外部結合テストって呼んだりするんだ。
子:あ、また難しい話がはじまった・・・。
父:実際のシステムの話をすると、例えば、異なるシステムを連続的に使うことで大きなサービスが成り立つとして、この異なるシステムの結合を確認することを外部結合(外結やITb)、同じシステム内での機能群の繋がりを確認することを内部結合(内結やITa)って呼ぶよ。
子:大人って大変なんだね・・・ねぇお父さん、いっぱい考えて疲れたよ〜
父:今回はここまでにしよっか。次は総合テストと受入テストについて勉強するぞ!
子:(また難しい言葉が出てきた!まぁ、またお菓子で遊べるしいいか〜)
つづく。
おわりに
いかがだったでしょうか、今回は単体テスト〜結合テストまでを組み上げながら考えてみました。実際のシステム開発現場では、以下のような絵(V字モデル)を利用してシステムの各工程を表現することが多く、今回は青い領域のお話し(実装から結合テストまで)をしました。

V字の右側は総じてテストレベルと呼ばれて、単体〜結合〜総合(システム)〜受入に区分されます。次回は、結合テストの後工程にあたる総合テスト、受入テストについてお話ししたいと思います。
補足
V字モデルは、システム開発手法における計画主導型手法(ウォータフォールモデルとも呼ばれる)で利用されることが多いです。このように工程を、ひとつずつ順番に計画して積み上げていく方法のほかに、アジャイル型開発手法と呼ばれるものもあります。ほかの方々がアジャイルについて多く記事を掲載いただいていますが、私も過去にこういった記事を書きました、よろしければ参照ください。
__________________________________
執筆者プロフィール:谷岡 俊祐
2児の父。SIerにて自治体向けシステム開発に長年従事した後、SHIFTへ入社。エンジニアの知見とQA×SMの観点で業務改善や因数分解、チーム改善が得意。
最近は蓄積された知見や業務を如何に低コストで掬い上げるかをテーマに手法確立に向けて試行錯誤中。
お問合せはお気軽に
https://service.shiftinc.jp/contact/
SHIFTについて(コーポレートサイト)
https://www.shiftinc.jp/
SHIFTのサービスについて(サービスサイト)
https://service.shiftinc.jp/
SHIFTの導入事例
https://service.shiftinc.jp/case/
お役立ち資料はこちら
https://service.shiftinc.jp/resources/
SHIFTの採用情報はこちら
https://recruit.shiftinc.jp/career/