テスト影響分析(TIA)機能は、テスト中のアプリケーションのカバレッジデータを分析し、どのテストがアプリケーションのどのコードをカバーしているかを示すカバレッジレポートを出力します。Maven 用の Selenic プラグインを使用してカバレッジレポートを処理し、アプリケーションの変更によって影響を受けた Selenium テストを洗い出し、それらを実行できます。このセクションの内容:

概要

テスト影響分析は、自動化プロセスの一部として実装することを目的としています。以下の概要では、テスト影響分析を用いるプロセスについて説明しています:

  1. 設定: Selenic に同梱されているカバレッジエージェント(agent.jar)をテスト対象のアプリケーション(AUT) の起動引数に用いるように設定します。Maven 用の Selenic プラグインを使用します。
  2. テストケースの対象に関するデータを収集する: Selenium テストを実行して、カバレッジエージェント(agent.jar)でテスト情報とテストによるコードカバレッジに関するデータを収集します。
  3. ベースラインカバレッジレポートを生成する: TestImpactAnalysis スクリプトを実行して、カバレッジエージェント(agent.jar)で収集したデータを処理し、ベースラインとするカバレッジレポートを作成します。
  4. 変更の影響を受けるテストを実行する: アプリケーションの新しいバージョンが利用可能になったら、それをサーバーにデプロイし、Maven 用の Selenic プラグインを使用して Selenium テストを実行します。実行中にベースライン カバレッジファイルを指定すると、変更の影響を受けるテストのみを実行できます。

テスト影響分析は Java 8 ~ 12 をサポートしています。詳細は システム要件 を参照してください。

設定

テスト影響分析を有効にするには、以下の手順を実行します。

アプリケーションのパッケージ化

テスト対象のアプリケーションをデプロイ可能な .war ファイルにパッケージします。

Maven 用の Selenic プラグインの設定

プラグインをプロジェクトの pom.xml ファイルに追加します。以下の例は、Selenic バージョン 2020.1 の依存関係を追加する方法を示していますが、最新のバージョンを使用する事を推奨します。

<build>
	<plugins>
		<plugin>
			<groupId>com.parasoft.selenic</groupId>
			<artifactId>selenic-maven-plugin</artifactId>
			<version>2020.1.0-SNAPSHOT</version>
		</plugin>
	</plugins>
</build>

selenic-maven-plugin プロファイルとリポジトリを Maven 設定ファイルに追加します。グローバルまたはローカル設定が可能です。デフォルトでは、グローバル settings.xml ファイルは <MAVEN_INSTALL>/conf/ ディレクトリにあります。 ローカル settings.xml ファイルは、<USER_HOME>/.m2 ディレクトリにあります。ローカルファイルが存在しない場合は、settings.xml ファイルをグローバルディレクトリからローカルディレクトリにコピーし、次の <profiles> 要素を <settings> 要素に追加します:

<profiles>
	<profile>
		<id>selenic-maven-plugin</id>
		<activation>
			  <activeByDefault>true</activeByDefault>
		</activation>
		<pluginRepositories>
			<pluginRepository>
				 <id>selenic-local</id>
				 <url>file:/path/to/selenic/test_impact_analysis/integration/maven</url>
			</pluginRepository>
		</pluginRepositories>
	</profile>
</profiles>

TIA_OPTS 環境変数の設定

Maven 用の Selenic プラグインには、テスト影響分析で洗い出したテストの実行で使用するパラメータを Java VM に渡すための環境変数が含まれています(変更の影響を受けるテストの実行 をご参照)。Maven を実行しているマシンに TIA_OPTS 変数を追加し、JVM パラメータを指定します。例えば、以下の設定は、テスト影響分析の実行で使用可能なメモリを 2GB に増やします:

TIA_OPTS=-Xmx2g 

カバレッジエージェントを AUT にアタッチ

