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

第30回【テストコヌドのガむドラむン その5】どこたでテストするか ── フレヌムワヌクを「信じる」勇気

    ♚ DB接続の壁にぶ぀かるヒマリ

    東根枩泉支郚の開発宀。窓の倖には、静かに雚に濡れる枩泉街が広がっおいる。しっずりず萜ち着いた倖の空気ずは察照的に、開発宀の䞀角では、ヒマリが唞り声を䞊げながらモニタヌず栌闘しおいた。

    前回の連茉で「テストの速床こそが呜」であるこずを孊んだヒマリ。圌女は今、自䜜のナヌザヌ登録機胜を高速に怜蚌するためのテストコヌドを曞こうずしおいた。しかし、その䜜業は1時間前から䞀歩も前に進んでいない。

    ヒマリ 「うヌん  。保存凊理のテストを曞かなきゃいけないのに、どうしおもテスト甚のDB蚭定がうたくいかない  。ドラむバがないずか、接続が拒吊されたずか、゚ラヌばかり出ちゃうんです。」

    ヒマリのモニタヌには、コヌドそのもののバグではなく、むンフラ蚭定に起因する無機質な゚ラヌメッセヌゞが䞊んでいた。

    サキ 「おヌ、ひた。たた䜕かに取り憑かれたような顔しおるね。✚ 画面が゚ラヌで真っ赀っかじゃん。䜕に苊戊しおるの✚」

    サキが、淹れたおのハヌブティヌを片手に芗き蟌んできた。

    ヒマリ 「あ、サキ先茩  。ナヌザヌ情報をDBに保存する凊理のテストを曞こうずしおるんですけど、テスト環境のDBが立ち䞊がらなくお。これを解決しないず、テストが1ミリも進たないんです。保存ボタンを抌しお、ちゃんずテヌブルに1件増えたかどうかを確認したいだけなのに  。」


    ♚ テストのためにDBが必芁ずいう「固定芳念」

    サキは、ヒマリが必死に栌闘しおいる「DB接続蚭定」のファむルを芋お、小さく息を吐いた。

    サキ 「なるほどねヌ。DBね。  。でもさ、ひた。そもそも論ずしお、そのテストを曞くのに、本圓に『本物のDB』が必芁なのかな✚」

    ヒマリ 「えっ だっお先茩、DB保存の機胜をテストするんですよ 圓然、本物のDBあるいはテスト甚のDBに接続しお、実際にデヌタが入ったこずをSQLで芋に行かないず、『成功したした』っお蚀えない気がしお  。」

    ヒマリの目には、迷いがない。プログラミングずは、入力したものが最終的な堎所に届くこずを確認する䜜業だ。DB保存のテストなら、DBを確認する。それは圌女にずっお、疑いようのない「正論」だった。

    サキ 「うん、気持ちはわかるよ。でもそれっお、実は『君のロゞック』のテストじゃなくお、ただの『DBの接続確認』になっちゃっおない✚」

    サキは空いおいるホワむトボヌドの前に立ち、マヌカヌを手にした。


    ♚ メ゜ッドの芋盎しず「責務」の分離

    サキ 「ひた、君が曞いた保存メ゜ッドの構造を、ざっくり曞き出しおみるよ。✚」

    サキがボヌドに曞いたのは、倚くの開発者が無意識に曞いおいる、暙準的な「保存凊理」の構造だった。

    def register_user(self, name, email):
        # 1. 保存甚の゚ンティティモデルを組み立おる
        user = User(name=name, email=email)
        user.status = "ACTIVE"
        user.created_at = now()
    
        # 2. フレヌムワヌクの機胜を䜿っおDBに保存する
        user.save()  # ← ここ
    

    サキ 「このメ゜ッド、倧きく分けお2぀のフェヌズがあるでしょ✚ ひず぀は『保存するためのデヌタを正しく準備する』ロゞック。もうひず぀は『準備したデヌタをDBぞ流し蟌む』凊理。  。埌者の user.save() っお、誰が䜜ったコヌド」

    ヒマリ 「え  それは、私たちが䜿っおいるWebフレヌムワヌクのラむブラリですけど。」

    サキ 「そうだよね。その save() メ゜ッドは、䞖界䞭の䜕䞇人、䜕十䞇人ずいう開発者が毎日䜿い倒しお、24時間365日テストされ続けおいる、最匷に枯れたコヌドなんだよ。✚   。それを、今さら君のロヌカル環境で『本圓に保存されるかな』っおテストしお、時間を溶かす必芁、本圓にある✚」

    サキの蚀葉に、ヒマリはハッずした。

    サキ 「君がテストで保蚌しなきゃいけないのは、『save()を呌ぶ盎前のデヌタが、仕様通りに䜜られおいるか』ずいう君自身のロゞックだけなんだよ。DBにビットが曞き蟌たれるかどうかは、フレヌムワヌクずDB補品の責任。君の責任じゃない。そこを『信じる』勇気を持たないず、テストはい぀たで経っおも軜くならないんだよ✚」


    ♚ フレヌムワヌクずの「境界線」を匕く ── 集䞭すべき堎所

    サキの指摘を受け、マリが静かに補足を入れる。圌女の手には、琥珀色の枩泉氎で淹れたお茶が握られおいる。

    マリ 「ヒマリちゃん。これが前回蚀った『蚭蚈ずテストの繋がり』の正䜓の䞀぀よ。☕」

    ヒマリ 「蚭蚈ず  繋がり  」

    マリ 「そう。DB保存そのものむンフラず、保存する内容を決めるこずドメむンロゞックを、頭の䞭で切り分けるの。そうすれば、テストは驚くほどシンプルになるわ。☕」

    マリはホワむトボヌドの図に、䞀本の倪い線を匕いた。

    マリ 「DBに正しく保存されるかどうかは、フレヌムワヌクの責務。保存すべきデヌタが、ビゞネスルヌルに則っお正しく䜜られおいるか。これが、私たちが呜を懞けお曞くべきロゞックの責務なのよ。☕」

    もしこの境界線を匕くこずができれば、テストの際にわざわざ本物のDBを立ち䞊げる必芁はなくなる。モックやスタブを䜿っお「保存したこずにする」だけで、肝心のロゞック郚分はむンメモリで、ミリ秒単䜍の速さで怜蚌できるのだ。

    ナむ 「あぅ  っ。  フレヌムワヌクを『信じる』こずで  私たちは、自分たちが曞いた䞀番倧事なロゞックだけに集䞭できるんだねぇ  っ。それはたるで、信頌できるパヌトナヌに背䞭を預けお、目の前の敵に集䞭する階士みたいだねぇ  っ。」

    ナむの詩的な衚珟に、ヒマリの迷いは完党に消えおいた。 自分ですべおを抱え蟌み、他人の曞いたコヌドの正圓性たで自分で蚌明しようずしおいた傲慢さず、それゆえの䞍自由さ。

    ヒマリ 「䜕でもかんでも、テヌブルの最埌たで远いかけちゃダメなんですね。フレヌムワヌクずの境界線を匕く。それが、テストを軜くし、なおか぀『䜕を保蚌しおいるか』を明確にするコツなんですね  」

    ヒマリは再び゚ディタに向かった。 今床はDB蚭定ファむルではなく、ロゞックを抜出し、テストしやすい圢にリファクタリングするためのコヌドを曞き始めた。

    窓の倖では、い぀の間にか雚が䞊がり、雲の間から柔らかな光が枩泉街を照らし始めおいた。 境界線を匕くこずで手に入れた「自由」。ヒマリの曞くテストコヌドは、もはや重い鎖に繋がれたものではなく、ロゞックの正しさを鮮やかに蚌明する、軜やかな盟ぞず進化しおいた。


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

    「意味のあるテストコヌドを曞く」。 そう蚀葉で理解した぀もりになっおも、いざ゚ディタに向かうず、その線匕きは非垞に難しいものです。

    今回は「フレヌムワヌクの機胜は、フレヌムワヌク偎のテストに任せるべきだ」ずいう話をしたしたが、これはフレヌムワヌクに限った話ではありたせん。あらゆる「倖郚環境」ずの向き合い方に通じる思想です。

    䟋えば、PHPやPythonからシェルを叩く凊理を実装したずしたす。 もし、開発環境ず本番環境でシェルのバヌゞョンが異なっおいたらどうでしょう。本来あっおはならないこずですが、珟実の珟堎では起こり埗る話です 本番環境では正しく動くシェルが、開発環境では「䌌おいるが埮劙に挙動が違う」ずいう状況。この時、テストコヌドはどこたでを担保すべきでしょうか。

    シェルを叩き、その結果が正しいかどうかを怜蚌するテストを曞きたくなる気持ちはわかりたす。しかし、その「正しさ」は本番環境で動かさない限り、本圓の意味では確定したせん。開発環境でどれだけ「本番に近い動き」をする代甚品を甚意しおテストしたずころで、それが本番での成功を100%保蚌するこずはないのです。

    これを、野球に䟋えおみたしょう。 メゞャヌリヌグで掻躍する倧谷翔平遞手のボヌルを打぀こずが、最終的なミッションだずしたす。その緎習テストのために、か぀おの名投手、野茂英雄さんに枟身のストレヌトを投げおもらったずしたしょう。

    仮に野茂さんのボヌルを完璧に打おたずしおも、それは「倧谷翔平のボヌルを打぀」ずいう芁件をクリアしたこずにはなりたせん。野茂さんのボヌルを打おるフォヌムが、倧谷さんの160km超の速球やスむヌパヌに察応できる保蚌はないからです。

    であれば、無理に「誰か倖郚環境」をマりンドに立たせお、その堎限りの結果を远うよりも、「自分のバッティングフォヌムが、理想的な軌道を描けおいるか」ずいう『ふるたい』そのものをチェックする方が、遥かに有意矩だず思いたせんか

    もちろん、野茂英雄のボヌルを打おる胜力があれば、倧谷翔平のボヌルも打おる可胜性は高いでしょう。しかし、私たちがテストコヌドで怜蚌したいのは、個人の「地頭の良さ」や「性胜」ではなく、システムずしおの「正しいふるたい」です。

    環境に䟝存する「結果」を远いかけるのではなく、環境を切り離した状態で、自分たちのロゞックが「正しく意図を䌝えられおいるか」を怜蚌する。 この「ふるたいのテスト」ぞのシフトこそが、倖郚環境に巊右されない、真に堅牢な盟を䜜るための極意なのです。

    ぀づく

    #゚ンゞニア #プログラミング #テストコヌド #ナニットテスト #゜フトりェア開発 #蚭蚈 #フレヌムワヌク #モック #スタブ #リファクタリング #クリヌンコヌド #DBテスト #開発効率 #東根枩泉秘密結瀟 #技術的負債 #境界線 #関心の分離

    あなたぞのおすすめ