ソフトウェア開発は時間の経過とともにますます複雑になり、安定した信頼性の高い製品をリリースするにはソフトウェア テストも同様に不可欠になっています。しかし、肥大化したテスト スイートが、より高速なリリースにとって悪名高いボトルネックであることはわかっています。
開発チームは進捗を続けるためにテストを高速化できる必要がありますが、それはそれほど単純ではありません。
テスト スイートの実行時間を測定すると、開発サイクルに大きな影響を及ぼし、高速なフィードバック ループ、リソースの効率的な利用、テストの保守性の向上が可能になります。以上のことを念頭に置くと、テストの実行時間を測定することがいかに重要であるかがわかります。
テストの実行時間を測定するには、ほぼすべての人のニーズを満たすのに十分な方法がいくつかあります。ただし、それが常に最良のアプローチであることを意味するわけではありません。あなたも聞いたことがあるかもしれない最も一般的な方法のいくつかについて話しましょう。
テスト フレームワークがログを生成すると、ログを解析してテストの開始時刻やテストの完了時刻などの必要な情報を抽出できます。
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 オブジェクトに変換します。
もう 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 を使用すると、すぐに測定を開始してテストをより効率的にすることができます。
Launchable は、TravisCI、Jenkins、GitHub Actions などのお気に入りの CI/CD ツールをすべて統合することで、テスト ランタイムの追跡を自動化します。つまり、Launchable を既存のパイプラインに簡単にスライドさせて、ML モデルでテストを分析できるようになります。
そして、一度開始すると、複数のビルドにわたるテストの実行時間をシームレスに測定できるため、実行時間だけではなく、テストに関する重要な洞察が得られます。
チームが、テストの実行時間を超えてテスト スイートの変更による影響を定量化できるようにします。 Launchable は、データ駆動型 QA のためのテスト スイートの透明性を高めるためのテスト スイートの健全性メトリクスを提供します。
テスト セッションの失敗率を特定する:頻繁に失敗するテストを特定し、テストまたは現在のビルドの潜在的な問題を調査します。テストプロセスの安定性に関する貴重な洞察を取得し、情報に基づいた意思決定を行って全体的な品質を向上させます。
テスト インフラストラクチャを効率的に利用することは、アイドル時間を最小限に抑え、リソースを最大化するための鍵となります。 Launchable でテストの実行時間を測定することで、パフォーマンスを妨げているボトルネックを簡単に特定します。
テスト内のスイート パターンと傾向をテストするために必要な情報をすべて取得し、情報に基づいてデータに基づいて意思決定を行い、テストを最適化できるようにします。そうすることで、テスト プロセス全体を合理化できます。