paint-brush
テスト実行時間の測定: テスト スイートのパフォーマンスを最適化する方法@launchable
7,486 測定値
7,486 測定値

テスト実行時間の測定: テスト スイートのパフォーマンスを最適化する方法

Launchable6m2023/07/25
Read on Terminal Reader

長すぎる; 読むには

テストの実行時間を測定することが開発サイクルの加速に役立つ理由と、測定を完了するための最適な方法を理解します。
featured image - テスト実行時間の測定: テスト スイートのパフォーマンスを最適化する方法
Launchable HackerNoon profile picture

今すぐ始められる手動および AI を活用したテスト ランタイム アプローチ

ソフトウェア開発は時間の経過とともにますます複雑になり、安定した信頼性の高い製品をリリースするにはソフトウェア テストも同様に不可欠になっています。しかし、肥大化したテスト スイートが、より高速なリリースにとって悪名高いボトルネックであることはわかっています。


開発チームは進捗を続けるためにテストを高速化できる必要がありますが、それはそれほど単純ではありません。


テスト スイートの実行時間を測定すると、開発サイクルに大きな影響を及ぼし、高速なフィードバック ループ、リソースの効率的な利用、テストの保守性の向上が可能になります。以上のことを念頭に置くと、テストの実行時間を測定することがいかに重要であるかがわかります。

テスト実行時間を測定するための従来のアプローチ

テストの実行時間を測定するには、ほぼすべての人のニーズを満たすのに十分な方法がいくつかあります。ただし、それが常に最良のアプローチであることを意味するわけではありません。あなたも聞いたことがあるかもしれない最も一般的な方法のいくつかについて話しましょう。


  • 手動タイミング- 考えられる最も基本的な方法で、従来の時計やストップウォッチを使用してこれらのテストのタイミングを計測する方法は、まったく前例のないものではありません。必要なのは、時間の経過を追跡する方法 (携帯電話のストップウォッチ機能など) と適切なタイミングだけです。ただし、依然として人間の対話に依存しているため、最も正確とは言えません。


  • CI ツールとの統合- 多くの CI ツールには、テストの実行時間を測定する機能が含まれています。 TravisCI や Jenkins などのツールは、提供されたジョブの開始時刻と終了時刻を記録し、ジョブのパフォーマンスと変化の有無を一目で把握できます。


  • ログの分析とタイムスタンプの使用- もう 1 つのより「手動」の方法は、テストの実行中にテスト内でログを設定することです。どの言語を使用する場合でも、必ずどこかに同等の print() 関数が存在します。解析を容易にするためにこれらの結果をログに記録するようにテストを設定することもできますが、どちらを選択してもテストの作成に時間がかかります。

Python でのログの分析例

テスト フレームワークがログを生成すると、ログを解析してテストの開始時刻やテストの完了時刻などの必要な情報を抽出できます。


 import re def parse_logs(log_file): with open(log_file, 'r') as f: logs = f.readlines() test_start_time = None test_end_time = None for line in logs: if 'Test started' in line: test_start_time = extract_timestamp(line) elif 'Test completed' in line: test_end_time = extract_timestamp(line) if test_start_time and test_end_time: test_runtime = test_end_time - test_start_time print(f"Test runtime: {test_runtime}") def extract_timestamp(log_line): # Regular expression to extract timestamp (assuming format: [YYYY-MM-DD HH:MM:SS]) timestamp_pattern = r'\[(\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2})\]' match = re.search(timestamp_pattern, log_line) if match: timestamp = match.group(1) return convert_to_datetime(timestamp) return None def convert_to_datetime(timestamp): from datetime import datetime datetime_format = "%Y-%m-%d %H:%M:%S" return datetime.strptime(timestamp, datetime_format) # Usage parse_logs('test_logs.txt')


この例では、parse_logs 関数はログ ファイルを 1 行ずつ読み取り、特定のマーカー (「テスト開始」および「テスト完了」) を検索して、対応するタイムスタンプを抽出します。正規表現を使用してタイムスタンプを抽出し、さらに計算するためにそれを DateTime オブジェクトに変換します。

Python を使用したタイムスタンプの例

もう 1 つの方法は、テスト コードにタイムスタンプを直接記録することです。以下の例では、 run_test 関数は、テスト ロジックを実行する前に、 time.time() を使用して開始時刻を記録します。


テストが完了すると、終了時間から開始時間を減算して実行時間を計算します。これも time.time() を使用して取得されます。


