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

第32回【テストコヌドのガむドラむン その】【無駄】「if (TEST)」ずいう劥協 ── 汚れたコヌドにテストの䟡倀はない

    ♚ 倖郚サヌビスの壁ず「名案」

    東根枩泉支郚の開発宀。窓の倖では、枩泉街の街灯が琥珀色の霧の䞭に点々ず浮かび䞊がり、幻想的な倜が始たろうずしおいた。しかし、ヒマリのデスク呚蟺だけは、決枈システムのドキュメントず栌闘する圌女の熱気で、冬の寒さを忘れるほどだった。

    ヒマリは今、倖郚の決枈APIず連携する重芁機胜のテストに挑んでいた。前回の「境界線」の教えを胞に、倖郚サヌビスぞの䟝存をどう扱うか。それが今の圌女の最倧のテヌマだ。

    ヒマリ 「うヌん  。実際に倖郚APIを叩いちゃうず、テストのたびに1円ず぀課金が発生しちゃうし、テスト甚の決枈デヌタが本番の管理画面に溜たっおいくのも良くないですよね  。でも、ここを通さないずテストが完了しないし  。」

    数分間の沈黙。そしお、ヒマリの顔にパッず明るい色が差した。

    ヒマリ 「あ、名案 テストの時だけ、この凊理を『なかったこず』にすればいいんだ」

    ヒマリは迷いなくキヌボヌドを叩き始めた。


    ♚プロダクションコヌドに混ざる「䞍玔物」

    翌朝、ヒマリは意気揚々ずマリを呌び寄せた。

    ヒマリ 「マリさん、芋おください 倖郚APIの壁、突砎したした 本番コヌドの䞭に『もしテスト環境だったら、APIを叩かずに成功を返す』っおいう分岐を入れたんです。これで課金を気にせず、テストを䜕床でも回せるようになりたした」

    ヒマリが誇らしげに指し瀺したコヌドには、次のような䞀節が刻たれおいた。

    def process_payment(self, amount):
        # テスト環境ならAPIを叩かずに成功扱いにする
        if config('APP_ENV') == 'testing':
            return True 
    
        # 本物の決枈API呌び出し
        return PaymentGateway.charge(amount)
    

    マリは、そのコヌドを数秒間、ただ静かに芋぀めおいた。その沈黙は琥珀色のお茶が冷めおいくよりも長く、重かった。

    マリ 「  ヒマリちゃん。そのコヌドは、本物の挙動をテストしおいるず蚀えるのかしら ☕」

    ヒマリ 「えっ はい、テストはグリヌンになりたしたし、党䜓のリズムも良くなりたした。䜕か問題がありたしたか」


    ♚ メ゜ッドの切り出しず「身代わり」の技術 ── 鏡を塗るなかれ

    マリは静かに怅子を匕き、ヒマリの隣に座った。

    マリ 「テストのために本番コヌドを曞き換えるのはね、鏡に映った自分を綺麗に芋せるために、自分の顔を掗うのではなく、鏡の方を塗り぀ぶすようなものよ。☕」

    ヒマリ 「鏡を  塗り぀ぶす」

    マリ 「そう。この if(TEST) ずいう分岐がプロダクションコヌドに混ざった瞬間、そのコヌドの䟡倀は二぀の意味で損なわれおしたうわ。☕」

    ① それは「テスト」ではない

    マリ 「あなたが曞いたテストは、今や if 文の䞭にある return True を確認しおいるだけに過ぎないわ。本来呌び出されるべきメ゜ッドが正しい匕数で呌ばれおいるか、戻り倀の型が本圓に䞀臎しおいるか。肝心なこずは䜕䞀぀怜蚌できおいないの。これは『テストを通すための劥協』であっお、『品質の担保』ではないわ。☕」

    ② 本番環境ぞの「時限爆匟」

    マリ 「そしお䜕より恐ろしいのは、もし環境蚭定の刀定ミスが起きたり、条件匏にバグが玛れ蟌んだらどうなるか。本番環境で突然『決枈をスキップしお成功を返す』ずいう倧惚事が起きかねない。テストのために、本番を危険に晒す。それは本末転倒だず思わない ☕」

    ヒマリは血の気が匕くのを感じた。良かれず思っお入れた「名案」が、実はシステムの信頌性を根底から揺るがす「䞍玔物」だったのだ。

    マリ 「解決策は、コヌドの䞭に分岐を曞くこずじゃない。『倖偎から身代わりを立おる』 こずよ。☕」

    マリはホワむトボヌドに、決枈凊理をむンタヌフェヌスたたは抜象クラスずしお切り出す図を描いた。

    1. むンタヌフェヌス化: 「決枈する」ずいう振る舞いだけを定矩する。

    2. 本物の実装: 実際にAPIを叩く。本番環境ではこれを䜿う。

    3. 身代わりモック: APIを叩いたふりをしお、期埅する結果を返す。テスト環境ではこれを「泚入」する。


    ♚ 汚さないこずが、信頌ぞの近道

    マリの指導を受け、ヒマリは即座に if (env == 'testing') ずいう汚れをコヌドから削陀した。

    サキ 「そうそう。ひた、芚えおおきなさい。✚ 本番コヌドは垞に『本物』であるべきなんだ。環境の切り替えはコヌドの䞭でコ゜コ゜やるんじゃなくお、DIコンテナや環境蚭定っおいう『倖偎の仕組み』で堂々ずやる。それがプロの䜜法だよ。✚」

    サキがい぀ものように茶目っ気たっぷりにりむンクする。

    ナむ 「あぅ  っ。  本番コヌドが綺麗なたたなのに  。テストの時だけ『身代わり』が戊っおくれる。それが、䞀番安心できるねぇ  っ。」

    ナむの蚀葉に、ヒマリは深く頷いた。

    テストコヌドのためにプロダクションコヌドに手を加えるこずは、䞀芋効率的に芋えお、実は「蚭蚈の敗北」を認めるこずだったのだ。

    ヒマリ 「テストを通すために魂を売っちゃダメですね  。むンタヌフェヌスを意識しお、本番コヌドの『玔床』を100%に保ちたす。どんなに耇雑な倖郚サヌビスが盞手でも、コヌドを汚さずに制圧しおみせたす」

    東根枩泉の琥珀色の倜颚が、窓から入り蟌み、ヒマリの熱くなった頬を心地よく冷やした。

    ゚ディタに䞊ぶのは、テスト甚の䞍玔物が䞀切ない、凛ずしたプロダクションコヌド。

    そしお、その「玔粋な本物」を倖偎から完璧に支える、掗緎されたテストコヌド。

    ヒマリが手に入れたのは、単なるテストの成功ではない。

    どんな環境の倉化にも揺らがない、システムに察する「絶察的な信頌」ずいう名の、透明な盟だった。


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

    テストコヌドは䜕のためにあるのでしょうか。 倧切なこずなので䜕床でも蚀いたすが、それは「プロダクトコヌドの品質を担保するため」に他なりたせん。

    品質を担保すべき「盟」であるはずのコヌドの䞭に、本番では決しお通るこずのない、テスト時専甚の「逃げ道」を䜜っおしたうのはどうでしょうか。それはもはや品質を保蚌しおいるのではなく、単に「テストの結果を緑色にする」ためだけの、自己満足で無意味な䜜業に成り䞋がっおしたいたす。

    実際の珟堎で、こんな光景を目にしたこずがありたす。 「テストコヌドから本番の課金凊理を叩くわけにはいかないから」ずいう理由で、課金ロゞック党䜓を if 文で䞞ごずスキップし、匷制的にテストを成功させおいたのです。

      これでは、䜕の意味もありたせん。

    では、倖郚サヌビスが絡むような困難なケヌスで、どうやっお「意味のあるテスト」を曞くべきなのか。そこで救䞖䞻ずなるのが、これたで䜕床もお話ししおきたDI䟝存性の泚入です。

    課金凊理の実装をクラスの内郚に固定せず、倖郚から「泚入」できるようにプロダクトコヌドを蚭蚈する。そうすれば、テストの時だけ「決枈したふりをしお成功たたは倱敗を返す」モックず呌ばれる仮の実装を流し蟌み、本番コヌドを1行も汚すこずなく、完璧な怜蚌が可胜になりたす。

    ここで、前回の「staticメ゜ッドはやめたしょう」ずいう話も繋がっおきたす。 staticメ゜ッドを倚甚し、内郚でガチガチに結合しおしたったコヌドは、倖郚から「身代わり」を泚入する隙間がありたせん。結果ずしおテストが曞けなくなり、安易な if (TEST) ずいう劥協に手を染めるこずになるのです。

    「汚いテスト」は「汚い蚭蚈」から生たれたす。 本番コヌドの玔床を守り抜く蚭蚈の芏埋こそが、嘘停りのない、真の品質担保を実珟するための唯䞀の道なのです。

    ぀づく

    #゚ンゞニア #プログラミング #テストコヌド #ナニットテスト #蚭蚈 #DI #䟝存性の泚入 #モッキング #モック #クリヌンコヌド #リファクタリング #゜フトりェア開発 #品質保蚌 #QA #技術的負債 #プロダクションコヌド #東根枩泉秘密結瀟 #テスト容易性


    あなたぞのおすすめ