コードカバレッジは、開発プロセス中によく使用されるソフトウェア品質指標であり、テストされた(または実行された)コードの範囲を特定するために使用されます。最適なコードカバレッジを達成するためには、テスト実装(またはテストスイート)が実装されたコードの大部分をテストすることが重要です。
Java、C#、JavaScriptなどの言語用には多数のコードカバレッジツールがあります。最も適したコードカバレッジツールを使用することは、テストされたコードの割合を理解し、理想的なコードカバレッジを達成するために適切なアクションを講じることを保証するために重要です。
最適なコードテストのために、多くの企業は詳細なコードカバレッジレポートを生成するJaCoCo-Mavenプラグインを使用しています。JaCoCo-Mavenプラグインは、Javaプロジェクト用の無料のコードカバレッジライブラリです。それはEclEmmaチームによって作成された既存の統合ライブラリの研究に基づいています。より大きな範囲では、コードカバレッジは製品の品質の概要を与えます。なぜなら、カバレッジが高いほど、テストされていないコードがリリースサイクルに入る可能性が低くなるからです。
この記事では、JaCoCo-Mavenプラグインについてもっと学び、このプラグインがMavenを使用してどのように実装されるかを理解します。また、Mavenプロジェクトを統合し、Seleniumを実行してテストの詳細なコードカバレッジレポートを生成します。
コードカバレッジとは何ですか?
ソフトウェア開発において、コードカバレッジは、テストスイートが実行される際にアプリケーションのソースコードがどの程度実行されるかを記述するために使用される尺度です。レポートが生成されて、ソフトウェアアプリケーションのコードカバレッジを表示および分析することができます。このコードカバレッジレポートは、コード品質を確保するために使用されることがあります。
JaCoCo-Mavenプラグインは、コードカバレッジレポートを生成するために使用されます。高いコードカバレッジを持つソースコードは、テスト中にそのコードの多くが実行されます。例えば、テスト対象のソフトウェアが100行のコードを含んでおり、ソフトウェアで検証されたコード行数が90であれば、そのソフトウェアアプリケーションのコードカバレッジ率は90%になります。
コードカバレッジの利点
コードカバレッジは開発者、テスター、およびQAエンジニアにとって非常に有用な指標です。以下は、コードカバレッジのいくつかの顕著な利点です。
- コードカバレッジレポートは、デッドコードの検出と排除に役立つ貴重な洞察を提供します。これは、実装のベストプラクティスに従うことで回避でき、その結果、コードの保守性が向上し、製品品質が向上します。
- 品質保証は、テスト実装を使用してカバーされていないコードを検出するのに役立ちます。
- 開発者はソフトウェア開発プロセスをより迅速に完了し、生産性、スケーラビリティ、および効率を向上させることができます。これにより、市場投入までの時間(TTM)が短縮されます。
コードカバレッジはすべてのソフトウェア製品に非常に重要であることは周知の事実です。コードカバレッジの基本的な側面について簡単に復習したところで、本題に入りましょう。つまり、JaCoCo-Mavenプラグインを使用してコードカバレッジレポートを生成する方法です。
JaCoCo-Mavenプラグインとは?
JaCoCo-Maven(Java Code Coverageの略)プラグインは、Java用のオープンソースのコードカバレッジツールです。コードカバレッジレポートを作成し、Eclipse IDEなどのIDE(統合開発環境)とよく統合されています。
また、CI/CDツール(例:Jenkins、Circle CIなど)やプロジェクト管理ツール(例:SonarQubeなど)とスムーズに統合されています。Eclipse Foundationの一部であり、EclipseのEclEmmaコードカバレッジツールの代替となっています。
JaCoCo-Mavenプラグインはどのように機能するのでしょうか?
- JaCoCo-Mavenプラグインは、ランタイムエージェントを通じてJavaコードをインストルメント化することでカバレッジを実行します。簡単に言うと、JVM(Java仮想マシン)の起動時にこのエージェントをアタッチします。このエージェントはJaCoCoエージェントと呼ばれます。最初の実行start-agentはこのJaCoCoランタイムエージェントを開始します。
- クラスがロードされるたびに、JaCoCoはクラスをインストルメント化して、テストプロセス中にクラスが呼び出されたときと、どの行(コード)が呼び出されたかを見ることができます。このトラッキングを維持しながら、2回目の実行(つまり、generate-report)中にコードカバレッジ統計をリアルタイムに構築します。
- デフォルトでは、JVMが終了するとすぐにファイルが作成されますが、エージェントをサーバーモードで実行することも可能です。これにより、結果のダンプがトリガーされ、終了前にレポートが作成されます。以下はJaCoCoプラグインの内部を示しています。
- JaCoCo-Mavenプラグインの設定で目標やルールを定義できます。これにより、コードカバレッジの量をチェックするための制限を設定する柔軟性が得られます。
- Maven-surefireプラグインはデフォルトのMavenプラグインです。これはJVMでテストを実行し、カバレッジレポートを提供します。一方、JaCoCoプラグインは、プラグイン(例えば、Surefireプラグイン)によって既に実行されたコードをインストルメント化します。したがって、maven-surefireプラグインの依存関係をチェックすることは良い習慣です。
なぜJaCoCo-Mavenプラグインがコードカバレッジに適しているのか?
JaCoCo-Mavenプラグインがコードカバレッジに適している理由は以下の通りです:
- どんなプロジェクトを取り組む際にも、開発者は主にIDEを好む傾向があります。なぜなら、コーディングとテストの経験を簡素化するからです。JaCoCoはEclipse IDEにEclEmmaとしてインストールできます。EclEmmaはそのマーケットプレイスからダウンロードできます。
- JaCoCoプラグインはANT、Maven、Gradleなど、あらゆるタイプのビルドに簡単に追加できます。また、Jenkins、Circle CIなどのCI/CDツールと統合することもできます。これにより、多くのユースケースに対して汎用性があります。
- JaCoCoによって生成されるコードカバレッジレポートは、どんなブラウザやIDEでも閲覧可能なシンプルで情報豊富なHTMLファイルです。
- JaCoCoはオフラインインストリメンテーションも提供しており(すなわち、テストを実行する前にすべてのクラスがインストリメントされる)、
- レポートの分析も非常に簡単で、カラーコードに基づいてコードカバレッジの正確なパーセンテージが提供されます。
JaCoCoプラグインをMavenで設定する方法
Mavenプロジェクトでコードカバレッジレポートを取得するためには、まずそのプロジェクト用にJaCoCo Mavenプラグインを設定する必要があります。JaCoCoプラグインを統合することで、コードカバレッジ分析の結果をHTMLレポートとして確認できます。現在のJaCoCo-MavenプラグインのバージョンはMVNリポジトリからダウンロードできます。
以下は、MavenプラグインをMavenプロジェクトに統合するための手順です:
1. 各Mavenプロジェクトにはpom.xml
ファイルがあり、これはすべての依存関係とプラグインを宣言するために使用されます。JaCoCo-Mavenプラグインは同じPOM.xml
ファイルで宣言されます。同じのXMLコードは以下の通りです:
<plugin>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
<version>0.8.6</version>
</plugin>
これはMavenベースのプロジェクトでJaCoCoプラグインを指定するためにビルドタグの下に追加される基本的なXMLコードです。実行タグ内の目標とルールを指定することで、機能を強化(例えば、レポートがいつ生成されるべきかなど)できます。
2. バージョンタグの後に、実行タグを追加します。このタグは、JaCoCoエージェントを指すプロパティや実行を準備し、VM(この場合はJVM)引数として渡されます。
3. 単純なユニットテストを実行するために、実行タグ内の2つの目標が適切です。最小限の設定は、prepare-agentとreportの目標を設定することです。
<plugin>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
<version>0.8.6</version>
<executions>
<execution>
<id>prepare-agent</id>
<goals>
<goal>prepare-agent</goal>
</goals>
</execution>
<execution>
<id>report</id>
<phase>test</phase>
<goals>
<goal>report</goal>
</goals>
</execution>
</executions>
</plugin>
- Prepare-agent goal: prepare-agent goalは、実行データを記録するJaCoCoランタイムエージェントを準備します。実行された行数、バックトレースなどを記録します。デフォルトでは、実行データは
target/jacoco-ut.exec
ファイルに書き込まれます。 - Report goal: report goalは、JaCoCoランタイムエージェントによって記録された実行データからコードカバレッジレポートを作成します。フェーズプロパティを指定しているため、テストフェーズのコンパイル後にレポートが作成されます。デフォルトでは、実行データは
target/jacoco-ut.exec
ファイルから読み取られ、コードカバレッジレポートはtarget/site/jacoco/index.html
ディレクトリに書き込まれます。
4. 単純なユニットテストを実行するための上記の設定は問題ありません。ただし、コードカバレッジレポートに制約を設ける必要があります(例えば、宛先ディレクトリを指定するなど)。これは設定タグを通じて行うことができます:
<plugin>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
<version>0.8.6</version>
<executions>
<execution>
<id>prepare-agent</id>
<goals>
<goal>prepare-agent</goal>
</goals>
<configuration>
<destFile>${project.build.directory}/coverage-reports/jacoco-ut.exec</destFile>
<propertyName>surefireArgLine</propertyName>
</configuration>
</execution>
<execution>
<id>report</id>
<phase>test</phase>
<goals>
<goal>report</goal>
</goals>
<configuration>
<dataFile>${project.build.directory}/coverage-reports/jacoco-ut.exec</dataFile>
<outputDirectory>${project.reporting.outputDirectory}/jacoco-ut</outputDirectory>
</configuration>
</execution>
</executions>
</plugin>
最初の実行の設定
上記のコードでは、destFile
などのタグが指定されていることがわかります。タグの簡単な説明は以下の通りです:
destFile
タグ:destFile
タグは、実行データを含むファイルへのパスを設定するために使用されます。propertyName-surefireArgLine
タグ: このタグは、JaCoCoランタイムエージェントの設定を含むプロパティの名前を設定します。これはまた、ユニットテストが実行される際のVM引数ラインも設定します。
第二の実行の設定
上記のコードでは、dataFile
などのタグが指定されていることがわかります。タグの簡単な説明は以下の通りです:
dataFile
タグ:dataFile
タグは、実行データを含むファイルへのパスを設定するために使用されます。outputDirectory
タグ: このタグは、コードカバレッジレポートの出力ディレクトリを設定します。
5. また、設定タグにルールを追加して、コードカバレッジのパーセンテージをチェックすることもできます。以下のように行うことができます:
<plugin>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
<version>0.8.6</version>
<executions>
<execution>
<id>prepare-agent</id>
<goals>
<goal>prepare-agent</goal>
</goals>
<configuration>
<destFile>${project.build.directory}/coverage-reports/jacoco-ut.exec</destFile>
<propertyName>surefireArgLine</propertyName>
</configuration>
</execution>
<execution>
<id>report</id>
<phase>test</phase>
<goals>
<goal>report</goal>
</goals>
<configuration>
<dataFile>${project.build.directory}/coverage-reports/jacoco-ut.exec</dataFile>
<outputDirectory>${project.reporting.outputDirectory}/jacoco-ut</outputDirectory>
</configuration>
</execution>
<execution>
<id>jacoco-check</id>
<goals>
<goal>check</goal>
</goals>
<configuration>
<rules>
<rule>
<element>PACKAGE</element>
<limits>
<limit>
<counter>LINE</counter>
<value>COVEREDRATIO</value>
<minimum>0.50</minimum>
</limit>
</limits>
</rule>
</rules>
</configuration>
</execution>
</executions>
</plugin>
第三の実行の設定
ここで新しい目標チェックが定義されています。jacoco:check
目標は、指定されたルールを検証するためにバインドされています。ルールはruleタグで指定されています。複数のルールを指定する柔軟性があります。
- 要素タグ:このタグは、ルールが適用される要素を指定します。
- 制限タグ:カウンター、値、最小値などのタグは、コードカバレッジの割合を制限するために使用されます。mvn clean verifyのようなコマンドを使用して、ルールが遵守されているかどうかを確認できます。
6. JaCoCo-Mavenプラグインの構成で複数の目標とルールを定義できます。
MavenおよびJaCoCoプラグインを使用したコードカバレッジレポート
このセクションでは、JaCoCo Mavenプラグインを使用してコードカバレッジレポートを生成する手順を実演します。デモンストレーションは、非常に単純なテストシナリオを取り入れて行われます。それでは始めましょう。
前提条件
- Maven 3.0以上:Mavenはプロジェクト開発管理および理解ツールです。最新バージョンはApache Mavenの公式ウェブサイトからインストールできます。
- Java 1.5以上:Javaがマシンにインストールされていることを確認する必要があります。Javaがインストールされていない場合は、Javaの公式ウェブサイトから最新バージョンをダウンロードしてください。
- Eclipse IDE for Java Developers:使用したいIDEを選択できますが、このデモではEclipse IDEを使用しました。
シンプルなMavenプロジェクトを作成する手順
- Eclipse IDEで、[ファイル] > [新規] > [Mavenプロジェクト]に進みます。
2. 新しいダイアログボックスが表示されます。「デフォルトのワークスペースの場所を使用」チェックボックスがチェックされていることを確認し、「次へ」をクリックしてください。
3. プロジェクトでアーキタイプを選択するために、フィルターの隣にあるテキストボックスにorg.apache.maven
と入力します。maven-archetype-quickstart
を選択し、「次へ」をクリックしてください。
4. 次に、「グループID」をcom.example
に、「アーティファクトID」をjacoco-exampleに設定します。「アーティファクトID」はプロジェクト名です。最後に、「完了」ボタンをクリックしてください。
5. 「プロジェクトエクスプローラー」でプロジェクトのファイルおよびフォルダ階層を確認できます。
JaCoCo MavenプラグインをPOM.xmlで指定する方法
1. POM.xml
を開き、タグまでスクロールします。MavenプラグインをリストするセクションでJaCoCo-Mavenプラグインを指定します。以下のコードをコピーして上記のタグに貼り付けてください。
<plugin>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
<version>0.8.6</version>
<executions>
<!--first execution : for preparing JaCoCo runtime agent-->
<execution>
<id>prepare-agent</id>
<goals>
<goal>prepare-agent</goal>
</goals>
</execution>
<!--second execution : for creating code coverage reports-->
<execution>
<id>report</id>
<phase>test</phase>
<goals>
<goal>report</goal>
</goals>
</execution>
</executions>
</plugin>
2. 自動化されたWebテストでJUnitを使用したレポート生成を説明しているため、POM.xml
でJUnitの依存関係も宣言します。
POM.xml
の全体の内容は以下の通りです。
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>jacoco-example</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>jacoco-example</name>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.7</maven.compiler.source>
<maven.compiler.target>1.7</maven.compiler.target>
</properties>
<!-- JUnit dependencies added to run test cases -->
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<!-- Maven plugin for Project Management -->
<plugin>
<artifactId>maven-clean-plugin</artifactId>
<version>3.0.0</version>
</plugin>
<!-- see http://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_jar_packaging -->
<plugin>
<artifactId>maven-resources-plugin</artifactId>
<version>3.0.2</version>
</plugin>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.7.0</version>
</plugin>
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.19.1</version>
</plugin>
<plugin>
<artifactId>maven-jar-plugin</artifactId>
<version>3.0.2</version>
</plugin>
<plugin>
<artifactId>maven-install-plugin</artifactId>
<version>2.5.2</version>
</plugin>
<plugin>
<artifactId>maven-deploy-plugin</artifactId>
<version>2.8.2</version>
</plugin>
<plugin>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
<version>0.8.6</version>
<executions>
<execution>
<id>prepare-agent</id>
<goals><goal>prepare-agent</goal></goals>
</execution>
<execution>
<id>report</id>
<phase>test</phase>
<goals><goal>report</goal></goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
3. プロジェクトディレクトリから、src/main/java
に存在するcom.example.jacoco_lambdatest パッケージ
に移動します。新しいJavaクラスLambdaTest.java
を作成します。このクラスでは、Selenium Gridの望ましい機能を提供するシンプルなsetUp()
関数を記述します。
package com.example.Jacoco_lambdatest;
import java.net.MalformedURLException;
import java.net.URL;
import org.junit.Before;
import org.junit.Test;
import org.openqa.selenium.By;
import org.openqa.selenium.remote.DesiredCapabilities;
import org.openqa.selenium.remote.RemoteWebDriver;
public class LambdaTest {
public static String username = "<LambdaTest_Username>";
public static String accessKey = "<LambdaTest_AccessKey>";
public static DesiredCapabilities setUp() throws Exception {
DesiredCapabilities capabilities = new DesiredCapabilities();
capabilities.setCapability("platform", "Windows 10");
capabilities.setCapability("browserName", "Chrome");
capabilities.setCapability("version", "87.0"); // If this cap isn't specified, it will just get the any available one
capabilities.setCapability("resolution","1024x768");
capabilities.setCapability("build", "First Test");
capabilities.setCapability("name", "Sample Test");
capabilities.setCapability("network", true); // To enable network logs
capabilities.setCapability("visual", true); // To enable step by step screenshot
capabilities.setCapability("video", true); // To enable video recording
capabilities.setCapability("console", true); // To capture console logs
return capabilities;
}
}
プロジェクトにJUnitテストケースを追加する
1. AppTest.java
においてシンプルなJUnitテストケースを作成します。これは、デフォルトでsrc/test/java
のcom.example.jacoco_lambdatest
パッケージ名の下に提供されています。
package com.example.Jacoco_lambdatest;
import java.net.MalformedURLException;
import java.net.URL;
import org.junit.Before;
import org.junit.Test;
import org.openqa.selenium.By;
import org.openqa.selenium.remote.DesiredCapabilities;
import org.openqa.selenium.remote.RemoteWebDriver;
import com.example.Jacoco_lambdatest.*;
public class AppTest {
public static RemoteWebDriver driver;
@Test
public void testScript1() throws Exception {
try {
DesiredCapabilities capabilities = LambdaTest.setUp();
String username =LambdaTest.username;
String accessKey = LambdaTest.accessKey;
RemoteWebDriver driver = new RemoteWebDriver(new URL("https://"+username+":"+accessKey+"@hub.lambdatest.com/wd/hub"),capabilities); driver.get("https://lambdatest.github.io/sample-todo-app/");
driver.findElement(By.name("li1")).click();
driver.findElement(By.name("li2")).click(); driver.findElement(By.id("sampletodotext")).clear(); driver.findElement(By.id("sampletodotext")).sendKeys("Yey, Let's add it to list");
driver.findElement(By.id("addbutton")).click();
driver.quit();
} catch (Exception e) {
System.out.println(e.getMessage());
}
}
}
コードカバレッジレポートの生成
1. “Run As”ボタンをクリックし、設定をMaven Testにします。
2. 代わりに、コマンドライン(cmd)を開き、プロジェクトフォルダに移動し、mavenコマンド「mvn test」を実行することもできます。
3. JUnitテストを実行すると、JaCoCoアジトが自動的に起動し、target/jacoco.exec
のパスでターゲットディレクトリにバイナリ形式のレポートを作成します。jacoco.exec
の出力は一人で解釈できませんが、SonarQubeやプラグインなどの他のツールで解釈できます。以前に指定したように、jacoco:report
ゴールは、HTML、CSV、XMLなどの人気の形式で読みやすいコードカバレッジレポートを生成します。
4. ビルドが成功したら、ターゲットフォルダに移動し、サイト>jacocoフォルダに進みます。コードカバレッジレポート(すなわちindex.html
)はtarget/site/jacoco/index.html
にあります。レポートは次のようになります:
5. レポートでcom.example.jacoco_lambdatest>LambdaTest
をクリックすることで、マイクロレベルで掘り下げることができます。
6. 特定の関数をクリックすることで、LambdaTest.java
でより詳細なビューを得ることができます。
7. ここでは、緑、黄色、赤など様々な色のダイヤモンドがたくさん見られます。これらは、どの行のコードが実行されたか、そしていつ実行されたかを示すためにレポートで使用される仕様です。これについては、次のレポート分析セクションで詳しく学びます。これで、Jacoco Mavenプラグインを通じてコードカバレッジレポートの生成に成功しました。
コードカバレッジレポートの分析
私たちのコードカバレッジレポートは、94%の命令カバレッジと100%の分岐カバレッジを示しており、素晴らしいコードカバレッジスコアです。後で、より多くのテストケースを追加して100%のコードカバレッジスコアを達成しようとします。
JaCoCoがレポートで示した38の命令は、Javaコードの命令ではなく、バイトコードの命令を指しています。JaCoCoのレポートは、分岐に色付きのダイヤモンドと行の背景ハイライトカラーを使用して、コードカバレッジを視覚的に分析するのに役立ちます。コードカバレッジレポートで見られるダイヤモンドの簡単な説明は以下の通りです。
- 赤いダイヤモンド; テスト段階では分岐が実行されていないことを示します。
- 黄色のダイヤモンド: コードが部分的にカバーされていること(つまり、いくつかの分岐が実行されていない)を示します。
- 緑色のダイヤモンド: テスト中にすべての分岐が実行されたことを示します。
同じカラーコードは、行カバレッジの背景ハイライトカラーにも適用されます。
レポートは主に3つの重要な指標を提供します。
- 行カバレッジ: これは、テストによって呼び出されたJavaバイトコード命令の数に基づいて実行されたコードの量を反映しています。
- ブランチカバレッジ: これは、ソースコード内で実行された分岐の割合を示します。これらは、典型的なif/elseやswitch文です。
- 循環的複雑度: これは、コード内のすべての可能なパスをカバーするために必要なパスの数を通じてコードの複雑さを反映します。また、コード全体をカバーするために実装する必要のあるテストケースの数を指します。コードにswitchやステートメントがない場合、循環的複雑度は1になります。コード全体をカバーするには、1つの実行パスだけで十分です。
コードカバレッジを向上させるための追加テストケースの導入
1. より良いコードカバレッジを達成するために、以前のテスト実装でカバーされなかったコードをテストするために、より多くのテストを導入する必要があります。
2. src/test/java
のAppTest.java
に移動して、より多くのテストケースを追加します。
3. AppTest.java
に追加された新しいテストケースは次のようになります。
@Test
public void testScript2() throws Exception {
try {
DesiredCapabilities capabilities = LambdaTest.setUp();
String username = LambdaTest.username;
String accessKey = LambdaTest.accessKey;
RemoteWebDriver driver = new RemoteWebDriver(new URL("https://"+username+":"+accessKey+"@hub.lambdatest.com/wd/hub"),capabilities); driver.get("https://lambdatest.github.io/sample-todo-app/"); driver.findElement(By.name("li2")).click();
driver.findElement(By.name("li3")).click();
driver.findElement(By.id("sampletodotext")).clear(); driver.findElement(By.id("sampletodotext")).sendKeys("Yes, Let's add it to list"); driver.findElement(By.id("addbutton")).click();
driver.quit();
} catch (Exception e) {
System.out.println(e.getMessage());
}
}
@Test
public void testScript3() throws Exception {
try {
DesiredCapabilities capabilities = LambdaTest.setUp();
String username = LambdaTest.username;
String accessKey = LambdaTest.accessKey;
RemoteWebDriver driver = new RemoteWebDriver(new URL("https://"+username+":"+accessKey+"@hub.lambdatest.com/wd/hub"),capabilities); driver.get("https://lambdatest.github.io/sample-todo-app/"); driver.findElement(By.name("li4")).click();
driver.findElement(By.id("sampletodotext")).clear(); driver.findElement(By.id("sampletodotext")).sendKeys("Yes, Let's add it!");
driver.findElement(By.id("addbutton")).click();
driver.quit();
} catch (Exception e) {
System.out.println(e.getMessage());
}
}
4. Maven JaCoCoレポートを実行して、新しいカバレッジレポートを公開しましょう。
5. JaCoCoは、最小要件を宣言することでコードカバレッジスコアを簡単に追跡する方法を提供します。これらの要件が満たされていない場合、ビルドは失敗します。そうでない場合、ビルドは成功します。
6. これらの要件は、POM.xml
のルールとして指定できます。POM.xml
の2番目の<execution>
タグの後に、新しい実行を指定するために'check'
ゴールを指定してください。
<!--Third execution : used to put a check on the entire package-->
<execution>
<id>jacoco-check</id>
<goals>
<goal>check</goal>
</goals>
<configuration>
<rules>
<rule>
<element>PACKAGE</element>
<limits>
<limit>
<counter>LINE</counter>
<value>COVEREDRATIO</value>
<minimum>0.50</minimum>
</limit>
</limits>
</rule>
</rules>
</configuration>
</execution>
7. これにより、カバレッジ比率を50%に制限しています。これは、テスト段階でコードの最小50%がカバーされることを意味します。
8. Mavenの「clean verify」コマンドを実行して、jacoco:check
ゴールで設定したルールが満たされているか確認できます。
9. ログには「すべてのカバレッジチェックが満たされました」と表示され、コードカバレッジスコアが94%であり、最小の50%を上回っています。
LambdaTest Selenium Gridでの自動化テスト
JaCoCoプラグインを使用したMavenプロジェクト
クラウド上でのSeleniumテストは、より広範なブラウザカバレッジ、増大したテストカバレッジ、そして市場投入までの時間短縮を実現します。Seleniumにおける並列テストは、上記の要件を達成するのに役立ちます。
LambdaTest Cloud Selenium Gridは、クラウドベースのスケーラブルなSeleniumテストプラットフォームであり、自動化スクリプトを2000以上の異なるブラウザやオペレーティングシステムで実行できます。
前提条件
JUnitとSeleniumを使用してテストスクリプトを実行するためには、環境を設定する必要があります。まずLambdaTestでアカウントを作成し、LambdaTestプロフィールセクションで利用可能なユーザー名とアクセスキーをメモしてください。
JavaのSeleniumテストには、このサンプルプロジェクトを使用します。
Eclipse IDEへのプロジェクトのインポート
GitHubからjunit-selenium-sample
のzipファイルをダウンロードした後、以下の手順に従ってEclipse IDEにインポートします。
1. Eclipse IDEにアクセスし、「File」メニューをクリックして「Import」を選択します。新しいダイアログボックスが表示されます。
2. テキストボックスにMavenと入力し、「Existing Maven Projects」を選択して「Next」をクリックします。
3. 次のダイアログボックスで「Browse」をクリックし、プロジェクトフォルダに移動します。また、POM.xmlファイルへのパスを示すチェックボックスをオンにし、「Finish」をクリックします。
4. プロジェクトはEclipse IDEに正常に読み込まれます。
POM.xmlファイルにおける依存関係の追加
1. POM.xml
を開き、JUnit、Selenium、JaCoCo Maven Pluginの依存関係を追加します。依存関係を追加した後のPOM.xml
のコードは以下のようになります。
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.lambdatest</groupId>
<artifactId>lambdatest-junit-sample</artifactId>
<version>1.0-SNAPSHOT</version>
<properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<surefire.version>2.19.1</surefire.version>
<config.file>default</config.file>
</properties>
<dependencies>
<!--JUnit dependency-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>1.3.2</version>
<scope>test</scope>
</dependency>
<!--Selenium dependency-->
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-java</artifactId>
<version>2.52.0</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.googlecode.json-simple</groupId>
<artifactId>json-simple</artifactId>
<version>1.1.1</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<!--Apache Maven Plugins-->
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.0</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.19.1</version>
</plugin>
<!--JaCoCo Maven Plugin-->
<plugin>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
<version>0.8.6</version>
<executions>
<execution>
<id>prepare-agent</id>
<goals><goal>prepare-agent</goal></goals>
</execution>
<execution>
<id>report</id>
<phase>test</phase>
<goals><goal>report</goal></goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
<em><a href="https://github.com/rachnaagrawal/junit-selenium-sample/blob/master/pom.xml" target="_blank" rel="nofollow">Github</a></em>
JUnit自動化テストのためのDesired Capabilitiesの設定
1. LambdaTest Selenium Automation Gridに接続するために最初に行われるのは、リモートwebdriverを呼び出すことです。このリモートドライバーは、ブラウザ、ブラウザのバージョン、オペレーティングシステムなどのようなキャパシティを必要とします。そのコードは以下の通りです。
WebDriver driver = new RemoteWebDriver(new URL("https://" + username + ":" + accesskey + "@hub.lambdatest.com/wd/hub"),
DesiredCapabilities.firefox()); //A class named DesiredCapabilities is used to create an environment as a Firefox browser.
2. JUnit自動化テストコードでは、ブラウザ、ブラウザのバージョン、オペレーティングシステム情報などのキャパシティをカスタマイズし、キャパシティオブジェクトを介して渡すことができます。
3. LambdaTestはこのプロセスを非常に簡単にしてくれており、組み込みのキャパシティジェネレータを提供しています。キャパシティジェネレータは、入力に基づいて必要なキャパシティのコードを自動的に生成します。たとえば、私たちの設定は以下のようになります。
フィールド |
選択された値 |
オペレーティングシステム |
Windows 10 |
ブラウザ |
Chrome |
ブラウザバージョン |
62.0 |
解像度 |
1024×768 |
Seleniumバージョン |
3.13.0 |
4. 上記の指定された構成をキャパシティジェネレータで選択し、LambdaTestBaseTest.java
に貼り付けます。
LambdaTestのユーザー名とアクセスキーを必要なJavaクラスで指定
1. プロジェクトエクスプローラで、3つのJavaクラスが表示されます:
LambdaTestBaseTest
.java(Java Seleniumテストのための設定が含まれています)。Parallelized.java
(LambdaTest Seleniumグリッドでの並列テストのためのJunitテストが含まれています)。SimpleTest.java
(単純なユニットテストが含まれています)。
2. LambdaTestBaseTest.java
は、必要なデータ(望ましいキャパシティ、ユーザー名、アクセスキーなど)をconfigファイルから取得します。これはsrc/test/resources
にてconfig.json
として提供されています。
3. config.json
で望ましいキャパシティ、ユーザー名、アクセスキーを指定します。このJSONファイルは、複数の構成を提供し、後でそれらを取得することで、Seleniumを使用した並列テストを実現するために使用されます。
[ { "tunnelName":"LambdaTest tunnel",
"buildName":"running Java Selenium Tests",
"testName":"Jacoco JUnit Test",
"username": "user-name",
"access_key":"access-key",
"operatingSystem" : "win10",
"browserName" : "chrome",
"browserVersion" : "62.0",
"resolution" : "1024x768" }]
JUnitを使用したSeleniumによるユニットテスト:
1. SimpleTest.java
は、JaCoCo Mavenプラグインを使用して単一のユニットテストケースを指定、テスト、およびコードカバレッジを実行するためのJavaクラスです。
package com.lambdatest;
import com.lambdatest.LambdaTestBaseTest;
import org.junit.Test;
import org.openqa.selenium.By;
import static org.junit.Assert.assertEquals;
public class SimpleTest extends LambdaTestBaseTest {
/**
* Simple Test case annotation for JUnit Test
* @throws Exception
*/
@Test
public void validateUser() throws Exception {
driver.get("https://lambdatest.github.io/sample-todo-app/");
driver.findElement(By.name("li1")).click();
driver.findElement(By.name("li2")).click();
driver.findElement(By.id("sampletodotext")).clear();
driver.findElement(By.id("sampletodotext")).sendKeys("Yey, Let's add it to list");
driver.findElement(By.id("addbutton")).click();
}
}
2. これはシンプルなSelenium WebDriverテストで、サンプルのToDoアプリケーションを開き、以下のタスクを実行します:
- 最初の2つのアイテムを「完了」とマーク
- リストに新しいアイテムを追加
- 追加されたアイテムを返す
3. ターミナルでmvn testコマンドをトリガーしてテストケースをビルドして実行します。
4. さて、LambdaTestアカウントにログインし、「Automation」に移動してください。実行したテストが「JUnit JaCoCo Tests」というビルド名の下に表示されます。
5. 「JUnit JaCoCo Tests」をクリックして詳細にレビューしてください。LambdaTestはビデオを記録しているので、視覚的にも確認できます。
JaCoCo Mavenプラグインによるコードカバレッジレポートの生成:
- LambdaTest Selenium GridでJUnitテストケースを実行したので、コードカバレッジレポートはJaCoCo Mavenプラグインを介して生成されるはずです。
- ターゲットフォルダに移動するだけで、レポートのバイナリ形式として
jacoco.exec
が見つかります。 - HTML、CSV、XML形式のコードカバレッジレポートは、それぞれ
index.html, jacoco.csv
、およびjacoco.xml
としてtarget/site/jacoco
フォルダに表示されます。 - これで、コードカバレッジスコアを改善したり、生成されたコードカバレッジレポートを分析したりすることもできます。
結論
本記事では、Javaプロジェクトのコードカバレッジレポートを生成するためにJaCoCo-Mavenプラグインを使用する方法を学びました。また、LambdaTest Selenium Gridクラウドの柔軟性とスケーラビリティを活用して、テストプロセスを自動化しました。ただし、100%のコードカバレッジは効果的なテストを反映するものではなく、テスト中に実行されたコードの量を示すにすぎません。
しかし、バグの数を減らし、ソフトウェアリリースの品質を向上させるのに役立ちます。さらに、ビルドプロセスに最小限のオーバーヘッドを追加し、開発チームがエッジケースを追加するか、防御的プログラミングを実装する際に一定のしきい値を維持できます。
Source:
https://dzone.com/articles/how-to-generate-code-coverage-report-jacoco-maven