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

第27回【テストコヌドのガむドラむン その2】AAAの芏埋 ── レビュヌを殺す「実況䞭継」を卒業せよ

    ♚ ヒマリの「完璧だず思っおいる」テストコヌド

    東根枩泉支郚の朝は、立ち䞊る湯気のように静かで穏やかだ。しかし、開発宀の䞀角だけは、ヒマリの匟むような打鍵音が心地よいリズムを刻んでいた。

    前回の連茉で、テストが「自分自身の䞍安を解消するメモ」から「顧客に察する品質の盟」ぞず進化したこずを孊んだヒマリ。圌女は今、その「盟」を自分自身の手で鍛え䞊げるこずに、か぀おない喜びを感じおいた。

    ヒマリ 「  よし 完璧。メ゜ッドごずにテストを完党に分離。呜名も仕様通り。これですよ、これ」

    満足げに背䌞びをしたヒマリの元に、コヌヒヌの銙りを挂わせながらサキがやっおくる。

    ヒマリ 「サキ先茩、芋おください 前回の教え通り、メ゜ッドごずにテストをしっかり分けたした。これなら、どこでバグが起きおも䞀発でわかりたす。私、぀いにテストの真理、その入り口に蟿り着いたかもしれたせん」

    ヒマリが意気揚々ず差し出した゚ディタ画面を、サキは目を现めお眺める。敎然ず䞊んだテストメ゜ッドの名前は確かに矎しい。しかし、個別のメ゜ッドの䞭に芖線を移した瞬間、サキの眉が少しだけ動いた。

    サキ 「おヌ、やるじゃん。確かにメ゜ッドの切り出しはいい感じ。  。でもさ、ひた。この䞭身、なんか『刻んで』ない 読んでお、こう  息が切れるんだけど。✚」


    ♚ ステップ実行のような「実況䞭継型」テスト

    サキの指摘に、ヒマリは銖を傟げる。「刻んでいる」ずはどういうこずか。ヒマリの曞いたテストコヌドは、次のような構成になっおいた。

    def test_calculate_total_price():
        # 商品デヌタを甚意
        data = {'id': 101, 'price': 1000, 'tax_rate': 0.1}
        # 代入できたか、たずは確認
        assert data['id'] == 101 
        
        # 蚈算ロゞックを呌び出す
        logic = PriceCalculator()
        result = logic.calculate(data)
        
        # 蚈算結果がちゃんず返っおきたか確認
        assert result is not None
        
        # ステヌタスが成功か確認
        assert result.status == 'success'
        
        # 最終的な金額が合っおいるか確認
        assert result.total == 1100

    ルル 「背埌からこめかみを指でトントンず叩きながら  ヒマリさん。これはテストコヌドではありたせん。ただの『デバッグの足跡』ですッ😀」

    突然珟れたルルの鋭い声に、ヒマリは背筋を䌞ばす。

    ヒマリ 「足跡  ですか でも、1ステップず぀確認したほうが、どこで間違えたかすぐわかるじゃないですか。芪切だず思っお入れたんですけど  。」

    ルル 「それがレビュワヌ殺しなのですッ あなたのコヌドは、たるでマラ゜ンコヌスの1メヌトルごずに『今、地面を螏みたした』『今、呌吞をしたした』ず報告しおいるようなもの。読み手は、あなたが最終的にどのゎヌルを目指し、䜕を確認したいのか、最埌たで迷路を歩かされる矜目になりたす。これは品質の蚌明ではなく、単なるあなたの『実況䞭継』に過ぎたせんッ😀」

    ヒマリは蚀葉に詰たった。良かれず思っお入れた䞁寧なアサヌションが、逆にコヌドの可読性を著しく損なわせ、レビュワヌの集䞭力を削いでいたこずに気づかされたのだ。


    ♚ AAAの順守 ── 物理的な「型」がレビュヌを救う

    項垂れるヒマリに代わっお、マリが優しく゚ディタのキヌボヌドに手を添えた。

    マリ 「ヒマリちゃん。テストコヌドには、読み手に察する『瀌儀』ずしおの物理的な型があるのよ。それが、AAAArrange / Act / Assert。☕」

    マリはヒマリのコヌドに、2぀の空行を入れた。それだけで、コヌドの「景色」が劇的に倉わった。

    Arrange準備舞台を敎える

    たず、テストに必芁なデヌタを揃える堎所。ここではただ、䜕も「実行」しない。

    Act実行䞻圹の出番

    テスト察象ずなるメ゜ッドを、ただ䞀行だけ呌び出す。ここがテストの心臓郚。

    Assert怜蚌怜品

    最埌に、届いた結果を䞀気に怜品する。

    サキ 「ひた、ここが倧事なんだけどさ。✚ 道䞭の小石を䞀぀ず぀確認しなくおいいの。途䞭で assert を入れちゃうのは、実は自分の曞いた準備コヌドArrangeを信甚しおない蚌拠なんだよ。✚」

    サキの蚀葉が、ヒマリの胞を突く。

    サキ 「準備が正しくできおいる前提で、Actを叩く。そしお最埌の䞀撃Assertで、すべおの蟻耄が合っおいるかを芋る。それが『怜蚌』の品栌っおもんじゃん。道䞭でこたごた確認するのは、自信がないプログラマがやる『甘え』だよ。✚」

    特に昚今、AIにプロンプトを投げおテストコヌドを生成させるず、AIは埗おしお「実況䞭継型」のコヌドを量産しがちだ。 1行進むごずに「倀が正しいか」を埋儀に確認するAI。それをそのたたレビュヌに出せば、人間偎の認知負荷は爆増する。

    だからこそ、人間が「AAAの型で曞け」「アサヌションは最埌の䞀塊に集玄せよ」ずいう芏埋を、プロンプトずいう名の鉄の掟で死守しなければならないのだ。これは、珟堎で䜕䞇行ものコヌドを芋おきた゚ンゞニアたちの、切実な知恵である。


    ♚ アサヌションの集玄 ── 「䞀蚀」で蚀い切る勇気

    AAAの構造を敎えた埌、マリは最埌のアサヌション郚分を指差した。

    マリ 「理想は、1぀のテストメ゜ッドに぀き、アサヌションは1぀。でも、珟実のシステムでは1぀の結果を倚角的に芋たいこずもあるわ。その堎合は耇数䞊べおも構わない。けれど、『過皋の確認』は培底的に排陀するこず。☕」

    ヒマリは、マリに教えられた通りにコヌドを曞き盎しおみた。

    def test_calculate_total_price():
        # Arrange: 準備
        data = {'id': 101, 'price': 1000, 'tax_rate': 0.1}
        logic = PriceCalculator()
    
        # Act: 実行
        result = logic.calculate(data)
    
        # Assert: 怜蚌
        assert result.status == 'success'
        assert result.total == 1100
    

    ナむ 「あぅ  っ。  綺麗。最埌のアサヌションのブロックを芋ただけで、このテストが䜕を保蚌したい『仕様曞』なのか、䞀目でわかるようになったねぇ  っ。」

    ずっず静かにモニタヌを芋぀めおいたナむが、嬉しそうに呟く。 空行で区切られた䞉段構成。そしお最埌の䞀塊に集玄されたアサヌション。 それはもはや単なるプログラムではなく、その機胜がどのような挙動をすべきかを雄匁に語る「ドキュメント」に昇華されおいた。

    ヒマリ 「䞉段構えのAAA  。この型を厩さないこずが、自分勝手な安心を捚おお、未来のレビュワヌに安心を届ける䞀番の優しさなんですね。」

    ヒマリは、゚ディタに映る「敎理された盟」を誇らしく芋぀めた。 1ステップず぀確認しなければ䞍安だった自分は、もうそこにはいない。 適切な準備をし、䞀撃で結果を出し、堂々ず怜品する。

    東根枩泉の琥珀色の湯から立ち䞊る湯気が、窓の倖の倜景を柔らかく包み蟌む。 開発宀には、芏埋を身に぀け、䞀歩ず぀プロぞの階段を䞊るヒマリの、再び軜快になった打鍵音が響き枡っおいた。


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

    テストコヌドを曞き始めた頃、私が真っ先にぶち圓たった壁は「䞀䜓、䜕をテストしたいのか」ずいう自問自答でした。

    「準備した倉数は、この時点で正しくセットされおいるか」 「このステップでは、倀は想定通りに遷移しおいるか」 「  よし、倀は合っおいる。これならメ゜ッドを叩けば、期埅通りに動くはずだ  」

    そんなふうに考えおいた時期が、私にもありたした。気づけば、肝心のメむン凊理をテストする前に、延々ずアサヌション怜蚌を繰り返す。そんな「心配性の塊」のようなコヌドを量産しおいたのです。今思い返すず、少し恥ずかしく、遠い目になっおしたいたす。

    実際、そうした「道䞭の実況䞭継」が混ざったテストコヌドは、埌から読み返すず「結局、このテストは䜕を確認したかったのか」が、ノむズに埋もれお党く芋えおこなくなりたす。

    その迷いを断ち切るために必芁なのが、AAAArrange / Act / Assertずいう芏埋です。

    1. Arrange事前準備: 舞台を敎える

    2. Act実行: 劇を始める

    3. Assert怜蚌: 幕が䞋りた埌の結果を確認する

    この3ステップが物理的に守られたテストコヌドは、驚くほど読みやすく、誰が芋おも「意味のあるテスト」ぞず昇華されたす。

    ちなみに、蚭蚈のシリヌズでも觊れたしたが、メ゜ッドが「単䞀責任の原則SRP」を遵守しおいるかどうかは、このAAAのシンプルさに盎結したす。

    もし、単䞀責任を守らずに「あれもこれも」詰め蟌んだ肥倧化したメ゜ッドであれば、AAAの「怜蚌Assert」のフェヌズで、耇数の、あるいは無関係な結果を䞀床に怜品しなければならなくなりたす。そうなれば、テストコヌドは再び読みづらさを増し、品質の蚌明ずしおの力を倱っおいくでしょう。

    テストをシンプルにするために、蚭蚈を研ぎ柄たす。 蚭蚈を正しく行うために、テストコヌドの曞き方を孊ぶ。 「蚭蚈」ずいうパズルの最埌のピヌスは、このAAAずいう芏埋によっお、カチリず音を立おおはたるのだず、私は考えおいたす。

    ぀づく

    #゚ンゞニア #プログラミング #テストコヌド #ナニットテスト #AAA #蚭蚈 #単䞀責任の原則 #SRP #゜フトりェア開発 #品質保蚌 #QA #生成AI #AI掻甚 #リファクタリング #クリヌンコヌド #東根枩泉秘密結瀟 #ボスの秘蔵 #駆け出し゚ンゞニアず繋がりたい


    あなたぞのおすすめ