はじめに

メインのプロジェクト ディレクトリで Jtest の Maven 用ゴールを実行することで、解析やテストを実行できます。まだプロジェクトを一度もビルドしていない場合や、外部のプロジェクト依存関係が利用可能かどうかを確認する必要がある場合、またはマルチモジュール プロジェクトをテストする場合を除いて、解析の前に必ずテスト対象プロジェクトをビルドする必要はありません。マルチモジュール プロジェクトの場合は、Jtest がローカル リポジトリの成果物を使用できるよう、解析を実行する前にコンパイルすることを推奨します。すると、コードのテストおよび解析にかかる時間を短くできます。

アグリゲータである Jtest Plugin for Maven は、ビルド中に 1 回だけ実行される必要があります。

静的解析の実行

コードに対して静的解析を実行するには、次の操作を行います。

  1. Jtest Plugin for Maven がセットアップ済みであることを確認します (「Jtest Plugin for Maven の設定」を参照)。
  2. jtest:jtest ゴールを実行します。コマンドは次のようになります。

    mvn jtest:jtest
  3. 解析結果を参照します (「結果の参照」を参照)。

    デフォルトでは、テスト ソースは解析から除外されます。テスト コードを解析するには、excludeTestSources オプションをオフにします。「Maven 用 Jtest ゴール リファレンス」を参照してください。

  4. 解析対象スコープに影響を与えるプラグインによってビルドを拡張している場合 (たとえば generate-resources フェーズでリソース ファイルを追加または変更している場合など)、Jtest が完全なプロジェクト データを収集できるようにすべてのフェーズを実行するか、下記のように jtest:jtest の前に test-compile フェーズを実行できます。 

    mvn test-compile jtest:jtest

単体テスト テストの実行とカバレッジの収集

Jtest レポートに単体テストの結果を含めるには、jtest:jtest ゴールと jtest:agent ゴール、および単体テスト用のビルトイン テスト コンフィギュレーション Unit Tests を使用してテストを実行します。

  1. Jtest Plugin for Maven がセットアップ済みであることを確認します (「Jtest Plugin for Maven の設定」を参照)。
  2. Maven で jtest:agent および jtest:jtestゴールを実行します。jtest:agent ゴールの実行前にテストおよびクラスがコンパイルされている必要があります。  コマンドは次のようになります。

    mvn clean test-compile jtest:agent test jtest:jtest -Djtest.config="builtin://Unit Tests"

デフォルトでは、Jtest は実行されたテストのカバレッジ データを収集します。カバレッジの収集を無効化するには、jtest.coverage.skip オプションを有効にします (詳細は「Maven 用 Jtest ゴール リファレンス」を参照)。

クラスがコンパイルされる前に jtest:agent ゴールを実行すると、カバレッジが空になる場合があります。Tycho plugins や他のデフォルトのライフサイクルには含まれないプラグインを使用する場合、専用の (デフォルトではない) コンパイラを呼び出し、クラスが適切にコンパイルされ、カバレッジ情報が収集されるようにします。コマンドは次のようになります。

mvn clean tycho-compiler:compile jtest:agent verify jtest:jtest -Djtest.config="builtin://Unit Tests"

(info) org.junit.Assume (JUnit 4) または org.junit.jupiter.api.Assumptions (JUnit 5) クラスからメソッドを呼び出してテストをスキップすると、Jtest はメソッドが呼び出される前に実行されたコード行のカバレッジを収集します。テストが JUnit 4 ランナーで実行された場合、このカバレッジ情報はカバレッジ レポートのどのテストにも関連付けられません。

Jtest は、-T オプションで有効化された Maven のパラレル ビルドのテスト カバレッジを収集します。詳細については、https://cwiki.apache.org/confluence/display/MAVEN/Parallel+builds+in+Maven+3 を参照してください。例:

mvn -T 1C clean test-compile jtest:agent test jtest:jtest -Djtest.config="builtin://Unit Tests"

Jtest は Surefire パラレル テスト実行のカバレッジ収集をサポートしていますが、カバレッジは実行された各テストと正確に一致していない場合があります。

jtest:agent ゴール

jtest:agent ゴールは、ビルド モジュールに基づいて Jtest エージェント設定を生成し、 initialize フェーズで agentPropertyNames パラメーターによって指定されたプロパティ ファイルの javaagent VM 引数を設定します。

デフォルトでは、特定のプロパティによって maven-surefire-plugin および eclipse-test-pluginjavaagent VmArg をインジェクトします。

