paint-brush
テスト影響分析 - 概要、テスト方法、その他知っておくべきこと@launchable
11,325 測定値
11,325 測定値

テスト影響分析 - 概要、テスト方法、その他知っておくべきこと

Launchable7m2023/02/15
Read on Terminal Reader

長すぎる; 読むには

テスト影響分析は、テスト サイクルのスピードアップに役立ちますが、適切に管理しないと手に負えなくなる可能性があります。この方法を効果的に利用する方法については、こちらをご覧ください。
featured image - テスト影響分析 - 概要、テスト方法、その他知っておくべきこと
Launchable HackerNoon profile picture

組織が過去 5 年間で DevOps 戦略を全速力で進めてきたのは、あなただけではありません。 組織の 4 分の 3 がDevOps アプローチを採用しており、この数字は過去 5 年間で 2 倍以上になっています。


DevOps の爆発的な成長にもかかわらず、ハーバード ビジネス レビュー調査の回答者のうち、自社のビジネスが「迅速なソフトウェア開発と展開で非常に成功している」と述べているのはわずか 10% です。


DevOps の変革には、より迅速な起動と展開が必要ですが、ビルドの頻度を増やすと、より多くのテストが構築され、開発のボトルネックが発生します。


遅いテスト サイクルが迅速な開発を妨げている立場にあるチームにとって、テスト影響分析は、変更されたソース コードに関連するテストのみを実行することによって開発サイクルを加速する方法です。

テスト影響分析とは

テスト影響分析は、一連のコード変更に関係するテストのみを実行することで、ソフトウェア テストを高速化する方法です。テストの影響分析を実行すると、チームは変更を出荷するためのオーバーヘッドを削減することで、開発と展開のサイクルをスピードアップできます。


従来、ソフトウェア テストにおける影響分析は、多くの場合、静的ソース コード分析に依存して、コードとテスト間の依存関係グラフを構築していました。


テスト影響分析専用に設計されたツールまたはライブラリにアクセスできない場合は、コードベースへの変更を手動で追跡し、この情報を使用して、影響を受ける可能性が高いテストを判断できます。


たとえば、システム内の各モジュールまたはコンポーネントに関連付けられているテストのリストを維持し、変更を加えるたびにこのリストを更新できます。

テスト影響分析の実行方法

テスト影響分析を手動で実行するには、各テストを実行し、各テストが実行するコードのマップを作成します。マップを作成したら、開発者がコードをプッシュするたびに実行される小さなプログラムを作成できます。


プログラムは変更されたファイルを確認し、変更のために実行する必要があるテストを検索します。


時間の経過とともにコードが変更されると、正確な依存関係グラフを得るためにマップを定期的に更新する必要があります。

実践的な Python コードの例: 手動テストの影響分析

以下のコード スニペットは、テスト名をそれらが関連付けられているコンポーネントにマップします。この例では、3 つのモジュールがあります。


  • ログイン
  • アカウントの作成
  • パスワードのリセット


変更されたコンポーネントごとに、テスト実行フレームワークに渡すことができるリストにテストを追加します。


 # Define a dictionary that maps test names to the modules or components they are testing tests_by_component = { "test_login": ["login_module"], "test_account_creation": ["account_creation_module"], "test_password_reset": ["password_reset_module"] } # Define a list of the components that have been modified # This should be dynamically generated based on the code changes. modified_components = ["login_module"] # Determine which tests are likely to be affected by the changes affected_tests = [] for test, components in tests_by_component.items(): for component in components: if component in modified_components: affected_tests.append(test) # Now, we can pass the affected tests to our test harness. print(affected_tests) # Output: ["test_login"]


テスト影響分析の利点と課題

テスト影響分析を効率的に行うと、次のような多くの利点が得られます。


  • 再テストに費やす時間を削減


  • テスト プロセスの全体的な効率の向上


手動によるソフトウェア テストの影響分析は、正しく行うのが難しい場合があります。プロジェクトが小さなマイクロサービスであろうと巨大なモノリスであろうと、扱う必要があるテスト データの量はすぐに大きくなる可能性があります。


手動のテスト分析は、開発者が時間の経過とともに新しい機能を追加し、コードをリファクタリングするにつれて、すぐに扱いにくく、さらに困難になります。


追加されたコード行ごとに、潜在的な影響と、そのコード行に関連するテストを特定する必要があります。多くの開発チームは、 適切なテストを選択するには、 大規模に実行するには多くの作業が必要であると報告しています。

成長する組織でのソフトウェア テスト: テストの一般的な状態

非常によく知られているシナリオを見てみましょう。中規模の技術スタートアップのソフトウェア開発チームは、過去 3 年間で爆発的な成長を遂げました。


彼らはベンチャー キャピタルの資金調達でシリーズ C に到達し、資金注入を利用して開発者を雇い、新機能を迅速に構築しました。同社は、アジャイルで DevOps 中心のモデルを使用し、堅牢な一連のテストに誇りを持っています。

