このトピックでは、Parasoft アプリケーション カバレッジ ワークフローの一部として SOAtest を使用する方法について説明します。アプリケーション カバレッジ ソリューションの使用に関する完全な情報については、「Collecting Coverage for Web Applications」を参照してください。

はじめに

Parasoft アプリケーション カバレッジ ソリューションを使用すると、実行中のアプリケーションに対してテストを実行しながら、アプリケーションのコード カバレッジを測定できます。カバレッジは、実行中の単一のアプリケーションから、または複数のバックエンド サービスで構成されるアプリケーションから収集できます (同じテスト ケースの実行中に、すべてのバックエンド サービスからカバレッジを収集できます)。これにより、既存のテストスイートの有効性を評価し、追加のテストが必要な箇所を判断し、アプリケーションの進化に合わせてより効率的にテストを実行することができます。SOAtest for Java/dotNET に付属のカバレッジ エージェントを利用してアプリケーション カバレッジを収集できます。これにより、テストの実行中にアプリケーションを監視できます。

アプリケーション カバレッジは、静的および動的カバレッジ データを収集して DTP にアップロードして表示することによって取得されます。

次のステップでは、SOAtest によるアプリケーション カバレッジのワークフローを説明します。

  1. 静的カバレッジ ファイルを生成します。アプリケーションのソース コードにアクセスできる場合は、静的カバレッジ ファイルを Jtest/dotTEST によって .xml または .data 形式で生成する必要があります。この方法には他の方法に比べていくつかの利点があるためです。アプリケーションのソース コードにアクセスできない場合は、SOAtest に付属のカバレッジ ツールを使用してアプリケーション バイナリを分析することによって、静的カバレッジ ファイルを生成することもできます。詳細については、以下の「静的カバレッジ ファイルの生成」を参照してください。
  2. カバレッジ エージェントをテスト対象アプリケーション (AUT) に接続します。カバレッジ エージェントは SOAtest に同梱されており、テスト対象アプリケーションの実行中に実行されるコードを監視できます。
  3. カバレッジ エージェントに接続してランタイム カバレッジを収集し、データを DTP にアップロードするように SOAtest を構成します。
  4. 自動化プロセスの一部として SOAtest を使用してテストを実行します。
  5. カバレッジ エクスプローラーで DTP 上のアプリケーション カバレッジを確認します。

SOAtest 2023.1 以降では、DTP にアップロードされるカバレッジ レポートは DTP 2023.1 以降に送信する必要があります。以前のバージョンの DTP は、SOAtest 2023.1 以降によって生成されたカバレッジ レポートを適切に処理できません。

静的カバレッジ ファイルの生成

アプリケーションのソース コードにアクセスできる場合は、可能であれば Jtest または dotTEST を使用して .xml または .data 形式で静的カバレッジ ファイルを生成する必要があります。この方法には、ユーザー クラス、メソッド、行に関するメタデータが含まれること、DTP でカバレッジ結果を表示するときにカバレッジ データで注釈が付けられたソース コードの表示をサポートすることなど、いくつかの利点があります。また、この方法で生成された静的カバレッジはより正確な分析を提供するため、テスト影響度分析 も向上します。テストは、変更されたメソッドを通過する場合にのみ、影響を受けるとフラグ付けされます。 アプリケーションバイナリから生成された静的カバレッジで TIA を使用することもできますが、TIA の結果はより広範囲になり (分析はクラスレベルで行われるため)、一部のテストは、影響を受ける必要がないにもかかわらず、影響を受けるとフラグ付けされる可能性があります。これらのツールを使用して静的カバレッジ ファイルを生成する方法の詳細については、docs.parasoft.com にある Jtest または dotTEST のユーザー ガイドを参照してください。

SOAtest に付属のカバレッジ ツールを使用して静的カバレッジ ファイルを生成することもできますが、これには上記のソース コードを使用する利点がありません。これを行うには、SOAtest とは独立してツールを実行し、実行時にバイナリ、フィルター、およびその他のプロパティを渡す必要があります (下記のサンプル プロパティ ファイルを参照)。Parabank に対して Jtest カバレッジ ツール (jtestcov) を使用した例を以下に示します。

