Код покрытия – это метрика качества программного обеспечения, обычно используемая на этапе разработки, которая позволяет определить степень тестирования (или выполнения) кода. Для достижения оптимального кода покрытия необходимо, чтобы тестовое внедрение (или тестовые наборы) тестировало большинство процентов реализованного кода.
Существует несколько инструментов для кода покрытия для языков программирования, таких как Java, C#, JavaScript и т.д. Использование наиболее подходящего инструмента для кода покрытия важно для понимания процента тестируемого кода и принятия соответствующих мер для обеспечения достижения идеального кода покрытия.
Для оптимального тестирования кода многие компании используют плагин JaCoCo-Maven, который помогает генерировать подробные отчеты о коде покрытия. Плагин JaCoCo-Maven – это бесплатная библиотека для кода покрытия для проектов на Java. Он основан на изучении существующих интеграционных библиотек, созданных командой EclEmma. В значительной степени код покрытия дает краткий обзор качества продукта, так как чем выше покрытие, тем меньше вероятность того, что непроверенный код попадет в цикл выпуска.
В этой статье мы узнаем больше о плагине JaCoCo-Maven и о том, как этот плагин реализован с использованием Maven. Мы также интегрируем проект Maven и создадим подробный отчет о коде покрытия для тестов, выполняя Selenium.
Что такое код покрытия?
В области разработки программного обеспечения, код покрытия – это показатель, используемый для описания степени выполнения исходного кода приложения при выполнении набора тестов. Генерируется отчет для просмотра и анализа кода покрытия программного приложения. Этот отчет о коде покрытия затем можно использовать для обеспечения качества кода.
Плагин JaCoCo-Maven используется для создания отчетов о покрытии кода. Исходный код с высоким уровнем покрытия кода большей частью выполняется во время тестирования. Например, если программное обеспечение, которое вы тестируете, содержит 100 строк кода, и в нем проверены 90 строк кода, то процент покрытия кода этого программного приложения составит 90%.
Преимущества Покрытия Кода
Покрытие кода является очень полезным показателем для разработчиков, тестировщиков и инженеров по качеству. Вот некоторые из очевидных преимуществ покрытия кода:
- Отчеты о покрытии кода предоставляют ценные сведения для обнаружения и устранения мертвого кода. Это можно избежать, следуя лучшим практикам реализации, что, в свою очередь, приводит к улучшению поддерживаемости кода и более высокому качеству продукта.
- Гарантия качества может помочь обнаружить код, который не был покрыт с помощью тестовой реализации.
- Разработчики могут быстрее завершить процесс разработки программного обеспечения, повышая свою производительность, масштабируемость и эффективность. Это приводит к сокращению времени выхода на рынок (TTM).
Как известно, покрытие кода очень важно для каждого программного продукта. Теперь, когда мы быстро повторили основные аспекты покрытия кода, давайте глубже погрузимся в нашу основную тему, а именно в создание отчетов о покрытии кода с помощью плагина JaCoCo-Maven.
Что такое Плагин JaCoCo-Maven?
Плагин JaCoCo-Maven (сокращение от Java Code Coverage) – это инструмент с открытым исходным кодом для измерения покрытия кода на Java. Он создает отчеты о покрытии кода и хорошо интегрируется с интегрированными средами разработки (IDE), такими как Eclipse IDE.
Оно также интегрируется плавно с инструментами CI/CD (например, Jenkins, Circle CI и т.д.) и инструментами управления проектами (например, SonarQube и т.д.). Оно является частью Фонда Eclipse и заменило инструмент для анализа покрытия кода EclEmma в Eclipse.
Как работает плагин JaCoCo-Maven?
- Плагин JaCoCo-Maven выполняет анализ покрытия кода, инструментируя Java-код через агент времени выполнения. Проще говоря, вы присоединяете этого агента к JVM (Java Virtual Machine) при его запуске. Этот агент называется агентом JaCoCo. Первое выполнение start-agent запускает этот агент JaCoCo времени выполнения.
- Когда класс загружается, JaCoCo может инструментировать класс, чтобы он мог видеть, когда класс вызывается, и какие строки (кода) вызываются в процессе тестирования. Отслеживая это, он собирает статистику покрытия кода, которая выполняется на лету во время второго выполнения (т.е. 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. Его также можно интегрировать с инструментами CI/CD, такими как Jenkins, Circle CI и т. д. Это делает его универсальным для множества случаев использования.
- Отчет о покрытии кода, созданный JaCoCo, представляет собой простой и информативный HTML-файл, который можно просматривать в любом браузере или IDE.
- JaCoCo также предоставляет оффлайн-инструментацию (то есть все классы инструментированы перед запуском любых тестов).
- Анализ отчета также довольно прост, так как он основан на цветах и предоставляет точный процент покрытия кода.
Как настроить плагин JaCoCo с Maven
Чтобы получить отчеты о покрытии кода в проекте Maven, сначала необходимо настроить плагин JaCoCo Maven для этого проекта. Интеграция плагина JaCoCo позволяет просмотреть результаты анализа покрытия кода в виде HTML-отчета. Текущую версию плагина JaCoCo-Maven можно загрузить с репозитория MVN.
Вот шаги по интеграции плагина JaCoCo 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>
Это базовый XML-код, добавленный под тегом build для указания плагина JaCoCo в проекте на основе Maven. Мы можем расширить функциональность (например, указать, когда должен быть сгенерирован отчет и т.д.), указав цели и правила в теге execution.
2. После тега version мы добавляем тег execution. Этот тег готовит свойства или выполнение для указания на агент JaCoCo и передается как аргумент VM (в данном случае JVM).
3. Для запуска простых юнит-тестов два набора целей в тегах execution будут работать нормально. Минимум, что нужно установить, – это цели 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: Цель prepare-agent готовит временный агент JaCoCo для записи данных выполнения. Он записывает количество выполненных строк, отслеженных назад и т.д. По умолчанию данные выполнения записываются в файл
target/jacoco-ut.exec
. - Цель report: Цель report создает отчеты о покрытии кода из данных выполнения, записанных временным агентом JaCoCo. Поскольку мы указали свойство phase, отчеты будут созданы после компиляции тестовой фазы. По умолчанию данные выполнения считываются из файла
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 в режиме выполнения. Также устанавливается аргумент командной строки ВМ при выполнении юнит-тестов.
Конфигурация второго выполнения
Согласно приведенному выше коду, вы можете увидеть теги, такие как 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
привязана к проверке правила, указанного в теге правила. Вы можете указать более одного правила.
- Тег элемента: Этот тег указывает элемент, к которому должно быть применено правило.
- Тег ограничения: Теги, такие как счетчик, значение, минимум и т.д., используются для ограничения процента покрытия кода. Команда наподобие mvn clean verify может быть использована для обеспечения того, чтобы правило было соблюдено или нет.
6. В конфигурации плагина JaCoCo-Maven можно определить несколько целей и правил.
Отчеты о покрытии кода с использованием Maven и плагина JaCoCo
В этом разделе мы продемонстрируем шаги по созданию отчета о покрытии кода с использованием плагина JaCoCo для Maven. Демонстрация проводится на очень простом тестовом сценарии. Итак, приступим.
Необходимые условия
- Maven 3.0 или выше: Maven – это инструмент управления и понимания проекта разработки. Вы можете установить последнюю версию с официального сайта Apache Maven.
- Java 1.5 или выше: Необходимо убедиться, что Java установлена на вашем компьютере. В случае, если Java не установлена, пожалуйста, загрузите последнюю версию Java с официального сайта Java.
- Eclipse IDE для разработчиков Java: Хотя вы можете использовать предпочитаемый вами IDE, для этой демонстрации мы использовали Eclipse IDE.
Шаги для создания простого проекта Maven
- В Eclipse IDE, перейдите в меню File > New > Maven Project.
2. Появилось новое окно. Убедитесь, что флажок “Использовать стандартное расположение рабочей области” установлен, и нажмите “Далее.”
3. Для выбора архетипа в проекте введите org.apache.maven
в текстовое поле рядом с фильтром. Выберите maven-archetype-quickstart
и нажмите “Далее.”
4. Теперь укажите “Группу идентификаторов” как com.example
и “Идентификатор артефакта” как jacoco-example. “Идентификатор артефакта” является названием нашего проекта. Наконец, нажмите на кнопку “Завершить.”
5. Вы можете увидеть файлы проекта и иерархию папок в “Проводнике проектов.”
Как указать плагин JaCoCo Maven в POM.xml
1. Откройте POM.xml
, прокрутите до тега. Мы укажем плагин JaCoCo-Maven в секции, где перечислены плагины 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. Так как мы демонстрируем генерацию отчета для автоматического веб-тестирования с JUnit, мы также объявим зависимость JUnit в POM.xml
.
Вот весь содержимое 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. Из директории проекта перейдите в пакет com.example.jacoco_lambdatest
, существующий в src/main/java
. Создайте новый класс Java с именем LambdaTest.java
. Мы напишем в нем простую функцию setUp()
, которая предоставляет желаемые возможности Selenium Grid.
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. Мы создадим простой тестовый пример JUnit в AppTest.java
. Это по умолчанию предоставляется в 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, с путем target/jacoco.exec
. Вывод jacoco.exec
не может быть интерпретирован в одиночку, но другие инструменты, такие как SonarQube и плагины, могут его интерпретировать. Как мы уже указывали, цель jacoco:report
создаст читаемые отчеты о покрытии кода в популярных форматах, таких как HTML, CSV и XML.
4. После успешного сборки перейдите в папку target, затем в site > jacoco. Отчет о покрытии кода (т.е. index.html
) находится по адресу target/site/jacoco/index.html
. Отчет выглядит следующим образом:
5. Вы можете рассмотреть на микроуровне, нажав на com.example.jacoco_lambdatest>LambdaTest
в отчете.
6. Нажав на конкретные функции, вы получите более детальный обзор в LambdaTest.java
.
7. Здесь вы увидите много алмазов разных цветов, таких как зеленый, желтый и красный. Это спецификации, используемые в отчете для символизирования того, какая строка кода была выполнена и когда она была выполнена. Мы узнаем больше об этом в следующей секции анализа отчета. С этим вы успешно сгенерировали отчет о покрытии кода через плагин Jacoco Maven.
Анализ Отчета о Покрытии Кода
Наш отчет о покрытии кода показывает 94% покрытия инструкций и 100% покрытия ветвей, что является отличным результатом покрытия кода. Позже мы постараемся достичь результата 100% покрытия кода, добавив больше тестовых случаев.
38 инструкций, показанных JaCoCo в отчете, относятся к инструкциям байт-кода, а не к инструкциям Java кода. Отчеты JaCoCo помогают вам визуально анализировать покрытие кода, используя алмазы с цветами для ветвей и цветом фона для строк. Краткое объяснение алмазов, видимых в отчете о покрытии кода, приведено ниже:
- Красный алмаз; указывает, что во время тестирования не было использовано ни одной ветви.
- Желтый алмаз: указывает, что код частично покрыт (т.е. некоторые ветви не используются).
- Зеленый алмаз: указывает, что все ветви используются во время теста
Тот же цветовой код применяется к цвету фона для выделения покрытия строк.
В отчете в основном предоставляются три важных показателя:
- Покрытие строк: Это отражает количество кода, используемого на основе числа инструкций Java байт-кода, вызванных тестами.
- Покрытие ветвей: Это показывает процент использованных ветвей в исходном коде. Это типичные конструкции if/else или switch.
- Цикломатическая сложность: Это отражает сложность кода через количество путей, необходимых для покрытия всех возможных путей в коде. Он также относится к количеству тестовых случаев, необходимых для реализации для покрытия всего кода. Поскольку в коде нет переключателя или оператора, цикломатическая сложность будет равна единице; достаточно только одного пути выполнения для покрытия всего кода.
Введение дополнительных тестовых случаев для улучшения покрытия кода
1. Для достижения лучшего покрытия кода необходимо ввести больше тестов, которые проверяют код, не покрытый ранее через тестовую реализацию.
2. Перейдите в AppTest.java
в src/test/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
. Просто укажите новую выполняемую задачу, указав цель ‘check’ в POM.xml
. Добавьте следующий код после второго <execution>
тега в POM.xml
.
<!--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%.
Автоматическое Тестирование На Селенексе Grid LambdaTest
Использование Maven Проекта С Плагином JaCoCo
Тестирование Selenium в облаке помогает достичь лучшего покрытия браузеров, увеличенного покрытия тестов и ускоренного времени выхода на рынок. Параллельное тестирование в Selenium помогает достичь вышеупомянутых требований.
Сеть Selenium Cloud LambdaTest — это облачная масштабируемая платформа для тестирования Selenium, которая позволяет запускать ваши автоматизированные сценарии на более чем 2000 различных браузеров и операционных системах.
Необходимые Условия
Для запуска тестового скрипта с использованием JUnit с Selenium, нам нужно настроить среду. Сначала вам нужно будет создать аккаунт на LambdaTest. Обязательно запишите имя пользователя и ключ доступа, которые доступны в разделе профиля LambdaTest.
Мы будем использовать этот пример проекта для тестирования Java с использованием Selenium.
Импорт Проекта в Eclipse IDE
После загрузки zip-файла проекта: junit-selenium-sample
с GitHub, мы импортируем его в 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
1. Чтобы подключиться к сети автоматизации Selenium LambdaTest, первым делом вызывается удаленный веб-драйвер. Этот удаленный драйвер требует определенных возможностей, таких как браузер, версии браузера, операционная система и т. д., для создания среды. Код выглядит следующим образом:
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. В Project Explorer вы увидите три Java класса:
LambdaTestBaseTest
.java (содержит настройки, необходимые для тестирования Java Selenium).Parallelized.java
(содержит Junit тесты для параллельного тестирования на сети Selenium LambdaTest).SimpleTest.java
(содержит простые юнит-тесты).
2. LambdaTestBaseTest.java
извлекает необходимые данные, такие как желаемые возможности, имя пользователя и ключ доступа из файла конфигурации. Это предоставлено в src/test/resources
как config.json
.
3. Укажите желаемые возможности, имя пользователя и ключ доступа в config.json
. Этот JSON файл используется, так как вы можете предоставить в нем несколько конфигураций для реализации параллельного тестирования с Selenium для указания нескольких конфигураций в config.json
и затем извлечь их позже.
[ { "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
— это Java-класс для определения единичного тестового случая для тестирования и выполнения кодовой покрытости с использованием плагина JaCoCo Maven.
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, который откроет образец приложения для списка дел, выполняя следующие задачи:
- Отметить первые две позиции как “Выполнено.“
- Добавить новый элемент в список.
- Вернуть добавленный элемент.
3. Запустите команду mvn test в терминале для сборки и выполнения тестового случая.
4. Теперь войдите в свой аккаунт LambdaTest и перейдите в раздел “Автоматизация“. Вы найдете выполненные тесты под именем сборки “JUnit JaCoCo Tests”.
5. Нажмите на “JUnit JaCoCo Tests” и просмотрите их подробно. LambdaTest записал видео. Так что вы также можете увидеть визуальные элементы.
Генерация отчета о покрытии кода с помощью плагина JaCoCo Maven:
- Теперь, поскольку мы запустили тесты JUnit на селениуме LambdaTest Grid, отчет о покрытии кода должен быть сгенерирован с помощью плагина JaCoCo Maven.
- Просто перейдите в папку target, и вы найдете двоичную форму отчета как
jacoco.exec
. - Вы можете просмотреть HTML, CSV и XML формы отчета о покрытии кода в папке
target/site/jacoco
какindex.html, jacoco.csv
иjacoco.xml
соответственно. - Теперь вы также можете попытаться улучшить показатель покрытия кода и проанализировать сгенерированный отчет о покрытии кода.
Заключение
В этой статье мы рассмотрели, как использовать плагин JaCoCo-Maven для создания отчетов о покрытии кода для проектов на Java. Также мы воспользовались гибкостью и масштабируемостью облачной платформы LambdaTest Selenium Grid для автоматизации процессов тестирования. Однако помните, что 100% покрытие кода не отражает эффективное тестирование, так как показывает только количество кода, задействованного во время тестов.
Тем не менее, это помогает уменьшить количество ошибок и повысить качество выпуска программного обеспечения. Кроме того, оно добавляет минимальное нагрузка на процесс сборки и позволяет поддерживать определенный порог, когда команда разработчиков добавляет граничные случаи или реализует защитное программирование.
Source:
https://dzone.com/articles/how-to-generate-code-coverage-report-jacoco-maven