Maven+Jacoco+GlassFishでGUI操作のカバレッジを測定する

Tomcatの記事はいくつかあったのですが、GlassFishの記事がなかったのでメモしておきます。

※この記事ではMavenの使い方については言及しません。

## Jacoco

JacocoはJavaのコードカバレッジを取得するライブラリです。

大雑把な仕組みはJVM起動時にjacocoのjavaagentをオプションとして指定することにより、コードの実行状況をファイル出力し、その実行状況ファイルを分析することによりカバレッジレポートを出力する仕組みです。

よって、GlassFish起動時にJVMオプションとしてjacoco javaagentを渡すことができればカバレッジを取得することができます。

## JVMオプション引数の準備

まずGlassFish起動時に渡すJVMオプション引数を準備します。
jacoco-maven-pluginを設定します。
POM.xmlのサンプルは下記のような感じです。
${jacoco.datafile}には実行ファイルの出力先パスを設定して下さい。
${jacoco.include.package}には実行ファイルに含めるパッケージ名を設定して下さい。
（ワイルドカード使用可。階層区切りはスラッシュ。jp/co/** など）

```xml


			<plugin>
				<groupId>org.jacoco</groupId>
				<artifactId>jacoco-maven-plugin</artifactId>
				<version>0.8.5</version>
				<executions>
					<execution>
						<!-- JVMに渡す引数を用意する -->
						<id>prepare-agent</id>
						<goals>
							<goal>prepare-agent</goal>
						</goals>
						<configuration>
							<propertyName>jacocoArgs</propertyName>
							<includes>
								<include>${jacoco.include.package}</include>
							</includes>
							<destFile>${jacoco.datafile}</destFile>
						</configuration>
					</execution>
					<execution>
						<!-- 実行結果ファイルを読んでレポートを生成する -->
						<id>default-report</id>
						<goals>
							<goal>report</goal>
						</goals>
						<configuration>
							<dataFile>${jacoco.datafile}</dataFile>
							<includes>
								<include>${jacoco.include.package}</include>
							</includes>
						</configuration>
					</execution>
					<execution>
						<!-- マージした実行結果ファイルを読んでレポートを生成する -->
						<id>merged-report</id>
						<phase>none</phase>
						<goals>
							<goal>report</goal>
						</goals>
						<configuration>
							<dataFile>${project.build.directory}/merged.exec</dataFile>
							<includes>
								<include>${jacoco.include.package}</include>
							</includes>
							<outputDirectory>${project.reporting.outputDirectory}/jacoco_merged</outputDirectory>
						</configuration>
					</execution>
					<execution>
						<!-- 複数の実行結果ファイルをマージする -->
						<id>merge-results</id>
						<phase>none</phase>
						<goals>
							<goal>merge</goal>
						</goals>
						<configuration>
							<fileSets>
								<fileSet>
									<directory>${project.build.directory}</directory>
									<includes>
										<include>*.exec</include>
									</includes>
								</fileSet>
							</fileSets>
							<destFile>${project.build.directory}/merged.exec</destFile>
						</configuration>
					</execution>
				</executions>
			</plugin>

```

これで

```
mvn jacoco:prepare-agent@prepare-agent
```
を実行すると、コンソールログにjvm引数が表示されます。
-javaagent:
で始まるやつです。
これをコピーしてどこかに保管しておきます。

## GlassFishのJVMオプション設定
さて、GlassFishのJVMオプションはどこで設定するかというと
glassfish\domains\ドメイン名\config\domain.xml
の中に設定があります。

<server-config>の<jvm-options>が並んでいるあたりに<jvm-options>で囲って先ほど保管した引数を追加します。

```xml

<server-config>
...
    <java-config>
    ...
      <jvm-options>-javaagent: ... </jvm-options>
    </java-config>
...
</server-config>

```

これを追加した上でGlassFishを起動してWebアプリの操作を行うと、実行状況ファイルがJVMオプション引数で指定したパスに出力されます。

注意点としては、GlassFishをコマンドで正常終了させないと実行状況が出力されません。

```
asadmin stop-domain
```

で停止させて下さい。


## カバレッジレポート作成

上記のPOMのサンプル通りに設定すると

```
mvn jacoco:report@default-report
```

でレポートが作成できます。