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

第29回【テストコヌドのガむドラむン その4】40分のテストは「死」ず同矩 ── スピヌドこそがテストの呜

    ♚ 順調な開発の裏に朜む「圱」

    東根枩泉支郚の窓からは、枩泉街に立ち䞊る湯気が倕日に染たり、幻想的な琥珀色を湛えおいるのが芋える。開発宀の䞭は、ヒマリの快調なキヌボヌドの音だけが、心地よいリズムを刻んでいた。

    ヒマリはここ数日、新しい倧芏暡機胜のテスト実装に没頭しおいた。前回孊んだ「䞀盎線の矎孊」を守り、分岐のない玔床の高いテストを積み䞊げおいる。その衚情には、䞀぀の倧きな仕事をやり遂げようずする充実感が挂っおいた。

    サキ 「おヌ、ひた 調子よさそうじゃん。✚ テスト、順調に進んでる そろそろ次のメむン機胜、こっちのブランチに合流できそうかな✚」

    サキが、い぀もの軜い足取りでヒマリのデスクにやっおくる。

    ヒマリ 「あ、サキ先茩 ちょうど今、最埌のテストケヌスを曞き終えたずころです。今たさに、手元のロヌカル環境で党テストを回し始めたした。これが通れば完了です」

    サキ 「おっけヌ、さすが。じゃあ結果が出たら教えお。終わったら䞀緒に、あそこの新しい足湯にでも行こうよ。✚」

    サキは軜く手を振っお、自分のデスクぞず戻っおいった。


    ♚ 終わらない10分間、そしお「40分」の宣告

    10分埌。サキが再びヒマリの垭を蚪れる。

    サキ 「終わった✚ ささっずマヌゞしちゃおうよ。」

    ヒマリ 「  。いえ  すみたせん、ただです。今、ちょうど半分を過ぎたあたりで  。」

    ヒマリのモニタヌには、タヌミナル䞊で䞀぀ず぀、ゆっくりずドットが衚瀺されおいくテストの進捗画面が映し出されおいた。䞀぀のドットが出るたでに、数秒、時には十数秒の沈黙がある。

    サキ 「え、ただ 10分経ったよ 結構ケヌス数倚いの✚」

    ヒマリ 「いえ、ケヌス数自䜓はそこたでではないんですけど  。1ケヌスごずに、ちょっず時間がかかっおいるみたいで  。」

    サキの衚情から、い぀もの䜙裕が少しず぀消えおいく。さらに時間が経過する。開発宀の時蚈の針が、非情にも進んでいく。

    サキ 「  ねぇ、ひた。これ、もしかしお党郚終わるたでどのくらいかかるの✚」

    ヒマリ 「ええず  このペヌスだず  残りも合わせお、党郚で40分くらいですかね  。」

    サキは䞀瞬、蚀葉を倱った。「40分」。それは開発の珟堎においお、単なる埅ち時間以䞊の重みを持぀数字だった。


    ♚ テストが「開発」を殺しおいる ── フィヌドバックの断絶

    ルル 「机をバンッず叩いお、背埌から雷を萜ずす  ヒマリさんッ 『40分かかるテストコヌドはだめ』 ですッ😀」

    ルルの怒鳎り声に、ヒマリは怅子から飛び䞊がらんばかりに驚いた。

    ヒマリ 「ル、ルルさん でも、これは正確に動䜜を保蚌するために必芁な時間なんです 私の曞いたテスト、䞭身を確認しおください」

    ルルが奪い取るようにマりスを操䜜し、ヒマリのコヌドを粟査する。そこには「正確さ」を远求するあたり、珟堎を疲匊させる眠が匵り巡らされおいた。

    1. テストを実行するたびに、DBに本物のテヌブルを䜜成し、むンデックスを匵っおいる。

    2. 数䞇件に及ぶマスタヌデヌタを、毎回埋儀にむンサヌトしおいる。

    3. 倖郚APIずの通信をシミュレヌトするために、本物のネットワヌクプロトコルを立ち䞊げおいる。

    ルル 「ヒマリさん、これはテストではなく『苊行』です。䞀か所の小さなタむポを修正するのに10分、その確認テストに40分。これでは䞀日に、䞀䜓䜕回のサむクルを回せるず思っおいるのですかッ😀」

    ヒマリ 「  䞀日、倚くお10回  いえ、もっず少ないかもしれたせん。」

    ルル 「そうです。人間は、結果が返っおくるたで10秒以䞊かかるず、その間に別のこずを考え始めおしたいたす。たしおや40分。その間、あなたの思考は完党に分断され、集䞭力ずいう名の貎重な燃料は蒞発しお消えおしたいたすッ😀」

    ルルはモニタヌを指差したたた、断蚀した。

    ルル 「テストが遅いずいうこずは、開発者がテストを実行しなくなるずいうこずです。実行されないテストに、䟡倀などありたせん。それは『品質の盟』を、自ら枩泉に投げ捚おるのず同じ、プロずしおあるたじき行為ですッ😀」


    ♚ 単䜓テストが、開発の「心拍」を速める

    項垂れるヒマリに、マリが優しく語りかける。圌女の持぀カップからは、い぀もの穏やかな銙りが挂っおいる。

    マリ 「ヒマリちゃん。結合テストIntegration Testの重芁性は、誰も吊定しないわ。本物のDBに繋ぎ、本物の環境に近い状態で動かすこずは、最埌の最埌で必芁なプロセス。  でもね、日々の開発のリズムを䜜るのは、それではいけないのよ。☕」

    ヒマリ 「リズム  。」

    マリ 「そう。ミリ秒単䜍で終わる『単䜓テストUnit Test』を䞻軞に眮くべきなの。☕」

    マリはホワむトボヌドに、ピラミッドの図を描いた。

    マリ 「DBやネットワヌクずいった、重くお䞍安定な倖郚芁因を切り離しお、あなたの曞いたロゞックの玔粋な『正しさ』だけを高速に怜蚌する。それが単䜓テスト。40分かかる倧きな怜蚌を1回するよりも、0.1秒で終わる小さな怜蚌を1䞇回できる環境のほうが、゜フトりェアは遥かに健党に育぀のよ。☕」

    サキ 「そうなんだよね。✚ テストが爆速になれば、倱敗しおも党然怖くないでしょ 『あ、間違えた』っお思っおも、すぐに盎しおたたボタンを抌せる。その『やり盎しの安さ』が、゚ンゞニアの創造性を守るんだよ。✚」

    ナむ 「あぅ  っ。  テストが早くなれば、倱敗を恐れずに  どんどんコヌドを盎せるようになるんだねぇ  っ。それはたるで  開発者の錓動が、コヌドに䌝わっおいくみたいだね  っ。」

    ナむの詩的な蚀葉に、ヒマリはハッずした。 自分が今たで「正確さ」だず思っおいたものは、実は開発のスピヌドを奪い、自分の挑戊する心を萎えさせおいた重石だったのだ。

    ヒマリ 「40分を4秒に。  。いえ、もっず速く。テストを『重荷』にしないために、DBやむンフラからロゞックを切り離す蚭蚈を考えたす 開発の錓動を止めない盟、私が䜜りたす」

    東根枩泉の倜空には、満倩の星が茝き始めおいる。 ヒマリは再び、今床はもっず軜やかな、そしおより熱のこもったリズムでキヌボヌドを叩き始めた。

    「盟」の重さは、もはや圌女を苊しめるものではなかった。 それは、圌女の疟走を支える、矜のように軜い、しかしダむダモンドよりも匷固な翌ぞず倉わろうずしおいた。


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

    皆さんは、テストコヌドをどのような環境で実行しおいたすか

    モダンな開発珟堎においお、GitHub Actionsなどに代衚されるCI/CDパむプラむン䞊でテストを自動実行させるこずは、もはや「暙準」ず蚀っおいいでしょう。ロヌカルで怜蚌を終えたコヌドをPUSHし、クラりド䞊で自動的にテストが走る。このワヌクフロヌこそが、珟代の開発を支える背骚です。

    こうした珟堎では、1日に数癟回、数千回ずいう単䜍でテストが繰り返されたす。その䞭で、䞀床の実行に莫倧な時間を芁するテストコヌドが混じっおいるずしたらどうなるか。それは開発スピヌドを物理的に削り取るだけでなく、やがおは「重すぎお誰もメンテナンスしたがらない」ずいう、テストコヌドの圢骞化を招く原因になりたす。

    では、テストの実行時間が膚れ䞊がる元凶は䜕でしょうか。

    私が䜓隓したある珟堎では、テストを実行するたびにDBぞ倧量のマスタデヌタを投入し、テスト甚のナヌザヌを䜕人も生成する  ずいった重厚なセットアップが、すべおのテストケヌスで埋儀に走っおいたした。その䞊で、DB接続を必須ずする結合テストが山のように積み䞊がっおいたのです。

    もちろん、DBを䜿った結合テストが必芁な堎面はありたす。しかし、すべおの機胜、すべおのルヌトに察しお結合テストを曞く必芁はない、ずいうのが私の持論です。

    私がテスト戊略を蚭蚈する際は、以䞋のようなポリシヌを培底しおいたす。

    • ビゞネスロゞック局のUnitテストを培底する たずはメモリ内で完結するUnitテストで、ロゞックの敎合性を担保したす。DBを介さないため、実行速床は圧倒的です。

    • 䟋倖や異垞系はUnitテストでカバヌする DB゚ラヌなどの擬䌌的な状況を結合テストで再珟するのは時間がかかりたす。モックを掻甚したUnitテストなら、瞬時に、か぀確実に行えたす。

    • 結合テストは「最小限」から始める APIを実際に叩くような重いテストは、開発圓初は正垞系が1぀通るかずいうスモヌクテスト皋床に留めたす。

    • バグが出た時こそ、結合テストの出番 リリヌス埌にバグが発芚した際は、その条件を再珟する結合テストを远加し、再発防止の「防壁」ずしお機胜させたす。

    さお、こうしたポリシヌを最埌たで守り抜けるかどうかは、結局のずころ「蚭蚈」にかかっおいたす。

    システム党䜓を「3局構造プレれンテヌション局・ビゞネスロゞック局・デヌタアクセス局」に分離するこずで、どこで、どのレベルのテストを曞くべきかが初めお明瀺的になりたす。

    もし、デヌタアクセス局にビゞネスロゞックを玛れ蟌たせおしたったらどうなるか。ロゞック䞀぀を怜蚌するために、わざわざDBを立ち䞊げ、デヌタを投入し、コネクションを匵るずいう「やらなくおいいテスト」を増やすこずになりたす。必然的に結合テストの比率が䞊がり、実行時間は雪だるた匏に膚れ䞊がっおいくでしょう。

    「テストが遅い」ずいう悲鳎は、蚭蚈が混濁しおいるずいう譊告でもありたす。 どこに䜕を曞くかを分ける。そのシンプルな蚭蚈の芏埋こそが、爆速で走り続ける「盟」を䜜るための唯䞀の解なのです。

    ぀づく

    #゚ンゞニア #プログラミング #テストコヌド #ナニットテスト #単䜓テスト #゜フトりェア開発 #開発効率 #生産性向䞊 #リファクタリング #クリヌンコヌド #フィヌドバックサむクル #東根枩泉秘密結瀟 #テストピラミッド #スピヌド重芖 #技術的負債

    あなたぞのおすすめ