ここからどこにいきますか?

急速な会社の拡大は、開発チームの成長する苦痛を伴います。新機能の流入は、新しいテストと重大な変更の流入を意味し、その結果、テスト フレークと長時間のランタイムが発生します。


スタートアップの誰も、もはや失敗が正当であるとは信じていないため、開発者はテストが成功するまで「再実行」ボタンを繰り返し押します。彼らは、テストを成功させることができない場合でも変更をマージし、問題はコードではなくテストにあると想定します。


開発者は、時間がかかりすぎる、またはコードに関連していないように見えるテストを無効にします。彼らにはやらなければならない仕事があり、ソフトウェア テストがタスクを完了するための障壁であると考え始めています。


開発者は、テストを信頼できなくなり、勝手に無効にしたり無視したりするシナリオに陥っています。つまり、本質的には、手動でテストを選択するリスクの高い独自のバージョンに取り組んでいます。


エンジニアリング チームは、この状況が持続不可能であることを心配し始めています。


  • 問題をキャッチしたであろうテストを無視したために誰かが壊れたコードをマージしたらどうなるでしょうか?


  • チームは、最終的に無視する不安定なテストを継続的に再実行するために、クラウド リソースにどれくらいの費用を費やしていますか?


  • テストが実行されるのを待つためにどれだけの時間を無駄にしていますか?


スタートアップのエンジニアリング責任者は、コストのかかるインシデントが発生する前に、DevOps の技術的負債を先取りする時期であると判断しました。


開発者は、ワークフローをスピードアップしようとするアドホックなテスト影響分析の代わりに、コード変更に重要なテストを選択する方法を見つけ出します。

予測テスト選択によるテスト影響分析の促進

予測テスト選択は、データを使用して、過去のテスト結果とコード変更に基づいて CI システムが実行する必要があるテストを予測する、テスト影響分析のブランチです。


Launchable は、ボタンを押すだけであらゆる規模のチームが利用できるように、Predictive Test Selection アプローチを民主化しています。


Launchable のPredictive Test Selection は、機械学習の力を利用してソフトウェア開発を合理化することにより、テスト影響分析を解決します。 Predictive Test Selection は、データ駆動型のインテリジェンスを使用して、各タイプの変更に最適なテストを決定します。


無駄なリソースを減らして、テスト実行の回数を減らし、配信までの時間を短縮できます。


このプラクティスがない場合、チームは「スモーク テスト」のサブセットを手動で作成するか、テストを並列化する必要があります。


前のシナリオでは、スタートアップの開発チームは予測テストの選択から利益を得ることができました。開発者は、最も重要な機能の提供に集中し、ワークフローをスピードアップし、テスト スイートを再び信頼することができます。

ハンズオン Python コード サンプル: Launchable と Pytest を使用した予測テストの選択

Launchable を使用すると、どのテストが実行されるかを推測する必要がなくなり、テスト影響分析スイートを常に更新できます。 Launchable がPytest フレームワークでどのように機能するかを示す Python の例を次に示します。

Launchable を使用した Pytest のセットアップと実行

  1. pip3 install pytest-launchableインストールします


  2. launchable-config --createを実行して Launchable 構成ファイルを生成します


  3. https://app.launchableinc.com/から Launchable API キーを生成します。


    1. テストを実行するマシンでLAUNCHABLE_TOKEN環境変数として設定します。


  4. Launchable 構成ファイルを含むディレクトリから、 pytest --launchable <your-pytest-project>を実行します。


pytest の結果は Launchable に報告されます。その後、Launchable は、テスト結果に基づいて機械学習モデルのトレーニングを開始します。モデルは、どのテストが最短のテスト時間で最も役立つ可能性が高いかを最適化します。

テスト影響分析、予測テスト選択、およびパイプラインのデータドリブン化に関する最終的な考え

Launchable のML 駆動の予測テスト選択により、チームは通常、品質に影響を与えることなく、テスト時間を 60 ~ 80% 短縮できます。


組織が Launchable の予測選択機能を選択する主な理由は次のとおりです。


  • 開発者の時間を節約


  • インフラストラクチャの支出を削減


  • コードをより速く出荷する


これらのケース スタディで、さまざまな業界のエンジニアが Launchable でどのように成功しているかをご覧ください。テスト影響分析は、テスト プロセスの効率を改善するための不可欠なツールです。ただし、手動または静的分析は面倒な場合があり、価値を提供できない可能性があります。


Predictive Test Selection を使用してテスト影響分析を適切に実装すると、パイプラインをよりデータ駆動型にすることで、時間を節約し、テストの品質を向上させることができます。


Launchable は、コミットの頻度や所有する Git ブランチの数に関係なく、CI とシームレスに統合します。すべてのアプリと言語をサポートし、チームは品質に影響を与えることなくテスト時間を最大 90% 短縮したと報告しています。