はじめに
ソフトウェア開発におけるテストは、伝統的に本番デプロイメントとは別の開発環境やステージング環境に限定されていました。この分離の理由は、本番トラフィックと並行してテストを実行する際のパフォーマンスへの影響を最小限に抑えることと、破壊的な変更が本番環境に影響を与える可能性を減らすことの両方にあります。
これらの懸念にもかかわらず、本番環境内での部分的なテストを完了することへの動きが高まっています。この戦略は、本番環境でのテスト、略してTIPとして知られており、新しいコードが互換性を持つ必要がある実際のシステムやデータとどのように相互作用するかについて、チームがより深く理解するのに役立ちます。
このガイドでは、本番環境でソフトウェアの変更をテストするというアイデアを探ります。本番環境でのテストに対する歴史的な抵抗の理由、採用をより魅力的にした変更点、そしてそれが開発速度とエラー削減にもたらすメリットについて説明します。
Prisma Data Platform は、本番環境でのデータベースへのアクセスを簡素化するのに役立ちます。Prisma Client を使用してデータベース接続を管理している場合、Prisma Data Platform は本番ワークロードをより簡単に管理するのに役立つ可能性があります。
本番環境でのテストとは?
本番環境でのテストとは、開発者がソフトウェアテストの一部またはすべてを、コードが本番環境にデプロイされるまで遅らせることを奨励する哲学です。しかし、なぜチームは本番環境でのテストに移行したいと思うのでしょうか?
一見すると、この考え方は直感に反し、危険にさえ思えるかもしれません。予想通り、リスクがないわけではありません。しかし、ソフトウェアをより徹底的にテストするだけでなく、より回復力のある本番環境を構築できるデプロイメントおよびテスト戦略を導入することで、多くの危険を排除できます。
本番環境でのテストは、本番環境とテスト環境間の環境のずれによって発生する問題のカテゴリを排除するため、価値があります。専用の環境でテストし、その動作が一貫していることを期待して合格したコードを本番環境にデプロイするのではなく、コードが実行される場所でテストするのです。
本番環境でのテスト哲学を採用する人々の焦点は、次のように要約できます。
- コードをできるだけ早く本番環境にデプロイする:これにより、チームはコードが実行される環境内で早期にテストできます。
- コードのデプロイとコードのリリースを分離する:デプロイプロセスを機能変更のリリース行為から分離することで、新しい機能のテストとアクティブ化においてより柔軟性が得られます。
- 実際のデータでテストする:データベースのモックやスタブ、ダミーレコードで満たされたデータベースでは、コードが対応する必要のあるデータを正確に複製することはできません。
- 変更の影響範囲を最小限に抑える:テストおよびリリース中に範囲を制限および調整できれば、変更をより安全かつ効果的にテストできます。
本番環境でのテストに関連するリスクとは?
多くの人々は、本番環境でのテストのメリットがコストを上回るとは懐疑的です。続ける前に、この戦略のリスクと、それらを軽減する方法について話しましょう。
欠陥のリスク
本番環境でコードをテストする際の主な懸念は、ユーザーやサービスに影響を与える可能性のあるソフトウェアの欠陥を導入する可能性です。従来のソフトウェアテストパイプラインの背景にある考え方は、コードを本番環境の責任に昇格させる前に、徹底的に検証し、既知の弱点を確認することです。
この考え方には利点がありますが、実際には状況はそれほど明確ではありません。組織がステージング環境で実行するテストは、多くの場合、コードが本番環境で扱う内容を適切に近似していません。インフラストラクチャやワークロードを含む環境の複製は簡単な作業ではなく、実際の生産システムと同期がずれることがよくあります。
その結果、ステージング環境でテストした内容が、リリース後のコードのパフォーマンスに実際に適用できるとは限らないということです。さらに、その試みが成功するかどうかに関わらず、かなりの労力、時間、およびインフラストラクチャが必要です。
稼働中のシステムへの影響
密接に関連する懸念は、新しい変更とテストプロセス自体が本番環境に与える可能性のある影響です。システムの安定性は、サービスのユーザビリティや可用性に影響を与え、ユーザーの信頼を損なう可能性があるため、ほとんどの組織にとって優先事項です。
本番環境にデプロイされたコードが運用に影響を与える可能性があるのは事実ですが、潜在的な影響を最小限に抑える方法はあります。新しいコードが受けるトラフィックの量を制限する制御を実装すること、アクティブスタンバイインフラストラクチャを設定すること、監視ベースのスケーリングを実装することは、このプロセスをより安全にする方法の一部です。これらの種類の緩和策の素晴らしい点は、これらの投資が、あらゆる種類のシステム障害に対する本番システムの回復力を直接向上させることです。
本番環境でテストする方法
本番環境でのテストは実際にどのように機能するのでしょうか?このセクションでは、組織が本番環境でコードを確実にテストするために実装する、最も一般的なテクニックと戦略について説明します。これらのアイデアをすべて採用する必要はありませんが、多くのアプローチは互いに補完し合い、より包括的なシステムの一部として統合できます。
フィーチャーフラグシステムを実装する
フィーチャーフラグは、機能を外部から簡単にアクティブ化または非アクティブ化できるようにするプログラミングおよびリリース手法です。基本的な考え方は、新しい機能を条件付きロジックで囲み、実行前に構成変数の値をチェックすることです。「フラグ」または「トグル」変数は、組織が必要に応じて値を簡単に変更できるRedisなどの外部ストアで設定されることがよくあります。
フィーチャーフラグは、本番システムの現在のロジックに影響を与えることなく、コードを安全にデプロイできるため、本番テストにおいて貴重なツールです。新しいコードパスは、最初に非アクティブ化され、新しいコードをテストする準備ができたときに後でアクティブ化できます。フィーチャーフラグの概念の多くの実装では、「有効」または「無効」よりもきめ細かな制御が含まれており、トラフィックの割合に対して有効にするオプション、異なるロジックをA/Bテストするオプション、または特定のケースでのみパスを選択するオプションがあります。
フィーチャーフラグを使用することで、コードを非アクティブな状態で本番環境にデプロイできます。本番トラフィックが古いロジックを使用し続ける間、新しいコードパスをテストスイートでテストできます。その後、新しいコードパスが受け取る本番トラフィックの量を徐々に増やしながら、カナリアリリースとしてコードをゆっくりとリリースし、その影響を監視できます。
CI/CD を使用して本番インフラストラクチャにデプロイし、テストする
本番環境でのテストに関する誤解の1つは、テストが本番環境で完了しなければならないという思い込みです。支持者は、コードが最終的に実行される環境でのテストの価値を認識していますが、すべてのテストがこの忠実度を必要とするわけではなく、多くの高速で集中的なテストは自動化され、コードのデプロイまでの準備の一部として実行できます。
これを実装する最も単純で効果的な方法は、適切に調整されたCI/CDパイプラインを使用することです。CI/CDは、継続的インテグレーション(Continuous Integration)と継続的デリバリー(Continuous Delivery)またはデプロイメント(Deployment)の略で、リポジトリに新しいコードが追加されると自動的にテストするシステムです。テストスイートが正常にパスすると、継続的デリバリーのパイプラインは開発者がボタンをクリックするだけで変更をデプロイできるようになり、継続的デプロイメントはテストが成功したすべてのコードを自動的にデプロイします。
CI/CD には、本番環境でのテストの文脈以外にも多くの利点があります。私たちが説明しているシステムでは、パイプラインはデプロイプロセスの一部を自動化し、本番環境でデプロイしてテストすることを目標とします。ユニットテストのような単純なテストは単独で行うことができますが、統合テストのようなより複雑な段階は、理想的にはコードを本番インフラストラクチャにデプロイしてそこでテストすることで行うべきです。これにより、コードは、最終的に実行されるインフラストラクチャ上で、同じ実行コンテキストで相互作用する実際のサービスに対してテストできます。
CI/CD パイプラインは、新しい変更への信頼を構築し、コードを本番環境にすばやくデプロイすることへの不安を軽減するのに役立ちます。フィーチャーフラグと組み合わせることで、開発チームはコードのいくつかの側面が検証済みであると信頼でき、より重いテストの実施方法を制御できます。
ダークローンチを許可するようにサービスを設定する
ダークローンチとは、ユーザーに影響を与えることなく、実際のトラフィックを使用してソフトウェアの変更をデプロイし、テストする方法です。その目的は、本番トラフィックをミラーリングし、新しくデプロイされたコードに重複するリクエストを送信することで、コードが正しく動作し、実際の運用負荷を処理できることを確認することです。
ダークローンチは、テストの正当性に影響を与えるような速度低下を招くことなく、アプリケーションの複数のインスタンスで既存のトラフィックをリプレイする必要があるため、非常に複雑になる可能性があります。リアルタイムでリクエストを複製する代替案は、イベントログやその他のソースから以前のリクエストを再生することです。この戦略では、最初のリクエストからすべての関連コンテキストをキャプチャする必要があります。
ダークローンチの利点は、コードがすでにユーザーにリリースされているかのように機能する様子を確認できることです。新しいコードを通じてトラフィックを実行した結果はユーザーには表示されませんが、コードがどのように動作し、どのような種類の条件を考慮する必要があるかについての洞察を提供できます。ダークローンチされたバージョンのアプリケーションをテストしたら、すでにそれらのプレッシャーに直面していることを考えると、本番環境でのパフォーマンスにかなり自信を持つことができます。
堅牢なモニタリングとメトリクス収集を実装する
デプロイおよびリリース中に実行されるコアテストに加えて、本番稼働後もその動作を継続的に監視できるシステムを導入することが重要です。新しいコードが動作の変更を引き起こした場合に異常をより迅速に発見できるように、サービスの健全性に関する長期的な洞察を得るために、さまざまな関連技術を実装できます。
モニタリングとメトリクス追跡は、サービスが時間とともに、また異なる条件下でどのように機能するかを理解するために使用できる基本的なツールです。新しい変更には、短期間では見つけにくい副作用があるかもしれませんが、時間とともに明らかになることがあります。モニタリングとメトリクスは、これらの行動の変化を特定のリリースと関連付けるのに役立ちます。
本番環境でのテストはデータベースにどのような影響を与えるか?
本番環境でのテストの最も複雑な側面の1つは、データベースと相互作用するテストを効果的に実行する方法を見つけることです。新しいコードを別のデータソースから読み書きさせることは可能ですが、これでは再び不適切に複製された環境に対してテストを行う可能性が生じます。
より良い、しかし実現がより難しい選択肢は、本番データベースでテストすることです。これは、データベースのスキーマやツールが最初からこの可能性のために設定されていない場合、実装が困難な場合がありますが、リリース後にコードがどのように動作するかを理解する最良の機会を提供します。
新しいコードが本番データベースからデータを読み取ることを許可することは、かなり簡単です。テストが重い読み取り競合を招かない限り、データベースの本番責任に大きな影響を与えるべきではなく、本番データへの危険はありません。
しかし、コードが書き込み操作をどのように実行するかをテストするのは、少し厄介です。最も簡単なテスト方法は、本番データベース内に専用のテストユーザーを作成し、新しいコードが実際のユーザーデータに触れることなくデータ上で操作できるようにすることです。テスト操作がアクティブなコードからの実際のデータと並行して実行されるため、これは依然としてかなり恐ろしい提案となる可能性があります。
まとめ
本番環境でのテストは実装が難しく、既存のプロジェクトでは多くの変更が必要になる場合があります。しかし、重要な環境でコードの実際の動作をテストできるシステムを採用する利点は、いくら強調しても足りません。テストはバグを特定し、ソフトウェアへの信頼を構築することを目的としており、これら2つの目標は、非代表的な環境では完全に達成することが困難です。
このアプローチに伴う課題を理解することで、それが組織の作業スタイルにどれだけ適合するかを評価できます。本番環境でのテストはトレードオフの練習であり、その成功は、プロセスにどれだけの労力を費やす意欲と能力があるかに大きく依存する可能性があります。必ずしも簡単な調整ではありませんが、その利点は長期的に見て大いに役立つでしょう。
Prisma Data Platform は、本番環境でのデータベースへのアクセスを簡素化するのに役立ちます。Prisma Client を使用してデータベース接続を管理している場合、Prisma Data Platform は本番ワークロードをより簡単に管理するのに役立つ可能性があります。