💡 Key Takeaways
- The 3 AM Wake-Up Call That Changed How I Think About Testing
- Why Testing Feels Like Pulling Teeth (And Why That's Actually Your Fault)
- The 15-Minute Rule: Making Testing Feel Like Progress, Not Punishment
- The Goldilocks Zone: Testing Just Enough (And Not a Line More)
この専門家のブログ記事をあなたのために書きます。特定のペルソナの視点から魅力的な作品を作成させてください。
テストに対する私の考え方を変えた午前3時の目覚ましコール
火曜日の午前3時17分、携帯電話のバイブ音で目を覚まされました。私たちの決済処理システムがダウンし、40,000人の顧客が購入を完了できなくなっていました。バックグラウンドでコーヒーが淹れられている中、急いでノートパソコンに向かうと、原因がわかりました:前日の午後6時にマージした一見無害な二行の変更です。テストはそれを検出できませんでした。CIパイプラインもそれを警告しませんでした。それはまるで私たちの収益源を狙った魚雷のように、無事に本番環境に進むだけでした。
💡 重要なポイント
- テストに対する私の考え方を変えた午前3時の目覚ましコール
- テストが歯を抜くように感じる理由(そしてそれが実際にはあなたのせいである理由)
- 15分ルール:テストを進歩と感じさせ、罰ではなくする方法
- ゴルディロックスゾーン:ちょうど良いテスト(余計な行はなし)
この事件は、私たちに$180,000の売上損失とさらに$50,000の緊急エンジニアリング時間を引き起こしました。しかしもっと重要なのは、これが私に数年前に学ぶべきだったことを教えてくれたことです:テストを書くことは本質的に退屈だからではなく、私たちがそれを間違って行っているから退屈に感じるのです。
私はマーカス・チェンで、11年間のシニアソフトウェアエンジニアの経験があり、直近の6年は年に23億ドルの取引を処理するフィンテック企業の技術リーダーを務めてきました。私はこれまでに約47,000行のテストコードを書いてきました—はい、実際にgitの統計を使ってカウントしました—そして、テストを嫌うチームとそれを受け入れるチームとの違いはアプローチにあり、態度にはないことを学びました。
従来の知恵では、テストはフロスと同じだと言われています:誰もがそれをやるべきだと知っているが、満足感が遅れる作業だと感じています。私はそれが誤った類似例だと言いに来ました。テストが正しく行われれば、テストは未来の自分との対話のようなものです—午前3時のパニック発作や、六桁のミスを防いでくれる対話です。
テストが歯を抜くように感じる理由(そしてそれが実際にはあなたのせいである理由)
なぜほとんどの開発者がテストを苦痛だと感じているのかについてです。私が87人の開発者からなる3つのエンジニアリングチームに対して実施した調査で、73%が「繰り返しのボイラープレート」を主な不満として挙げ、61%が「何をテストするべきか不明確」と答えました。実際にテストを書くことを楽しんでいるのは12%だけで、彼らには共通点がありました:テストが文書化のように感じさせるのではなく、問題解決のように感じるシステムを開発していたのです。
「テストは本質的に退屈だからではなく、私たちがそれを間違って行っているから退屈に感じる。テストを嫌うチームと受け入れるチームの違いはアプローチにある。」
根本的な問題は、テストを後回しにし、コードを出荷する特権のために支払う税金のように扱うことです。私たちは実装を書いて、動作するのを確認し、それを実行するのを見ることでドーパミンの高揚感を感じ、その後テストを書くことを嘆きます。その時点で、私たちの脳は次の機能、次の問題、次のドーパミンの高揚感のことを考え始めています。
この逆のアプローチは数々の問題を引き起こします。まず、すでに動作しているコードに対してテストを書いているので、冗長に感じます。あなたの脳はそのコードが動作していることを知っています—あなたはそれを見たばかりです—だからテストを書くのは無駄な作業に感じます。次に、すでにすべての設計決定を下しているため、あなたのテストは潜在的にテストできないアーキテクチャに制約されます。第三に、新しい問題を解決する際の創造的エネルギーを失っています。
私はこのようにテストを書くことに3年を費やし、私のテストカバレッジは約40%でした。怠惰だったからではなく、プロセスが本当に苦痛だったからです。すべてのテストは、すでに読んだ小説をほとんど話せない言語に翻訳するように感じました。ブレークスルーは、特に複雑な認証フローのテストを書くことから始めたときに訪れ、驚くべきことを発見しました:実装を書くよりも、実際に楽しいのです。
その理由は?テストを最初に書くと、あなたはまだ問題解決モードにあります。APIを設計し、エッジケースを考え、アーキテクチャの決定を下しています。あなたの脳は、機械的な文書化ではなく、創造的な作業に関与しているのです。テストは仕様書、設計文書、安全網のすべてを兼ね備えたものになります。突然、テストは退屈ではなく、興味深い部分になります。
15分ルール:テストを進歩と感じさせ、罰ではなくする方法
私のテストに対する関係を変えた技術があります:15分以上テストを書くことはありません。その間に何かが通過するのを見なければなりません。これは恣意的に聞こえるかもしれませんが、心理学が背景にあります。私たちの脳は即時のフィードバックループに配線されています。45分間、全体的なテストスイートを書いてから実行するのではなく、あなたは神経化学に逆らっています。
| テストアプローチ | 時間投資 | 開発者体験 | 本番インシデント |
|---|---|---|---|
| テストなし | 0時間前倒し | 最初は早いが、後でストレスがかかる | 高頻度、高コスト |
| 手動テストのみ | 機能ごとに2-3時間 | 繰り返しが多く、退屈 | 中程度の頻度 |
| ボイラープレートの多いテスト | 機能ごとに4-5時間 | フラストレーションが多く、遅い | 低頻度、しかしテストが脆弱 |
| 戦略的テスト | 機能ごとに2-3時間 | 魅力的で自信がつく | 非常に低頻度 |
| テスト駆動開発 | 機能ごとに3-4時間 | 満足のいく設計プロセス | 最小限のインシデント |
その代わり、私はテストをマイクロサイクルに分けます。1つのテストを書く。通過させる。別のテストを書く。通過させる。各サイクルは5-15分かかり、それぞれが小さな達成感をもたらします。通常の6時間のコーディングセッションでは、それが24-72の小さな勝利につながります。
具体例を挙げましょう。先月、需要、時間帯、ユーザーの履歴に基づいて動的価格設定を計算する機能を構築していました。価格エンジン全体を書いてからテストするのではなく、最初に単一のテストから始めました:「需要が低く、オフピークの時間帯では、価格は基本料金であるべきだ。」そのテストを書くのに8分かかり、通過させました。次に:「需要が高い場合、価格は20%上昇すべきだ。」さらに12分。「需要が高く、かつピークの時間帯では、価格は35%上昇すべきだ。」さらに10分。
90分後には、11のテストと動作する価格エンジンができていました。もっと重要なのは、退屈を感じなかったことです。各テストは解決すべき小さなパズルであり、実装はテストから自然に生まれました。私の古いアプローチと比較すれば、価格エンジンを書いて(60分)、ブラウザで手動テストを行い(20分)、その後渋々テストを書く(45分の純粋な退屈)というもので、総時間は同じでも、完全に異なる体験でした。
重要なのはフィードバックループを密接に保つことです。30分以上かかるテストを書いている場合、それは間違っています。外部依存性をモックします。インメモリデータベースを使用します。テストの実行を並列化します。そのサイクルを15分以下に保つために何でもします。私は、チームがテストスイートの実行時間を40分から6分に短縮したのを見ており、開発者の幸福感に対する影響は測定可能でした—社内調査では、「テストを書くのが好き」回答が34%増加しました。
ゴルディロックスゾーン:ちょうど良いテスト(余計な行はなし)
私がキャリアの初期に犯した最大の間違いの一つは、100%のテストカバレッジを聖杯のように追い求めたことです。私は、ゲッターやセッター、取るに足らないユーティリティ関数、壊れる可能性がないほど単純なコードのために、何時間もテストを書いていました。私のテストスイートは15,000行にまで膨れ上がり、実際のコードベースはわずか8,000行でした。その比率は不合理であり、さらに悪いことに、リファクタリングを悪夢のようにしました。
「テストを書くことは未来の自分との対話をすることです—3 AMのパニック発作や六桁のミスから救ってくれる対話です。」
私が学んだことは、テストカバレッジにはゴルディロックスゾーンがあり、100%ではないということです。ほとんどのアプリケーションでは、70-85%のどこかにあります。70%未満では、重要な経路があまりにも多く未テストになります。85%を超えると、コードベースを脆弱で変更しにくいものにする実装の詳細をテストしています。
私は今、「リスク重視テスト」というアプローチに従っています。すべてのコードが等しく作られているわけではなく…