結果はテスト実行時間として秒単位で出力されます。


 import time def run_test(): start_time = time.time() # Test logic goes here # ... end_time = time.time() test_runtime = end_time - start_time print(f"Test runtime: {test_runtime} seconds") # Usage run_test()


どのようなアプローチをとるかに関係なく、これらの方法にはいくつかの落とし穴がある傾向があります。これらの方法から完全に正確な結果を得るのは、人的ミスの可能性や外部要因の影響によっても困難です。


さらに、これらの多くはテストに応じてスケールアップできません。つまり、より正確に測定する方法を見つける必要があります。

そもそも、なぜテストの実行時間を測定する必要があるのでしょうか?

「方法」については延々と説明してきましたが、「理由」についてはどうでしょうか?テストは重要ですが、テスト パイプラインが配信のボトルネックになる可能性があります。


テストの実行方法を追跡することで、テストのパフォーマンスの全体像を把握し、テスト スイートのインテリジェンスをつなぎ合わせて、次の 3 つの共通領域を含むテストをさらに合理化するための手順を実行できます。

並列化の最適化

テスト スイートの実行時間を測定すると、どのテストの実行時間が最も長いかを特定できます。この透明性により、可能な場合は並列テストによりテストをさらに最適化でき、より迅速な結果とより短いフィードバック ループが得られます。

資源の配分

テストの実行時間を正確に測定すると、テスト フェーズをより効率的に計画するのに役立ちます。より長いテストに時間と計算能力を割り当て、パイプラインの後半でのボトルネックを回避できます。

テストの優先順位付け

最も遅いテストを特定すると、一歩下がって、最も重要なテストと後で保存できるテストに優先順位を付けることもできます。こうすることで、より高速なテストを最初に実行でき、長いテストが機能する前にビルドに関する重要な洞察を得ることができます。

継続的改善

CI/CD パイプラインではテストのランタイムが非常に重要であり、迅速なフィードバックが不可欠です。テストの実行時間を測定して最適化することで、 CI/CD プロセスに必要な時間を短縮し、より迅速なデプロイを可能にします。


これにより、開発プロセス全体の機敏性が向上し、より頻繁な反復が可能になります。

Launchable を使用してテスト ランタイムと重要な KPI の追跡を自動化する

テストの実行時間を測定することが、テスト プロセス全体において大きな要素となる可能性があることは明らかです。また、Launchable を使用すると、すぐに測定を開始してテストをより効率的にすることができます。

Launchable はテストの実行時間をどのように測定しますか?

Launchable は、TravisCI、Jenkins、GitHub Actions などのお気に入りの CI/CD ツールをすべて統合することで、テスト ランタイムの追跡を自動化します。つまり、Launchable を既存のパイプラインに簡単にスライドさせて、ML モデルでテストを分析できるようになります。


そして、一度開始すると、複数のビルドにわたるテストの実行時間をシームレスに測定できるため、実行時間だけではなく、テストに関する重要な洞察が得られます

完全なテストスイートの健全性のためのランタイムを超えたより深いテスト洞察

チームが、テストの実行時間を超えてテスト スイートの変更による影響を定量化できるようにします。 Launchable は、データ駆動型 QA のためのテスト スイートの透明性を高めるためのテスト スイートの健全性メトリクスを提供します



  • テスト セッションの継続時間を追跡する:テスト スイートが複数のセッションにわたって実行されるのにかかる時間を測定します。当社の追跡機能は、予想時間を超えたテストを強調表示し、パフォーマンスの問題を特定して解決するのに役立ちます。


  • テスト セッションの頻度を最適化する:テスト スイートが実行される頻度を監視し、それをセッション期間と組み合わせます。テストが適切な間隔で実行されていることを確認します。さらに、予測テスト選択は、最も関連性の高いテストを最適なタイミングで実行することで、時間とリソースを節約します。


  • テスト セッションの失敗率を特定する:頻繁に失敗するテストを特定し、テストまたは現在のビルドの潜在的な問題を調査します。テストプロセスの安定性に関する貴重な洞察を取得し、情報に基づいた意思決定を行って全体的な品質を向上させます。


テスト インフラストラクチャを効率的に利用することは、アイドル時間を最小限に抑え、リソースを最大化するための鍵となります。 Launchable でテストの実行時間を測定することで、パフォーマンスを妨げているボトルネックを簡単に特定します。


テスト内のスイート パターンと傾向をテストするために必要な情報をすべて取得し、情報に基づいてデータに基づいて意思決定を行い、テストを最適化できるようにします。そうすることで、テスト プロセス全体を合理化できます。