このセクションの内容

はじめに

次のチュートリアルでは、Jtest を使用してアプリケーション カバレッジを収集する手順を説明します。サーバーの実行やアプリケーションのデプロイなどの基本的なトピックも説明されているため、ビギナーにも上級ユーザーにも役に立ちます。  

前提条件

Web アプリケーション カバレッジは、Java Agent を利用できる任意のサーバーで収集できます。次の前提条件は、このチュートリアルを実行する場合にだけ必要です。

  • Java JDK 1.8
  • Apache Maven ビルド システム
  • Calculator サンプル。このサンプルは、非常に単純な Web アプリケーションです。サンプルは [INSTALL]/examples ディレクトリにあります。
  • 以下のアプリケーション サーバーのいずれか
    Apache Tomcat (バージョン 6.0、7.0、8.0 でこのシナリオを検証済み)
    - JBoss/WildFly 
    - Oracle WebLogic

ステップ 1: Calculator サンプルの準備

WAR ファイルをビルドします。アプリケーションはサーバー上で WAR ファイル (Web Application Archive) にパッケージ化する必要があります。Jtest に付属の maven-war-plugin を使用してアプリケーションをパッケージ化します。プラグインは自動的に適切な WAR 構造を持ったアプリケーションをビルドします。アプリケーション ディレクトリで次のコマンドを実行します。

mvnw clean install

ステップ 2: アプリケーション サーバーにサンプルをデプロイする

アプリケーション サーバーにアプリケーションをデプロイします。Calculator サンプルをアプリケーション サーバーにデプロイする方法については、「Tomcatアプリケーション サーバーにデプロイする」、「WildFly/JBoss アプリケーション サーバーにサンプルをデプロイする」、「Oracle WebLogic Server にサンプルをデプロイする」を参照してください。

Tomcatアプリケーション サーバーにデプロイする

アプリケーション サーバーへのデプロイにはさまざまな方法がありますが、このチュートリアルでは、Tomcat Webアプリケーションマネージャを使用してリモートからデプロイする方法を説明します。 

  1. [Apache Tomcat インストール ディレクトリ]/conf/tomcat-users.xml を開いて <tomcat-users> セクションに次の行を追加することで、新しいユーザーを追加します。 

    <user username="tomcat" password="tomcat" roles="tomcat, manager-gui"/>
  2.  次のコマンドを実行してサーバーを実行します。
    Windows

    [Your apache-tomcat installation directory]/bin/startup.bat

    Linux

    [Your apache-tomcat installation directory]/bin/startup.sh
  3. ブラウザーで次の URL を開き、ステップ 1 で設定したユーザー名およびパスワード (tomcat/tomcat) を入力します。

    http://localhost:8080/manager/html
  4. [WAR ファイルの配備] セクションで [ファイルを選択] をクリックし、Calculator.war を参照します。
  5. [配備] をクリックします。次の URL でアプリケーションを使用できるようになります。

    http://localhost:8080/calculator
  6. アプリケーションを操作して正しくデプロイされたことを確認します。

WildFly/JBoss アプリケーション サーバーにサンプルをデプロイする

アプリケーション サーバーへのデプロイにはさまざまな方法がありますが、このチュートリアルでは、JBoss Web コンソールを使用してデプロイする方法を説明します。この手順は JBoss AS 7.1.1 および WildFly 8.2-11.0 サーバーに適用できます。

  1. Windows で add-user スクリプトを実行し、新しいユーザーを追加します。

    [JBoss installation directory]/bin/add-user.bat
  2. ユーザーのタイプを選択するよう求められたら、Management User を選択します。

    What type of user do you wish to add?
     a) Management User (mgmt-users.properties)
     b) Application User (application-users.properties)
    (a): a
  3. 入力を求められたら、ユーザー名およびパスワードを入力し、Realm フィールドは空のままにします。

    Enter the details of the new user to add.
    Realm (ManagementRealm) :
    Username : admin
    Password : 1adm-adm-adm
  4. 次のスクリプトを実行してサーバーを実行します。  

    [JBoss installation directory]/bin/standalone.bat
  5. ブラウザーで次の URL を開き、ステップ 3 で設定したユーザー名およびパスワード (admin/1adm-adm-adm) を入力します。

    http://localhost:9990/console/App.html#deployments
  6. [Add] をクリックし (JBoss 7.1.1 の場合は [Add Content])、Calculator.war ファイルを参照します。
  7. [Next] をクリックし、[Save] をクリックします。
  8. デプロイメント リストで Calculator.war を有効化し、ブラウザーで次の URL を開きます。  

    http://localhost:8080/Calculator
  9. アプリケーションを操作して正しくデプロイされたことを確認します。