Selenic には、変更によって影響を受けるテストを判別するために、必要なカバレッジ情報を生成する Java エージェントが含まれています。
エージェントは、<INSTALL>/test_impact_analysis/integration/coverage ディレクトリに付属しています。それは、同じディレクトリにあるagent.properties ファイルから設定を取得します。agent.jar および agent.properties ファイルを含むカバレッジディレクトリを、テスト対象のアプリケーション(AUT) が実行されているマシンにコピーする必要があります。

カバレッジエージェントの設定

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

カバレッジエージェントを設定するには、agent.properties のプロパティを変更し、プロパティを -javaagent 引数に渡します。 エージェントはいくつかのパラメータをサポートしていますが(カバレッジエージェントのパラメータ を参照)、以下の設定は殆どの場合に適しています:

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

マルチセッションモードの有効化

テストの実行中に複数のユーザーまたはテストプロセスがアプリケーションにアクセスする場合は、マルチセッションモードを有効にするのが効果的です。これは、自動テストによって実行されたコード、他のユーザーによって実行されたコード、またはテストプロセスによって実行されたコードを区別できるようにするためです。マルチセッションモードでは、ユーザーIDは、個別のユーザーまたはプロセスに関連付けられたカバレッジデータに関連付けられます。 ユーザーIDは、実行中に coverageAgentUserID 引数で指定します(詳細については、コマンドライン の coverageAgentUserID をご覧ください)。

以下のオプションを agent.properties ファイルに追加して、マルチセッションモードを有効にします:

jtest.agent.enableMultiuserCoverage=true

詳細については、マルチセッションモードでのテストデータとカバレッジデータの収集 をご覧ください。

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

以下の表は、エージェントに設定可能なすべてのプロパティを示しています:

jtest.agent.associateTestsWithCoverage

特定のテストとカバレッジとの関連付けを有効/無効にします。デフォルト値は false です。

jtest.agent.runtimeData

実行時にエージェントが収集するカバレッジデータを保存するための、アプリケーションサーバー上の場所を指定します。

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.collectTestCoverage 

テストケースのカバレッジ情報の収集を有効/無効にします。デフォルトは false です。

jtest.agent.enableMultiuserCoverage 

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

jtest.agent.serverEnabled

エージェントをアクティブにします。

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

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

便宜上、カバレッジディレクトリには、-javaagent 引数を生成するスクリプトが含まれています。agent.sh または agent.bat スクリプトのいずれかを実行し、その出力値をサーバーの起動スクリプトにコピーします。

$ ./agent.sh 
Add this Java VM args to your process:
---------------------------------------------------
-javaagent:"/home/selenic/test_impact_analysis/integration/coverage/agent.jar"=settings="/home/selenic/test_impact_analysis/integration/coverage/agent.properties",runtimeData="/home/selenic/test_impact_analysis/integration/coverage/runtime_coverage"
---------------------------------------------------
Press any key to continue . . .  

以下の例では、catalina.sh(Linux)または catalina.bat(Windows)スクリプトの先頭に JAVA_OPTS 変数を使用して Tomcat サーバーにエージェントをアタッチしています:

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

エージェントの設定確認

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

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

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

テストとカバレッジデータの収集

Selenic エージェントを使用して Selenium テストを実行します。カバレッジを収集するために、Selenic エージェントをテスト対象のアプリケーション(AUT)とカバレッジエージェントが実行されているホストとポートに接続するように設定する必要があります。サーバーからカバレッジ情報をダウンロードするためのローカルディレクトリも指定する必要があります。

mvn test -DargLine=-javaagent:/path/to/selenic_agent.jar=collectCoverage=true,coverageAgentHost=<host_name>,coverageAgentPort=<port_number>,coverageDir=path/to/save

テストの実行後にカバレッジデータを保存するようにエージェントを設定することもできます。以下の表は、テスト影響分析の使用に関連するすべてのパラメーターを示しています:

collectCoverage 

エージェントがカバレッジを収集できるようにします。

coverageAgentHost 

テスト対象のアプリケーション(.war ファイル)とカバレッジエージェントが実行されているホストを指定します。