Maven テスト プラグインで jtest:agent ゴールを使用するための前提条件は以下のとおりです。

  • テストはフォークされたプロセスで実行する必要があります (forkCountforkMode などのパラメーターで)
  • 追加の VmArgs には、Jtest Java agent VmArgs (argLine パラメーター) が含まれていなければなりません。

jtest:agent ゴールは、(argLine および tycho.testArgLine によるデフォルト値から) VmArgs パラメーター プロパティをセットアップすることで Maven テスト プラグイン (maven-surefire-plugin および tycho-surefire-plugin) を自動的に設定します。これらのパラメーターのデフォルト値を変更する必要がある場合は、以下のいずれかの方法で変更します。

  • デフォルト プロパティを使用します。jtest:agent ゴールは Jtest の javaagent VmArg を使用してプロパティを拡張します。

    <project>
      <!-- ... -->
      <properties>
        <!-- argLine property which will be extended by jtest:agent goal --->
        <argLine>-Xmx=1024m -XX:MaxPermSize=256m</argLine>
      </properties>
      <!-- ... -->
      <build>
        <plugins><!-- or pluginManagement -->
          <plugin>
            <artifactId>maven-surefire-plugin</artifactId>
    		<configuration>
              <forkCount>1</forkCount>
              <!-- do not configure argLine parameter here -->
            </configuration>
          </plugin>
        </plugin>
      </build>
    </project>
  • インジェクトされたカスタム プロパティによるパラメーター値を使用します。

    <project>
      <!-- ... -->
      <build>
        <plugins>
          <plugin>
            <groupId>com.parasoft.jtest</groupId>
            <artifactId>jtest-maven-plugin</artifactId>
            <version>2020.1.0</version>
    		<configuration>
              <!-- jtest:agent goal will set Jtest Java agent VmArg into properties below --> 
              <agentPropertyNames>jtest.argLine</agentPropertyNames>
              <!-- optional coverage block with parameters identical as in offline coverage -->
              <coverage>
                <!-- ... -->
              </coverage> 
            </configuration>
          </plugin>
          <plugin>
            <artifactId>maven-surefire-plugin</artifactId>
            <configuration>
                <argLine>${jtest.argLine} -Xmx=1024m -XX:MaxPermSize=256m</argLine>
            </configuration>
          </plugin>
        </plugin>
      </build>
    </project>

Tycho ビルドのテストの実行とカバレッジの収集

Jtest は、Tycho ビルドで JUnit 4 のテストを実行し、カバレッジを収集できます。ただし、OSGi の制限制限事項により、tycho-surefire-plugin で実行されたテストのカバレッジを収集するには、tycho-surefire の設定を拡張する必要があります。

  1. Jtest の [INSTALL_DIR]/integration/coverage にある runtime.jar ファイルを以下のいずれかの場所にデプロイします。

    - Maven リポジトリコマンドは次のようになります。

    mvn deploy:deploy-file -Dfile=C:\parasoft\jtest\integration\coverage\runtime.jar -DrepositoryId=REPOSITORY_ID -Durl=REPOSITORY_URL -DartifactId=runtime-jtest -DgroupId=com.parasoft.jtest -Dversion=2020.1.0

    - ローカル Maven リポジトリコマンドは次のようになります。

    mvn install:install-file -Dfile=<C:\parasoft\jtest\integration\coverage\runtime.jar -DgroupId=com.parasoft.jtest -DartifactId=runtime-jtest -Dversion=2020.1.0 -Dpackaging=jar
  2.  Tycho-surefire の設定を拡張し、デプロイされたファイルをフレームワークの拡張として追加します。設定は次のようになります。

    <plugin>
        <groupId>org.eclipse.tycho</groupId>
        <artifactId>tycho-surefire-plugin</artifactId>
        <version>${tycho-version}</version>
            <configuration>
                <frameworkExtensions>
                    <frameworkExtension>
                        <groupId>com.parasoft.jtest</groupId>
                        <artifactId>runtime-jtest</artifactId>
                        <version>2020.1.0</version>
                    </frameworkExtension>
                </frameworkExtensions>
              ...
    </plugin>

あるいは、カバレッジ情報を収集せずにテストを実行する場合は、jtestcli.properties 設定ファイルに以下のオプションを追加することで、非推奨の XML 処理メカニズムを使用してテスト結果を取得するよう Jtest を設定できます。

jtest.unittest.xml.results.processing.enabled=true

こうすると、Jtest レポートに Tycho ビルドのテスト結果を含めることができます。カバレッジデータは含まれません。

非推奨の XML 処理メカニズムを有効にすると、テスト実行が遅くなる可能性があることに注意してください。

アプリケーション カバレッジの収集