WildFly/JBoss アプリケーション サーバーにホスト/ドメイン モードでサンプルをデプロイする

次の手順は単一の WildFly インスタンスを使用してホスト/ドメイン モードで動作する WildFly のセット アップ方法を示しています。両方のホスト (プライマリおよびセカンダリ) を同一のインストールから起動できます。この手順は JBoss AS 7.1.1 および WildFly 8.2-11.0 サーバーに適用できます。

  1. 次のコマンドを admin (管理者ロール) ユーザーで実行します。
    ./add-user.sh
  2. セカンダリ ホストを構成します。domain/configuration/host-slave.xml ファイルを編集します。
    • 管理ポートを '19999' に変更します。
      <management-interfaces>
      	<native-interface security-realm="ManagementRealm">
      		<socket interface="management" port="${jboss.management.native.port:19999}"/>
      	</native-interface>
      </management-interfaces>
    • 'main-server-group' に 'auto-start' オプションを追加します。
      <server name="server-one" group="main-server-group" auto-start="true"/>
  3. ドメイン コントローラー (プライマリ ホスト) を起動します。
    ./domain.sh --host-config=host-master.xml
  4. 別のコンソールでセカンダリ ホストを起動します。
    ./domain.sh --host-config=host-slave.xml -Djboss.domain.master.address=127.0.0.1
  5. 次のどちらかの方法でアプリケーションをデプロイします。
    • 次のコマンドを実行します。
      deploy /path/to/calculator.war --server-groups=main-server-group
    • Administration Console (http://localhost:9990/console/App.html#domain-deployments) を開き、アプリケーションをデプロイして 'main-server-group' に割り当てます。
  6. 次を参照してアプリケーションが実行されていることを確認します: http://localhost:8080/Calculator/

Oracle WebLogic Server にサンプルをデプロイする

WebLogic アプリケーション サーバーにデプロイする方法は色々ありますが、このチュートリアルでは管理コンソールを使ってリモートでデプロイする方法を説明します。この操作はバージョン 12.2.1 および 10.3.6 で検証済みです。

このチュートリアルは、WebLogic Server がインストール済みであること、およびサーバー ドメインが作成済みであることを前提とします。

  1. 管理コンソールに移動します (http://localhost:7001/console)。
  2. [ドメイン構成] パネル メニューで、[デプロイメント] をクリックして [デプロイメントのサマリー] セクションを開きます。
  3. [デプロイメント] の表で [インストール] ボタンをクリックします。
  4. [パス] フィールドで、WAR ファイルへのパスを指定します。
  5. [次] をクリックします。
  6. [このデプロイメントをアプリケーションとしてインストールする] オプションを選択します。
  7. [次] をクリックします。
  8. [終了] をクリックします。
  9. アプリケーションとやり取りしてその機能をテストします (http://localhost:7001/Calculator)。

ステップ 3: メタデータ ファイルの準備

サンプル アプリケーションのメイン ディレクトリで、次のコマンドを実行します。

mvnw package jtest:monitor

ゴールはアプリケーション カバレッジの収集に必要な成果物を含む .zip パッケージを生成します。  

ステップ 4: javaagent VM 引数の生成

monitor.zip パッケージの内容をサーバー マシンに展開し、agent.bat (Windows) または agent.sh (Linux) スクリプトを実行します。javaagent フラグが生成され、コンソールに出力されます。 

以下は javaagent フラグの出力例です。

-javaagent:"E:\Parasoft\JTest\examples\calculator\target\jtest\monitor\monitor\agent.jar"=settings="E:\Parasoft\JTest\examples\calculator\target\jtest\monitor\monitor\agent.properties",runtimeData="E:\Parasoft\JTest\examples\calculator\target\jtest\monitor\monitor\runtime_coverage"

すでに OpenTelemetry Java エージェントが設定されており、プロジェクトにアタッチされている場合、jtest.agent.autoloadMultiuserLibs プロパティを無効化する必要があります。また、Jtest 拡張へのパスを設定する必要があります。 

-Dotel.javaagent.extensions=path_to/jtest-otel-ext.jar

ステップ 5: アプリケーション サーバーからの実行時データの収集

アプリケーション サーバー から実行時データを収集します。(Tomcat、WildFly/JBos または Oracle WebLogic)

Apache Tomcat からの実行時データの収集

  1. スクリプト ファイルを開きます。Windows

    [Your apache-tomcat installation directory]/bin/catalina.bat

    Linux

    [Your apache-tomcat installation directory]/bin/catalina.sh
  2. スクリプトの先頭に javaagent フラグを追加します。

    Windows

    if "%1"=="stop" goto skip_instrumentation
    set JAVA_OPTS=%JAVA_OPTS% [generated javaagent flag]
    :skip_instrumentation

    Linux

    if [ "$1" = "start" -o "$1" = "run" ]; then
    export JAVA_OPTS="$JAVA_OPTS [generated javaagent flag]"
    fi

    -javaagent フラグは 1 行で記述します (分割できません)。

  3. サーバーを再起動し、ブラウザーで次の URL を開きます。

    http://localhost:8080/Calculator
  4. アプリケーションを操作してサーバーを停止します。

Jtest Agent は、mvn package jtest:monitor ゴールが生成した -javaagent フラグの runtimeData プロパティに従って実行時データを書き込みます。デフォルトでは、実行時データは [path to monitor dir]/monitor/runtime_coverage ディレクトリに書き込まれます。

JBoss および WildFly からの実行時データの収集

標準的な Java 階層クラス ローダーは、J2EE サーバーには適していません。なぜなら、JAR ファイルが使用されるかどうかにかかわらず、常にロードされるからです。アプリケーションは JAR ファイルを必要になったときにロードすることはできません。さらに、JAR ファイル間の可視性を制限するための適切なソリューションがありません。これによって、1 つのライブラリの 2 つのバージョンの間で競合が生じることがよくあります。また、すべてを含む巨大なクラス ローダーが作成される原因にもなります。 

JBoss および WildFly サーバーは、これらの課題を解決するために JBoss モジュールを使用します。モジュール化された非階層的クラス ロードの実装は、JBoss OSGi および JBoss Java EE 実装の基本でもあります。 

しかし、このクラス ローダーの優位性は、サーバーからの実行時データの収集という点では、新たな問題を引き起こします。Jtest Agent ライブラリはアプリケーション クラスから参照できなければなりませんが、JBoss モジュールによってそれが不可能になるのです。これが -javaagent フラグを追加する理由です。このフラグを追加していない場合、ClassNotFoundException が返されます。 

JBoss AS 7.1/WildFly 8.2-11.0

  1. agent.properties ファイルに次の設定を追加し、Jtest カバレッジ エージェントの JBoss 互換モードを有効化します。
    jtest.agent.jbossCompatibilityMode=true
  2. 起動スクリプトに -javaagent フラグを追加します。

    Windows
    a) [Your jboss installation directory]/bin/standalone.conf.bat を開き、ファイルの最後にある JAVA_OPTS に javaagent フラグを追加します。

    set "JAVA_OPTS=%JAVA_OPTS% [generated javaagent flag]"

    - ":JAVA_OPTS_SET" はファイルの最後の行のままにします。

    - -javaagent フラグは 1 行で記述します (分割してはいけません)。

    - Java 7 で動作するサーバーの場合、JAVA_OPTS に -XX:-UseSplitVerifier フラグを追加します。

    b) standalone.bat スクリプトを使用してサーバーを再起動します。

    Linux

    a) [Your jboss installation directory]/bin/standalone.conf を開き、ファイルの最後にある JAVA_OPTS に javaagent フラグを追加します。

    "JAVA_OPTS=$JAVA_OPTS [generated javaagent flag]"

    - -javaagent フラグは 1 行で記述します (分割してはいけません)。

    - Java 7 で動作するサーバーの場合、JAVA_OPTS に -XX:-UseSplitVerifier フラグを追加します。

    b) standalone.sh スクリプトを使用してサーバーを再起動します。

  3. Web ブラウザーで次の URL を開きます。  

    http://localhost:8080/Calculator/
  4. アプリケーションを操作してサーバーを停止します。

