テスト影響分析(TIA)機能は、テスト中のアプリケーションのカバレッジデータを分析し、どのテストがアプリケーションのどのコードをカバーしているかを示すカバレッジレポートを出力します。Maven 用の Selenic プラグインを使用してカバレッジレポートを処理し、アプリケーションの変更によって影響を受けた Selenium テストを洗い出し、それらを実行できます。このセクションの内容:
テスト影響分析は、自動化プロセスの一部として実装することを目的としています。以下の概要では、テスト影響分析を用いるプロセスについて説明しています:
テスト影響分析は Java 8 ~ 12 をサポートしています。詳細は システム要件 を参照してください。 |
テスト影響分析を有効にするには、以下の手順を実行します。
テスト対象のアプリケーションをデプロイ可能な .war ファイルにパッケージします。
プラグインをプロジェクトの 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> |
Maven 用の Selenic プラグインには、テスト影響分析で洗い出したテストの実行で使用するパラメータを Java VM に渡すための環境変数が含まれています(変更の影響を受けるテストの実行 をご参照)。Maven を実行しているマシンに TIA_OPTS
変数を追加し、JVM パラメータを指定します。例えば、以下の設定は、テスト影響分析の実行で使用可能なメモリを 2GB に増やします:
TIA_OPTS=-Xmx2g
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 | 特定のテストとカバレッジとの関連付けを有効/無効にします。デフォルト値は |
---|---|
jtest.agent.runtimeData | 実行時にエージェントが収集するカバレッジデータを保存するための、アプリケーションサーバー上の場所を指定します。 |
jtest.agent.includes | インストルメントするクラスをコンマ区切りで指定するパターンのリスト。次のワイルドカードをサポートしています: * ゼロ個以上の文字に一致します ** 複数のディレクトリレベルに一致 以下の例では、com.myapp.data パッケージのすべてのクラスと、com.myapp.common で始まるパッケージおよびサブパッケージのすべてのクラスをインストルメントします: |
jtest.agent.excludes | インストルメントから除外するクラスをコンマ区切りで指定するパターンのリスト。次のワイルドカードをサポートしています: * ゼロ個以上の文字に一致します ** 複数のディレクトリレベルに一致 |
jtest.agent.autostart | ランタイムデータの自動収集を有効/無効にします。 デフォルトは |
jtest.agent.port | エージェント通信ポートを設定します。デフォルトは |
jtest.agent.debug | コンソールへの詳細出力を有効/無効にします。デフォルトは |
jtest.agent.collectTestCoverage | テストケースのカバレッジ情報の収集を有効/無効にします。デフォルトは |
jtest.agent.enableMultiuserCoverage | 複数のユーザーでのWebアプリケーションカバレッジの収集を有効/無効にします。デフォルトは |
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 ファイル)とカバレッジエージェントが実行されているホストを指定します。 デフォルト値: |
coverageAgentPort | カバレッジエージェントのポートを指定します。 デフォルト値: |
coverageAgentUserID | マルチセッションモードでカバレッジを収集するときに異なるユーザーを区別できるように、ユーザーIDを指定します。 |
coverageDir | サーバーからダウンロードするカバレッジデータのローカルディレクトリを指定します。 |
deleteCoverageFromServer | サーバーからカバレッジデータを削除します。 デフォルト値: |
Selenic エージェントのコマンドライン引数の詳細については、コマンドライン の章を参照してください。
Selenium テストの実行中に複数のユーザーまたはテストプロセスが同時にアプリケーションにアクセスする場合は、マルチセッションモードを有効にします。マルチセッションモードでは、実行中の Selenium テストからの結果を特定できます。マルチセッションモードで実行するには、次のアクションを実行します:
coverageAgentUserID
引数を使用してユーザーIDを指定します。例: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 スクリプトを変更して一時ディレクトリを指定する必要がある場合があります。例:
|
テストの実行が終了したら、次の構文を使用して 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> |
-app
フラグは、デプロイ可能な .war を指定します。自動テストを実行するテスト対象のアプリケーション(AUT)としてデプロイされたものと同じアーティファクトを指定する必要があります(アプリケーションのパッケージ化 を参照)。-runtimeCoverage
フラグは、テストの実行時に -javaagent
引数で設定した coverageDir
パラメータで指定されたディレクトリを指定します(テストとカバレッジデータの収集 を参照)。-outputReport
フラグはオプションであり、カバレッジレポートを出力する場所を指定します。-include
フラグはオプションであり、分析に含めるパターンのカンマ区切りのリストを指定します。デフォルトでは、すべてのテストクラスが含まれます。-exclude
フラグはオプションであり、分析で除外するパターンのカンマ区切りリストを指定します。-include フラグで指定されたパターンに一致するクラスは、除外されたパターンをオーバーライドします。-keepRuntimeCoverage
オプションは、ベースラインカバレッジ XML レポートの生成に使用されるランタイムカバレッジデータファイルを保持する場合に追加します。このパラメータには値を設定しません。コマンドに含まれていない場合、ランタイムカバレッジデータファイルは実行の最後に削除されます。コマンド例:
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 環境変数の設定 を参照)。