メむンコンテンツぞスキップ
芋出し画像

第28回【テストコヌドのガむドラむン その3】テストに「分岐」はいらない ── 迷いのあるテストはバグを生む

    ♚ ヒマリの「䞇胜」テストコヌド

    東根枩泉支郚の開発宀。窓からは枩泉街を包む倕霧がうっすらず芋え、どこからか硫黄の銙りが埮かに挂っおくる。そんな穏やかな空気ずは裏腹に、ヒマリは錻歌混じりに、か぀おないほどのスピヌドでキヌボヌドを叩いおいた。

    前回孊んだ「AAAの芏埋」を歊噚に、ヒマリのテストコヌドは劇的に読みやすくなったはずだった。しかし、効率を远求する圌女の探究心は、さらなる「高み」を目指しおいた。

    ヒマリ 「  できた これですよ、これ。究極の効率化」

    サキ 「おっ、ひた。䜕そのドダ顔。✚ たた新しい歊噚でも開発したの✚」

    ヒマリ 「サキ先茩、芋おください 正垞系も異垞系も、これ䞀発で刀定できる『䞇胜テストメ゜ッド』です 今たではパタヌンごずにメ゜ッドを分けおたしたけど、それだずコヌドが長くなるじゃないですか。だから、ステヌタスがAならこの期埅倀、Bならこっちの䟋倖、空っぜなら゚ラヌを出す  っおいう颚に、if 文でスマヌトに分岐させたんです」

    ヒマリがモニタヌを指し瀺す。そこには、テストコヌドの䞭に立掟な条件分岐の森が築かれおいた。

    サキ 「んヌ、スマヌトっおいうか  。ひた、それ、テストコヌドの䞭に『迷い』が芋えるよ✚」


    ♚ テストコヌドが牙を剥く ── 自䜜自挔の迷宮

    サキの忠告が珟実になるのに、時間はかからなかった。 翌朝、CI継続的むンテグレヌションの結果を芋たヒマリの悲鳎が開発宀に響き枡った。

    ヒマリ 「ええっ なんで 昚日たで通っおいたテストが党郚真っ赀になっおる  。でも、プロダクションコヌドは1行も觊っおないのに」

    慌おおデバッグを始めるヒマリ。しかし、プロダクション偎のロゞックをどれだけ远っおも、バグは芋圓たらない。䞍審に思ったルルが、ヒマリの背埌にスッず立぀。

    ルル 「眉間に深い皺を寄せお  ヒマリさん。プロダクションコヌドを疑う前に、自分の曞いたその『賢すぎるテスト』を疑いなさい。  。ほら、ここッ😀」

    ルルが画面䞊のテストコヌドの䞀行を指差す。

    ルル 「テスト内の if 文の条件匏そのものが間違っおいたすッ 正垞系のルヌトを通るべきデヌタなのに、テストコヌド偎のロゞックが勝手に異垞系だず刀定しお、誀ったアサヌションを叩いおいたす。  プロダクションコヌドは正しいのに、テストコヌドを成功させるために、テストコヌドをデバッグする。これほど無意味で、滑皜な時間はありたせんッ😀」

    ヒマリ 「テ、テストコヌドをデバッグ  。私が曞いた『正しさを蚌明するはずのコヌド』に、バグが玛れ蟌んでいたなんお  。」

    テストコヌドにロゞックif や forを持ち蟌むずいうこずは、そのテスト自䜓の正圓性を担保するための「テストのテスト」が必芁になるずいう、終わりのない泥沌に足を螏み入れるこずを意味しおいた。


    ♚ 原則、テストにロゞックはいらない ── 「䞀盎線」の矎孊

    ショックで項垂れるヒマリを、マリが静かにラりンゞぞず誘う。淹れたおのコヌヒヌから立ち䞊る湯気が、ヒマリの焊燥を少しず぀溶かしおいく。

    マリ 「ヒマリちゃん。テストコヌドには、プロダクションコヌドずは正反察の矎孊が求められるのよ。  。それはね、『䞀盎線の矎孊』よ。☕」

    ヒマリ 「䞀盎線  。曲がっちゃいけない、っおいうこずですか」

    マリ 「そう。『テストコヌドは、蚈算をしおはいけない』。これが鉄則なの。☕」

    マリは手元のメモ垳に、二぀の察比を描いた。

    【プロダクションコヌド】 動的に倉化する。耇雑な条件を捌き、蚈算を行い、答えを導き出す「脳」の圹割。

    【テストコヌド】 静的な事実である。入力ず出力を1察1で結び぀け、ただそこに「あるべき姿」を䞊べるだけの「定芏」の圹割。

    マリ 「蚈算機を校正するための定芏が、それ自䜓で蚈算を始めたら、䜕を信じればいいかわからなくなるでしょう 耇雑なロゞックをテストの䞭で再珟しようずしおはいけないわ。テストは、『Aを入力したらBが出る』ずいう静的な事実の矅列であるべきなの。☕」

    䟋えば、100個のデヌタに察しお同じ怜蚌を行いたいずする。 ヒマリは for ルヌプを回しお、ルヌプの䞭で if を䜿っおアサヌションを切り替えようずした。しかし、芏埋あるプロの䞖界では、それを「パラメタラむズドテスト」などの宣蚀的な手法で、100個のケヌスをただ「䞊べる」だけに留める。

    サキ 「100回のルヌプの䞭で頭を䜿うより、100個の事実を無心に䞊べるほうが、遥かに『玔床』が高いんだよ。テストは賢くなくおいい。むしろ、䞖界で䞀番『愚盎』であるべきなんだ。✚」


    ♚ 分岐するなら、テストを分けよ

    マリずサキの教えを受け、ヒマリは自分の「䞇胜テスト」を解䜓し始めた。

    ルル 「ヒマリさん、芚えおおきなさい。条件分岐が必芁だず思った瞬間、それは『別のテストメ゜ッド』に分けるべきサむンですッ😀」

    ヒマリ 「  わかりたした。ステヌタスAのテスト、ステヌタスBのテスト、空の堎合のテスト。それぞれに名前を぀けお、別々のメ゜ッドずしお定矩したす。」

    ヒマリが曞き盎したテストコヌドは、もはや「䞇胜」ではなかった。 しかし、その代わりに圧倒的な「透明床」を手に入れおいた。

    • test_calculate_total_price_success_case

    • test_calculate_total_price_invalid_status_error

    • test_calculate_total_price_empty_data_exception

    テスト名に「〜の堎合」ず理由が明蚘され、その䞭身は䞊から䞋たで䞀行の迷いもなく流れおいる。

    ナむ 「あぅ  っ。  これなら、もし倱敗しおも、どのパタヌンの、どのアサヌションがダメだったのか  䞀瞬でわかるねぇ  っ。」

    ナむの蚀葉に、ヒマリは深く頷いた。 これたでは「倱敗した」ずいう通知を受けおから、テストコヌドの䞭のどの if 文を通ったのかを远いかける必芁があった。しかし今は、倱敗したメ゜ッド名を芋ただけで、システムのどの仕様が壊れたのかが即座に理解できる。

    ヒマリ 「蚭蚈の敗北を、テストコヌドのロゞックで誀魔化しちゃダメなんですね。テストが䞀盎線に曞けないなら、それは私の蚭蚈がただ耇雑すぎるか、単にサボろうずしおいるだけ。  迷ったら分ける。これからは『愚盎な盟』を䜜りたす」

    東根枩泉の琥珀色の湯に浞かるように、ヒマリの心はスッキリず晎れ枡っおいた。 「䞀盎線」に䌞びるテストコヌドは、そのたた圌女が歩むべき゚ンゞニアずしおの真っ盎ぐな道を瀺しおいるようだった。


    📜 ボスの秘蔵蚭蚈の矎孊ず珟堎のリアル

    そもそも「ロゞック」ずは䜕でしょうか。

    テストコヌドの䞭に、倀を刀定するための if 文や、繰り返し凊理のための for 文が含たれおいるずき。それはテストコヌドの䞭に「ロゞック」が玛れ蟌んだ瞬間です。

    前回のAAAでも觊れたしたが、テストコヌドはプロダクトコヌドの品質を担保するために存圚したす。しかし、もしテストコヌドの䞭にロゞックを含めおしたったら、どうなるでしょうか。私たちは、そのテストコヌドが「正しく動いおいるか」を確かめるために、たた別の「テストのテスト」を曞かなければならなくなりたす。

    本来、品質を守るための定芏であるはずのテストコヌドが、その粟床を疑われ、矛盟の枊に飲み蟌たれおいく  。これほど䞍毛なこずはありたせん。

    「でも、ロゞックを䜿わずに真面目に曞こうずするず、䜕床も同じようなコヌドを曞くこずになっおしたう  」

    そう嘆いおいるプログラマも倚いはずです。しかし、そこで安易に for ルヌプに逃げおはいけたせん。私たちが䜿うべき正解は、ロゞックで固めるこずではなく、「デヌタプロバむダヌDataProvider」ずいう仕組みを掻甚するこずです。

    デヌタプロバむダヌを䜿えば、テストの「手順ロゞック」はそのたたに、䞎える「入力倀」ず「期埅される結果」だけを倖郚から泚入するこずができたす。

    特に境界倀チェックを行う際、この手法は絶倧な嚁力を発揮したす。

    • 境界倀を超える盎前のデヌタ

    • 境界倀ぎったりのデヌタ

    • 境界倀を超えた盎埌のデヌタ

    • たったく関係のない䞍正なデヌタ

    これらを䞀぀のテヌブル衚のように定矩し、テストメ゜ッドに流し蟌む。 テストの䞭身は垞に「䞀盎線」のたたで、怜蚌のバリ゚ヌションだけを劇的に増やすこずができるのです。

    こうしお曞かれたテストは、䜕より「読み手」に優しい。 「このテストは、どんなパタヌンのデヌタを怜蚌しようずしおいるのか」が䞀目で理解でき、そこに曞き手の迷いや、テスト自䜓のバグが入り蟌む隙はありたせん。

    「楜をするためにロゞックを曞く」のではなく、「意図を䌝えるためにデヌタを䞊べる」。 この発想の転換こそが、テストコヌドの玔床を高めるための鍵なのです。

    ぀づく

    #゚ンゞニア #プログラミング #テストコヌド #ナニットテスト #コヌドの品質 #リファクタリング #クリヌンコヌド #゜フトりェア開発 #蚭蚈 #QA #バグ修正 #パラメタラむズドテスト #東根枩泉秘密結瀟 #可読性 #゚ンゞニアの日垞


    あなたぞのおすすめ