Jtest のカバレッジ エージェントを使用すると、実行中のアプリケーションでの手動テストまたは自動テスト実行時にカバレッジ データを収集できます。Jtest でのアプリケーション カバレッジの収集については「アプリケーション カバレッジ」を参照してください。

テスト影響分析

はじめに

Jtest Plugin for Maven の機能を拡張してテスト影響分析を使用することができます。テスト影響分析を行うと、変更の影響を受けるテストだけを識別して再実行できるため、影響を受けない多数のテストを実行するのに必要な時間や手間を省くことができます。プロジェクトのテスト影響分析を行うには、以下が必要です。

  1. Jtest に付属のテスト影響分析プラグイン (tia-maven-plugin) を Maven ビルドに追加します。
  2. プラグインを設定します。
  3. affected-tests ゴールを実行します。

前提条件

  • Jtest 10.4.1 以上
  • Apache Maven 2.2.1 以上 (バージョン 3.3.1 および 3.3.3 はサポートされていません)
  • Surefire 2.19.1 以上
  • JUnit 4 または 5

(info) Jtest Plugin for Maven が Jtest に付属の Maven リポジトリにアクセスできるよう設定されている必要があります (「初期セットアップ」を参照)。

(tick) テスト影響分析を実行するには、さらにメモリが必要になります。Maven ビルドに割り当てるメモリを増やすことを推奨します。

Test Impact Analysis Plugin との統合

POM ファイルのプラグインのリストに tia-maven-plugin を追加することで、テスト影響分析プラグインと統合できます。

pom.xml
<build>
    <plugins>
        <plugin>
            <groupId>com.parasoft.jtest.tia</groupId>
            <artifactId>tia-maven-plugin</artifactId>
            <version>2020.1.0</version>
        </plugin>
    </plugins>
</build>

プラグインの設定

tia-maven-plugin を設定することで、POM ファイルまたはコマンド ラインからプロジェクトのテスト影響分析をカスタマイズできます。最低でも、実行時に Jtest が生成する以下のファイルへのパスを指定する必要があります。

  • coverage.xml  

  • report.xml

1 つまたはそれ以上のテストがテスト対象ソース コードとは別のプロジェクトにある場合、すべての影響を受けるテストが再実行されるようにするには、coverage.xml ファイルへの絶対パスを指定する必要があります。

利用可能なオプションの一覧については「Maven 用 Jtest ゴール リファレンス」を参照してください。

POM ファイルでの設定

POM ファイルでプラグインを設定するには、以下に tia-maven-plugin プロパティを追加します。

  • プラグインの宣言

    pom.xml
    <plugin>
        <groupId>com.parasoft.jtest.tia</groupId>
        <artifactId>tia-maven-plugin</artifactId>
        <version>2020.1.0</version>
        <configuration>
            <referenceCoverageFile>target/jtest/coverage.xml</referenceCoverageFile>
            <referenceReportFile>target/jtest/report.xml</referenceReportFile>
            <runFailedTests>false</runFailedTests>
            <runModifiedTests>true</runModifiedTests>
            <jtestHome>${jtest.home}</jtestHome>
            <settings>jtestcli.properties</settings>
        </configuration>
    </plugin>
  • プラグインの実行

    pom.xml
    <plugin>
        <groupId>com.parasoft.jtest.tia</groupId>
        <artifactId>tia-maven-plugin</artifactId>
        <version>2020.1.0</version>
        <executions>
            <execution>
                <goals>
                    <goal>affected-tests</goal>
                </goals>
                <configuration>
                    <referenceCoverageFile>target/jtest/coverage.xml</referenceCoverageFile>
                    <referenceReportFile>target/jtest/report.xml</referenceReportFile>
                    <runFailedTests>false</runFailedTests>
                    <runModifiedTests>true</runModifiedTests>
                    <jtestHome>${jtest.home}</jtestHome>
                    <settings>jtestcli.properties</settings>
                </configuration>
            </execution>
        </executions>
    </plugin>
  • Maven プロパティ

    pom.xml
    <properties>
        <jtest.referenceCoverageFile>target/jtest/coverage.xml</jtest.referenceCoverageFile>
        <jtest.referenceReportFile>target/jtest/report.xml</jtest.referenceReportFile>
        <jtest.runFailedTests>false</jtest.runFailedTests>
        <jtest.runModifiedTests>true</jtest.runModifiedTests>
        <jtest.home>${env.JTEST_HOME}</jtest.home>
        <jtest.settings>jtestcli.properties</jtest.settings>
    </properties>

コマンド ラインでの設定