デフォルト値: localhost

coverageAgentPort 

カバレッジエージェントのポートを指定します。

デフォルト値: 8050

coverageAgentUserID

マルチセッションモードでカバレッジを収集するときに異なるユーザーを区別できるように、ユーザーIDを指定します。

coverageDir  

サーバーからダウンロードするカバレッジデータのローカルディレクトリを指定します。

deleteCoverageFromServer 

サーバーからカバレッジデータを削除します。

デフォルト値: true

Selenic エージェントのコマンドライン引数の詳細については、コマンドライン の章を参照してください。

マルチセッションでのテストとカバレッジデータの収集

Selenium テストの実行中に複数のユーザーまたはテストプロセスが同時にアプリケーションにアクセスする場合は、マルチセッションモードを有効にします。マルチセッションモードでは、実行中の Selenium テストからの結果を特定できます。マルチセッションモードで実行するには、次のアクションを実行します:

mvn test -DargLine=-javaagent:/path/to/selenic_agent.jar=collectCoverage=true,coverageAgentHost=<host_name>,coverageAgentPort=<port_number>,coverageAgentUserID=<userID>,proxyPort=40090,coverageDir=path/to/save"

ベースラインカバレッジの生成

Selenic には、ベースラインカバレッジレポートを作成するためのスクリプトが含まれています。スクリプトは、Selenium テストの実行によって収集されたカバレッジデータと、テスト対象のアプリケーション(AUT)の WAR ファイルを分析し、レポートを生成します。オペレーティングシステムに応じて、<INSTALL>/test_impact_analysis ディレクトリにある TestImpactAnalysis.bat(Windows)または TestImpactAnalysis.sh(Linux/macOS)スクリプトを実行できます。

変数がまだ設定されていない場合は、.sh スクリプトを変更して一時ディレクトリを指定する必要がある場合があります。例:

#!/bin/bash 
TMP=/tmp


テストの実行が終了したら、次の構文を使用して TestImpactAnalysis.sh または TestImpactAnalysis.bat スクリプトを実行し、カバレッジレポートを生成します。

./TestImpactAnalysis.sh -app <PATH TO AUT WAR FILE> -runtimeCoverage <PATH_TO_RUNTIME_COVERAGE> -outputReport <PATH_TO_OUTPUT_REPORT_DIR> -include <COMMA_SEPARATED_PATTERNS> -exclude <COMMA_SEPARATED_PATTERNS>

コマンド例:

TestImpactAnalysis.bat ^
-app C:\tomcat\webapps\application.war ^
-runtimeCoverage C:\selenic\runtime_coverage ^
-outputReport C:\selenic\reports ^
-include com\myapp\data\**,com\myapp\common\** ^
-exclude com\myapp\transport\**,com\myapp\autogen\** 
./TestImpactAnalysis.sh \
-app /home/tomcat/webapps/application.war \
-runtimeCoverage /home/selenic/runtime_coverage \
-outputReport /home/selenic/reports \
-include com/myapp/data/**,com/myapp/common/** \
-exclude com/myapp/transport/**,com/myapp/autogen/** 

スクリプトが完了すると、-outputReport フラグで指定された場所に coverage.xml レポートが保存されます。フラグが含まれていない場合、ファイルはデフォルトで<USER_HOME>/parasoft/test_impact_analysis/reports/ディレクトリに保存されます。

変更の影響を受けるテストの実行

新しいバージョンのアプリケーションが利用可能になったら、Maven 用の Selenic プラグイン を使用し、カバレッジファイル、デプロイされた WAR ファイル、および Selenic ホームディレクトリへのパスを指定してテストを実行する事で、テスト影響分析によって洗い出されたテストのみを実行できます:

mvn selenic:affected-tests test -Dapp=/path/to/new/parabank.war -DcoverageReport=/path/to/coverage.xml -DselenicHome=/path/to/selenic

TIA_OPTS を使用して設定した JVM 引数も使用されます(TIA_OPT 環境変数の設定 を参照)。