java -jar jtestcov.jar -app c:/<PATH_TO_APPLICATION>/parabank.war -include com/parasoft/parabank/** -settings c:/<PATH_TO_LICENSE_FILE>/settings.properties
# === DTP SERVER SETTINGS ===

# Specifies URL of the DTP server in the form https://host[:port][/context-path]
#dtp.url=https://localhost:8443

# Specifies user name for DTP server authentication.
#dtp.user=admin

# Specifies password for DTP server authentication - use jtestcli -encodepass <PASSWORD> to encrypt the password, if needed.
#dtp.password=admin

# Specifies name of the DTP project - this settings is optional. 
#dtp.project=[DTP Project Name]

# === DTP REPORTING ===

# Enables reporting test results to DTP server - be sure to configure DTP server settings.
#report.dtp.publish=true

# Specifies a build identifier used to label results. It may be unique for each build
# but may also label more than one test sessions that were executed during a specified build.
#build.id=${dtp_project}-yyyy-MM-dd

# Specifies a tag which represents an unique identifier for the run, used to distinguish it from similar runs.
# It could be constructed as minimal combination of following variables that will make it unique or specified manually.
# e.g. ${config_name}-${project_module}-${scontrol_branch}-${exec_env}
#session.tag=[tag]

# Specifies a set of tags that will be used to create coverage images in DTP server.
# Coverage images allow you to track different types of coverage, such as coverage for unit, functional, manual tests and others.
# There is a set of predefined tags that will be automatically recognized by DTP, see the examples below.
# You can also specify other tags that will be used to create coverage images.
#report.coverage.images=${dtp_project}
#report.coverage.images=${dtp_project};${dtp_project}_Unit Test
#report.coverage.images=${dtp_project};${dtp_project}_Functional Test
#report.coverage.images=${dtp_project};${dtp_project}_Manual Test

# === CONSOLE VERBOSITY LEVEL ===
# Increases console verbosity level to high.
#console.verbosity.level=high

包含と除外の定義は、システムの処理量を制御する上で重要な部分であり、静的カバレッジファイルの生成時間に大きな影響を与える可能性があります。多くの場合、サードパーティライブラリコードのコードカバレッジを測定する必要はないため、これらの設定を使用してコードカバレッジをプロジェクトコードに限定することをお勧めします。包含と除外は、インストゥルメントするクラスを指定するパターンのカンマ区切りリストとして表現する必要があります。以下のワイルド カードをサポートします。

* はゼロ個以上の文字に一致します
** は複数のディレクトリ レベルに一致します

次の例では、com.myapp.data パッケージのすべてのクラスと、com.myapp.common で始まるパッケージおよびサブ パッケージのすべてのクラスがインストゥルメントされます。

-include com/myapp/data/*,com/myapp/common/**

次の例では、com.myapp.transport パッケージのすべてのクラスと、com.myapp.autogen で始まるパッケージおよびサブ パッケージのすべてのクラスがインストゥルメントから除外されます。

-exclude com/myapp/transport/*,com/myapp/autogen/**

開発部門以外でアプリケーションバイナリを扱っていて、適切な include/exclude 設定がわからない場合は、開発部門に連絡して、正しいパターンを使用しているかを確認してください。通常、com.myapp.** のような会社コードをパッケージ化するための標準パターンがあり、適切な設定を判断するのに役立ちます。

テスト対象アプリケーションのカバレッジ設定

SOAtest でカバレッジの収集を開始する前に、Parasoft dotTEST または Parasoft Jtest を使用して、テスト対象アプリケーション (AUT) を設定する必要があります。処理の概要を以下に示します。 詳しい手順については、docs.parasoft.com で Jtest または dotTEST ユーザー ガイドを参照してください。予期しない問題を回避するために、SOAtest、dotTEST、Jtest のバージョンが同期していることを確認してください。

  1. (オプション) カバレッジ エージェントのオプションを設定して、カバレッジ エージェントをカスタマイズします。この手順は、AUT と同時に対話している複数のユーザーのカバレッジ情報を収集する場合に必要です。 
  2. カバレッジ エージェントを AUT に接続します。

カバレッジ エージェントの構成

アプリケーション サーバーには通常、複数のアプリケーションが含まれています。さらに、共通のサーバー クラスやアプリケーション ライブラリをインストゥルメントする必要はありません。エージェントはアプリケーションのソース コードのカバレッジを収集するだけで済みます。すべてのクラスをインストゥルメントするには時間がかかりすぎます。このため、カバレッジ エージェントの範囲を適切に設定することが非常に重要です。Jtest と dotTEST のカバレッジ エージェントがあります。

Jtest カバレッジ エージェント

agent.properties のプロパティを変更し、-javaagent 引数にプロパティを渡すことにより、Jtest のカバレッジ エージェントを設定できます。エージェントはいくつかのパラメーターをサポートしていますが ( 「カバレッジ エージェントのパラメーター」を参照)、デフォルト設定の構成はほとんどの場合に適しています。

jtest.agent.serverEnabled=true
jtest.agent.includes=com/myapp/data,com/myapp/common/**
jtest.agent.excludes=com/myapp/transport/*,com/myapp/autogen/**

カバレッジ エージェント パラメーター

次の表に、エージェントに設定できるすべてのプロパティを示します。

jtest.agent.runtimeData

エージェントが実行時に収集するカバレッジ データを保存するアプリケーション サーバー上の場所を指定します。次の例では、C:/tmp/myapp/ ディレクトリに、名前のプレフィックスとして runtime_’ が付いたファイルを作成します:

'C:/tmp/myapp/runtime'

jtest.agent.includes

インストゥルメントするクラスを指定するパターンのカンマ区切りリスト。以下のワイルド カードをサポートします。

* はゼロ個以上の文字に一致します
** は複数のディレクトリ レベルに一致します

次の例では、com.myapp.data パッケージのすべてのクラスと、com.myapp.common で始まるパッケージおよびサブ パッケージのすべてのクラスがインストゥルメントされます。

com/myapp/data/*,com/myapp/common/**

jtest.agent.excludes

インストゥルメントから除外するクラスを指定するパターンのカンマ区切りリスト。以下のワイルド カードをサポートします。

* はゼロ個以上の文字に一致します
** は複数のディレクトリ レベルに一致します

次の例では、com.myapp.transport パッケージのすべてのクラスと、com.myapp.autogen で始まるパッケージおよびサブ パッケージのすべてのクラスがインストゥルメントから除外されます。

com/myapp/transport/*,com/myapp/autogen/**

jtest.agent.autostart自動ランタイム データ収集を有効/無効にします。デフォルトは true です。
jtest.agent.port エージェント通信ポートを設定します。デフォルトは 8050です。
jtest.agent.debug コンソールへの詳細な出力を有効/無効にします。デフォルトは false です。
jtest.agent.enableMultiuserCoverage 

複数のユーザーの Web アプリケーション カバレッジの収集を有効/無効にします。デフォルトは false です。 

jtest.agent.autoloadMultiuserLibsjtest.agent.enableMultiuserCoverage が true に設定されている場合に、マルチユーザー ライブラリ (OpenTelemetry javaagent) の自動読み込みを有効/無効にします。デフォルト値は true です。 
jtest.agent.serverEnabledエージェントをアクティブ化します。
jtest.agent.enableJacoco エージェントが JaCoCo エンジンを使用してカバレッジを収集できるようにします。デフォルトは false です。
jtest.agent.appLocationIncludesコード変更によって影響を受けた手動テストを判別するために CTP が使用するアプリケーション ファイルの場所を指定する、カンマ区切りのパス パターンのリスト。以下のワイルド カードをサポートします。

* はゼロ個以上の文字に一致します
** は複数のディレクトリ レベルに一致します

jtest.agent.appLocationExcludesjtest.agest.appLocationIncludes で指定された場所内にあるアプリケーション ファイルの場所を指定するパス パターンのカンマ区切りリストです。ただし、CTP がコード変更の影響を受けた手動テストを判別する際には考慮する必要はありません。この方法でファイルを除外すると、ファイルの変更を分析するために必要な時間を大幅に短縮できます。以下のワイルド カードをサポートします。

* はゼロ個以上の文字に一致します
** は複数のディレクトリ レベルに一致します

プロパティを設定したら、アプリケーション サーバーの起動時に -javaagent 引数を追加して、エージェントをアタッチし、エージェント設定ファイルを含めます。  

-javaagent:'/path/to/agent.jar'=settings='/path/to/agent.properties',runtimeData='/path/to/runtime_coverage' 

次の例では、catalina.sh (Linux) または catalina.bat (Windows) スクリプトの先頭に JAVA_OPTS 変数を使用して、エージェントを Tomcat サーバーに接続しています。

if [ "$1" = "start" -o "$1" = "run" ]; then
JAVA_OPTS='-javaagent:"/home/TIA/test_impact_analysis/integration/coverage/agent.jar"=settings="/home/TIA/test_impact_analysis/integration/coverage/agent.properties",runtimeData="/home/TIA/coverage_storage"'
fi
if "%1"=="stop" goto skip_instrumentation
set JAVA_OPTS=-javaagent:"C:\TIA\test_impact_analysis\integration\coverage\agent.jar"=settings="C:\TIA\test_impact_analysis\integration\coverage\agent.properties",runtimeData="C:\TIA\coverage_storage"
:skip_instrumentation

アプリケーションを起動し、ブラウザで <host>:8050/status を開いて、エージェントの準備ができていることを確認します。test、runtime_coverage、testCase の各プロパティを含む JSON オブジェクトが表示されます。例:

{"test":null,"session":"runtime_coverage_20191008_1537_0","testCase":null}

runtimeData プロパティで指定したディレクトリを確認することもできます (上記の例では /home/TIA/coverage_storage)。このディレクトリには、静的なカバレッジ データ ファイルが含まれているはずです。このカバレッジ データ ファイルはエージェントの起動時に生成されます。

マルチユーザー モードの追加手順

マルチユーザー カバレッジを有効にしていて、複数のユーザーが同じ Web アプリケーションに同時にアクセスしている場合、収集されるカバレッジ データが混在する可能性があります。これを防ぐために、いくつかの追加手順があります。

また、マルチユーザー モードでは次の点に注意してください。

dotTEST カバレッジ エージェント

dotTEST カバレッジ エージェントは、Web アプリケーションおよびスタンドアロン アプリケーションのカバレッジを収集できます。それぞれ異なる構成が必要です。

Web アプリケーション

テスト対象アプリケーション (AUT) は、IIS バージョン 7.5 以降を使用するマシン上で実行されている必要があります。

カバレッジ エージェントをテスト対象アプリケーションに接続するには、次の操作を行います。

  1. <INSTALL_DIR>/coverage/dotNET/dottest_agent フォルダーを、IIS がインストールされ、Web アプリケーションがデプロイされているマシンにコピーします。
  2. このマシン上で管理者としてコンソールを実行します。
  3. dotTEST アプリケーション カバレッジ UI を起動するには、次のコマンドを使用してコンソールでエージェント クライアントを実行します。
    agent_client.exe
  4. [IIS Web アプリケーション] を選択して [次へ] をクリックします。
  5. (オプション) 以下の設定を行います。
  6. [次へ] をクリックします。カバレッジは、IIS サーバー上に存在するすべてのアプリケーションに対して収集されます。
  7. (オプション): 指定されたアプリケーションでテストを実行し、カバレッジ API を表示します。
  8. このマシンのファイアウォール設定で、ポート 8050 (カバレッジ エージェントのデフォルト ポート) が HTTP トラフィックを許可していることを確認してください。デフォルトのポートが使用できない場合は、カバレッジ エージェントのポート番号を変更できます。
  9. アプリケーションを起動し、ブラウザで <host>:8050/status を開いてエージェントの準備ができていることを確認します。次の応答が返されるはずです。

    {"session":null,"test":null}
  10. soatest.properties を構成して、テスト対象アプリケーションのカバレッジを収集します。いくつかのアプリケーション カバレッジ パラメーターがサポートされていますが (「アプリケーション カバレッジの設定」を参照)、次の設定を構成することがほとんどの場合に適しています。

    application.coverage.enabled=true
    application.coverage.agent.url=http://localhost:8050
    application.coverage.binaries=c:/<PATH_TO_APPLICATION_PDB_FILES>/bin
    application.coverage.binaries.include=<INCLUDE_PATTERN>
    application.coverage.binaries.exclude=<EXCLUDE_PATTERN>

    アプリケーション バイナリのパスが、アプリケーション PDB ファイルを含むフォルダーへのパスであることを確認してください。

  11. すべてのアプリケーションからのカバレッジ収集を終了するには、[カバレッジエージェントの停止] をクリックします。
  12. アプリケーション カバレッジ UI を閉じるには [終了] をクリックし、新しいカバレッジ収集セッションを構成するには [新規セッション] をクリックします。

マルチユーザー モードの追加手順

マルチユーザー カバレッジを有効にしていて、複数のユーザーが同じ Web アプリケーションに同時にアクセスしている場合、収集されるカバレッジ データが混在する可能性があります。これを防ぐために、いくつかの追加手順があります。

スタンドアロン アプリケーション

ほとんどのユーザーは Web アプリケーションのカバレッジを収集しますが、スタンドアロン アプリケーションからカバレッジ情報を収集することもできます。

  1. <INSTALL_DIR>/coverage/dotNET/dottest_agent フォルダーを、スタンドアロン アプリケーションを実行するマシンにコピーします。
  2. dotTEST アプリケーション カバレッジ UI を起動するには、次のコマンドを使用してコンソールでエージェント クライアントを実行します。
    agent_client.exe
  3. [デスクトップ アプリケーション] を選択し、[次へ] をクリックします。
  4. 以下の設定を行います。
  5. [次へ] をクリックします。指定されたアプリケーションが実行され、カバレッジが収集されます。アプリケーションに対してテストを実行します。
  6. (オプション): カバレッジ API を参照します。
  7. アプリケーションからのカバレッジ収集を終了するには、[カバレッジエージェントの停止] をクリックします。
  8. アプリケーション カバレッジ UI を閉じるには [終了] をクリックし、新しいカバレッジ収集セッションを構成するには [新規セッション] をクリックします。

マルチユーザー カバレッジは現在、スタンドアロン アプリケーションでは利用できません。

カバレッジを収集およびアップロードするための SOAtest の設定 

適切な構成を利用して、SOAtest はテストの実行中にアプリケーション カバレッジを収集します。これを行うには、必要に応じて次のオプションを使用して SOAtest 設定ファイル (「設定」を参照) を構成します。

カバレッジを収集およびアップロードするためのテストの実行

設定したテスト コンフィギュレーション ファイルと設定ファイルを使って、コマンドライン モードでテストを実行します (「Configuring SOAtest to Collect and Upload Coverage」を参照)。この手順は自動化プロセスの一部であるべきです。カバレッジ データはテストの実行時に収集され、DTP への公開が有効になっている場合は DTP にアップロードされます。

DTP でのカバレッジの参照

DTP に移動してカバレッジ エクスプローラーを開き、SOAtest のテストで達成されたアプリケーション カバレッジを確認します。  カバレッジ エクスプローラーの使用方法の詳細については、Parasoft DTP ドキュメントを参照してください。