コマンド ラインでテスト影響分析をカスタマイズするには、-D スイッチを使用して tia-maven-plugin プロパティを渡します。プロパティには "jtest" 接頭辞を付ける必要があります (詳細は「Maven 用 Jtest ゴール リファレンス」を参照)。コマンドは次のようになります。

コマンド ライン
mvn tia:affected-tests test -Djtest.referenceCoverageFile=target/jtest/coverage.xml -Djtest.referenceReportFile=target/jtest/report.xml -Djtest.runFailedTests=false -Djtest.runModifiedTests=true -Djtest.home=$JTEST_HOME -Djtest.settings=jtestcli.properties 

affected-tests ゴールの設定と実行

コマンド ラインから、または POM ファイルのゴールを設定することで、affected-tests ゴールの実行を設定できます。

コマンド ラインでの設定

Maven ビルド ファイルに tia-maven-plugin が含まれている場合 (「 Test Impact Analysis Plugin との統合」を参照)、コマンド ラインから tia:affected-tests ゴールを実行できます。必ず test ゴールの前に実行します。

コマンド ライン
mvn tia:affected-tests test

POM ファイルでの設定

ビルド プラグインまたはプロファイルのビルド プラグインで affected-tests ゴールの実行を設定できます。

  • ビルド プラグインに affected-tests ゴールを含める場合

    pom.xml
    <build>
        <plugins>
            <plugin>
                <groupId>com.parasoft.jtest.tia</groupId>
                <artifactId>tia-maven-plugin</artifactId>
                <version>2020.1.0</version>
                <executions>
                    <execution>
                        <goals>
                            <goal>affected-tests</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

    ゴールは Maven test ゴールとともに自動的に実行されます。

    コマンド ライン
    mvn test
  • プロファイルのビルド プラグインに affected-tests ゴールを含める場合

    pom.xml
    <profile>
        <id>tia</id>
        <build>
            <plugins>
                <plugin>
                    <groupId>com.parasoft.jtest.tia</groupId>
                    <artifactId>tia-maven-plugin</artifactId>
                    <version>2020.1.0</version>
                    <executions>
                        <execution>
                            <goals>
                                <goal>affected-tests</goal>
                            </goals>
                        </execution>
                    </executions>
                </plugin>
            </plugins>
        </build>
    </profile>

    プロファイルを使用して Maven test ゴールを実行する必要があります。

    コマンド ライン
    mvn test -P tia

テスト スイートの再実行

テスト影響分析は、テスト スイート内の少なくとも 1 つのテストがコードの変更の影響を受ける場合、テスト スイート全体を再実行します。そのため、影響を受けるテストと同じテスト スイートに含まれている場合、影響を受けないテストも実行される場合があることに注意してください。

ネストされたテストの再実行

デフォルトでは、Maven surefire プラグインはネストされたテストを再実行できません。Maven でテスト影響分析を実行したとき、ネストされたテストが再実行されるようにするには、Maven surefire プラグインの設定に <include></include> および <exclude></exclude> 要素を追加します。例:

 <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>2.22.2</version>
            </plugin>
        </plugins>
        <pluginManagement>
            <plugins>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-surefire-plugin</artifactId>
                    <configuration>
                        <testFailureIgnore>true</testFailureIgnore>
                        <includes>
                            <include></include>
                        </includes>
                        <excludes>
                            <exclude></exclude>
                        </excludes>
                    </configuration>
                </plugin>
            </plugins>
        </pluginManagement>
    </build>

再実行するテストを手動でフィルタリングする

テスト影響分析は、Surefire のデフォルトのインクルード/エクスクルード メカニズムのほか、現在の POM ファイルで設定されたカスタム インクルードおよびエクスクルードに依存しています。まれに、テスト影響分析がインクルードまたはエクスクルード パターンを認識できない場合があります。その結果、パターンに一致する影響を受けるテストを再実行できなかったり、コードの変更の影響を受けないテストが再実行されることがあります。

回避策として、-Dparasoft.testFilter オプションを使用して、コマンド ラインでファイル パターンを指定できます。コマンドは次のようになります。

mvn tia:affected-tests test -Djtest.referenceCoverageFile=target/jtest/coverage.xml -Djtest.referenceReportFile=target/jtest/report.xml -Djtest.settings=jtestcli.properties -Djtest.testFilter="**/*Test.java, !**/ProblemTest.java"

Jtest のテスト影響分析では、Surefire の -Dtest ビルトイン オプションはサポートされていないことに注意してください。-Dtest オプションを使用すると、POM ファイルやコマンド ラインでテスト影響分析用に指定されたインクルードおよびエクスクルード設定が上書きされます。


  • No labels