精密テストの探求:静的リンク分析と増分コードカバレッジ

一、背景

精密テストとは何か?通常、開発者がテストを提出する際にはコード変更があり、開発者の変更点および関連点に対してテストを実施することを精密テストと呼びます。

多くの場合、変更点や影響範囲の評価は十分に正確ではなく、時には評価が不十分であったり、過大評価されたりする状況が発生します。影響範囲が不十分な場合、実行するテストケースは網羅性が不足し、一部の機能がテスト漏れとなり、結果的にオンラインでの問題が発生します。影響範囲が過大な場合、テストケースが過剰になり、今回のテスト提出とは関係のない機能をテストするために多くの時間を費やし、人件費や物資の無駄使いとなります。したがって、ここでテストの精密化を提案します。

精密化されたテストについては、現在静的リンク分析と増分コードカバレッジ分析の2つの部分を探求しています。

二、静的リンク分析

1. 現在解決する問題:

一部のコードの結合度が高く、複数のビジネス間にメソッド依存関係がある:コードフレームワークの問題により、一部のコードの拡張性が低く、コード間の結合度が高くなっています。接続するビジネスラインが増えるにつれて、コード間の依存関係がますます多くなります。小さな変更でも、他の関係のないビジネスラインに影響を与える可能性があり、この影響はコードがエラーを報告しないため、開発者はそれをすぐに評価できないことがあります。

今回の変更が他のビジネスラインに影響があるかどうかを正確に評価できない:テスト担当者は通常、今回の要件変更に基づいてテストケースを作成しますが、コードの変更が他のビジネスラインに影響を与えるかどうかを評価できません。そのため、テストケースレビュー段階で、製品、開発、テスト担当者はすべて影響範囲を正確に評価できず、今回の要件がリリースされた後、他のビジネスで呼び出しエラーが発生するまで、ビジネスが影響を受けたことがわからないことがあります。

変更メソッドを通じて対応する上流・下流メソッド呼び出しチェーンを生成し、影響を受ける上流・下流メソッドを確認することで、開発者がコードの影響範囲を見逃していないか分析し、テスト担当者がテストケースを補充する必要があるかどうかを確認する助けとなります。

2. アーキテクチャ設計:

全体プロジェクトには、フロントエンドUIインターフェース、codeDiff、mavenコマンドによるパッケージング、静的リンク生成、コードコメントスキャン、実行結果同期などのいくつかの部分が含まれます。インターフェース操作を提供し、ユーザーはアプリケーション名とテスト提出ブランチを提供するだけで、影響されたメソッド数、変更メソッドに関連する上流・下流メソッドの対応するチェーン数を含むリンク分析レポートを一键生成できます。リンクを分析することで、今回の変更の影響範囲を迅速かつ正確に発見できます。

アーキテクチャ設計図は以下の通りです:

3. 使用効果:

現在までに、リスクコントロールビジネスラインに5つのアプリケーションが接続され、7つの要件がレビューされ、サプライチェーンファイナンス、天盾、認証などのビジネスラインがカバーされています。今後、より多くのビジネスが接続される予定です。

三、増分コードカバレッジ分析

カバレッジ統計について、まず思い浮かぶのはユニットテストにおけるコードカバレッジです。これも通常、私たちが最初に接触するものです。しかし、ここで行うのはサーバーサイドのコードカバレッジであり、テストケースの実行効果を測定できる統計でもあります。

カバレッジ測定を行うツールは多くありますが、ここではオープンソースツールであるJaCoCoを採用しています。これも最も一般的に使用されるツールの1つです。

まず、全量コードカバレッジ統計を行うには、どのようなステップが必要かを見てみましょう:

全量コードカバレッジ統計

1. サービスの起動

Tomcatの起動であれ、SpringBootの起動であれ、私たちは起動スクリプトを修正する必要があります。JACOCO_AGENTをJAVA_OPTSに追加することで、アプリケーションサービスを起動する際に、自動的にjacocoエージェントをロードし、同時にテスト対象のサービスを監視し、テスト対象のクラスとメソッドのデータを収集し始めます。

JACOCO_AGENT="-javaagent:/opt/jacocoagent.jar=destfile=/opt/jacoco/jacoco.exec,append=true,includes=com.*,output=tcpserver,address=0.0.0.0,port=8181"

2. テストケースの実行

3. execファイルの生成

ここでのexecファイルは、今回実行したテストケースがカバーしたクラスとメソッドの元データです。dumpコマンドを通じてサーバーと通信し、データを収集します。

java -jar org.jacoco.cli.jar dump --address 127.0.0.1 --port 8181 --destfile ./coverage.exec

4. レポートファイルの生成

ここでのレポートファイルは、全量のコードカバレッジのjacoco元のレポートです。reportコマンドを通じて生成します。

java -jar org.jacoco.cli.jar report coverage.exec --classfiles /workspace/code-domain/target/classes --sourcefiles /workspace/code-domain/src/main/java --html report --xml jacoco.xml --encoding utf8

プロジェクトに複数のモジュールがある場合は、複数のclassfilesとsourcefilesパスを指定できます。

これでjacocoの元のコードカバレッジレポートが生成されました。以下のようになります:

増分コードカバレッジ統計

では、増分コードカバレッジ統計を行うには、さらにどのようなステップが必要でしょうか?

サービスの起動、テストケースの実行、execファイルの生成はすべて変更する必要はありませんが、レポートを生成する前にいくつかのステップを追加する必要があります:

a. 増分コードの取得

org.eclipse.jgit.api.Gitとorg.eclipse.jgitを使用して、テスト対象ブランチとmasterブランチを比較し、リストを生成して、どのクラス、どのメソッドが変更されたかを確認します。

b. org.jacoco.cli.jarパッケージの改造

reportコマンドの後に--diffCodeを拡張します。

@Option(name = "--diffCode", usage = "input String for diff", metaVar = "<file>")
String diffCode;

c. レポートの実行と生成

java -jar org.jacoco.cli.jar report coverage.exec --classfiles /workspace/code-domain/target/classes --sourcefiles /workspace/code-domain/src/main/java --html report --xml jacoco.xml --diffCode '[]' --encoding utf8

これにより、増分コードのみをハイライトしたカバレッジレポートが生成されます。このレポートを通じて、今回のテスト提出で変更されたコードがテストケースでカバーされているかどうかを確認でき、今後、カバーされていないコードをカバーするためにどのテストケースを補充するかを特定できます。

四、将来の計画

現在は静的リンク分析および増分コードカバレッジ統計のみを実現していますが、今後はテストケースの実行によって動的リンクを生成し、テストケースとリンクの間の関係をより正確にマッチングできるようになります。これにより、今後行うテストケースの推奨において、より良い指導意義があります。

精密テストの実装と普及が、私たちのテスト品質をより効果的に保証し、テスト効率を向上させることを信じています。

タグ: テスト自動化 コードカバレッジ JaCoCo 静的解析 ソフトウェアテスト

7月1日 20:47 投稿