Jtest Agent は Jtest の target 内の maven ディレクトリ (target/jtest) に runtimeData.data ファイルを作成します。

JBoss AS 7.1/WildFly 8.2-11.0 - ホスト/ドメイン モード

  1. agent.properties ファイルに次の設定を追加し、Jtest カバレッジ エージェントの JBoss 互換モードを有効化します。
    jtest.agent.jbossCompatibilityMode=true
  2. [Your JBoss/Wildfly installation directory]/domain/configuration/domain.xml ファイルを開きます。このファイルでサーバー グループの定義を探し、カバレッジ エージェントを追加してグループに <jvm-options> を追加します。
    次の例では、"main-server-group" という名前のサーバー グループに agent.jar が追加されています。
    <server-group name="main-server-group" profile="full">
        <jvm name="default">
            <heap size="64m" max-size="512m"/>
            <jvm-options>
                <option value="-javaagent:monitor/agent.jar=settings=monitor/agent.properties,runtimeData=monitor/runtime_coverage"/>
            </jvm-options>
        </jvm>
        <!-- the rest of server-group definition -->
    </server-group>

Oracle WebLogic Server からの実行時データの収集

  1. スクリプト ファイルを開きます。
    Windows

    [Your weblogic installation directory]/user_projects/domains/[your domain]bin/startWebLogic.cmd

    Linux

    [Your weblogic installation directory]/user_projects/domains/[your domain]bin/startWebLogic.sh
  2. START WEBLOGIC コメントで始まるセクションで、JAVA_OPTIONS に -javaagent フラグを追加します。-javaagent フラグは 1 行で記述します (分割できません)。
    Windows

    @REM START WEBLOGIC
    set JAVA_OPTIONS=%JAVA_OPTIONS% [generated javaagent flag]

    Linux

    # START WEBLOGIC
    export JAVA_OPTIONS=$JAVA_OPTIONS [generated javaagent flag]
  3. サーバーを再起動し、ブラウザーで次の URL を開きます。 

    http://localhost:7001/Calculator
  4. アプリケーションを操作します。
  5. サーバーを停止します。

Jtest Agent は、mvn package jtest:monitor ゴールが生成した -javaagent フラグの runtimeData プロパティに従って実行時データを書き込みます。デフォルトでは、実行時データは [path to monitor dir]/monitor/runtime_coverage ディレクトリに書き込まれます。

ステップ 6: カバレッジ レポートの生成 

Calculate Application Coverage テスト コンフィギュレーションを実行します。-static および -runtime パラメーターを使って、static_coverage.xml ファイルと実行時カバレッジ データのディレクトリを渡します。

java -jar jtestcov.jar -static [path to static_coverage.xml file] -runtime [path/dir] 

static_coverage.xml ファイルへのパスは、このファイルを含む monitor.zip パッケージの内容を展開したディレクトリでなければなりません。

runtime_coverage ディレクトリへのパスは、-javaagent VM 引数の runtimeData プロパティとしてコンソールに出力されます。

  • No labels