Отчет о покрытии кода с помощью Jacoco для интеграционных тестов выполняется на сервере Weblogic

Я написал модульный тест для различных классов предметной области и классов обслуживания (веб-сервис). Теперь я хочу использовать JoCoCo для создания отчета о покрытии кода. Таким образом, идея состоит в том, чтобы знать покрытие кода моего кода, работающего на weblogic, когда мы выполняем какое-либо действие, например, ручное использование сайта или запуск теста Junit. Я развернул файл уха на своем сервере weblogic. Как подключить JoCoCo к серверу weblogic? Не могли бы вы рассказать мне, как настроить JaCoCo с сервером weblogic и создать отчет.


person Unknown    schedule 20.06.2014    source источник


Ответы (2)


Если вам нужно получить покрытие кода для тестов по коду Java, то JaCoCo — очень хороший вариант, потому что вам не нужно предварительно инструментировать код, он сделает это на лету во время тестов.

Подключите JaCoCo к Weblogic JVM:

Сборщик JaCoCo присоединяется к JVM в качестве агента и постоянно собирает инструменты покрытия кода. Нам нужно добавить параметры JVM, чтобы настроить это.

Шаг 1. Для этого отредактируйте файл setDomainEnv.cmd или setDomainEnv.sh, добавив следующий параметр:

set JACOCO_PROPERTIES=-javaagent:c:/tools/jacoco-0.7.1-20140326.062324-3/lib/jacocoagent.jar=destfile=c:/temp/jacoco.exec,output=file,address=,includes=com.package

В том же файле добавьте это в переменную среды EXTRA_JAVA_PROPERTIES:

set
EXTRA_JAVA_PROPERTIES=-Dcommon.components.home=%COMMON_COMPONENTS_HOME%
-Djrf.version=11.1.1 -Dorg.apache.commons.logging.Log=org.apache.commons.logging.impl.Jdk14Logger
-Ddomain.home=%DOMAIN_HOME% -Djrockit.optfile=%COMMON_COMPONENTS_HOME%\modules\oracle.jrf_11.1.1\jrocket_optfile.txt
-Doracle.server.config.dir=%ORACLE_DOMAIN_CONFIG_DIR%\servers\%SERVER_NAME%
-Doracle.domain.config.dir=%ORACLE_DOMAIN_CONFIG_DIR% -Digf.arisidbeans.carmlloc=%ORACLE_DOMAIN_CONFIG_DIR%\carml -Digf.arisidstack.home=%ORACLE_DOMAIN_CONFIG_DIR%\arisidprovider -Doracle.security.jps.config=%DOMAIN_HOME%\config\fmwconfig\jps-config.xml
-Doracle.deployed.app.dir=%DOMAIN_HOME%\servers\%SERVER_NAME%\tmp_WL_user
-Doracle.deployed.app.ext=- -Dweblogic.alternateTypesDirectory=%ALT_TYPES_DIR% -Djava.protocol.handler.pkgs=%PROTOCOL_HANDLERS% %WLS_JDBC_REMOTE_ENABLED% %**JACOCO_PROPERTIES**%
%EXTRA_JAVA_PROPERTIES%

Шаг 2: Перезапустите сервер Weblogic Поскольку JaCoCo подключается к JVM, вам необходимо перезапустить сервер Weblogic. После повторного запуска JVM с помощью startWeblogic.sh или startWeblogic.cmd вы увидите, что расположение файла, указанное в списке destfile=c:/temp/jacoco.exec, будет создано. Изначально он будет пуст, но при выключении JVM он будет заполнен.

Шаг 3: Протестируйте свое приложение После подключения агента JaCoCo разверните приложение и запустите интеграционные тесты. JaCoCo будет анализировать код на лету и собирать информацию о покрытии на уровне инструкций и филиалов.

Шаг 4: Создайте отчет

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import org.jacoco.core.analysis.Analyzer;
import org.jacoco.core.analysis.CoverageBuilder;
import org.jacoco.core.analysis.IBundleCoverage;
import org.jacoco.core.analysis.IClassCoverage;
import org.jacoco.core.tools.ExecFileLoader;
import org.jacoco.report.DirectorySourceFileLocator;
import org.jacoco.report.FileMultiReportOutput;
import org.jacoco.report.IReportVisitor;
import org.jacoco.report.html.HTMLFormatter;

public class JaCoCoReportGenerator{
    private static String title = "Code Coverage";

    private static File executionDataFile = new File("your path where you have jacoco.exec");
    private static List<File> classesDirectory;
    private static List<File> sourceDirectory;
    private static File reportDirectory = new File("path where you want your report to be generated");
    private ExecFileLoader execFileLoader;


    public JaCoCoReportGenerator(){
        super();
        initializeClassFileList();
        initializeSourceFileList();
    }

    private void initializeClassFileList(){
        classesDirectory = new ArrayList<File>();
        File file0 = new File("class file path");
        classesDirectory.add(file0);
    }

    private void initializeSourceFileList(){
        sourceDirectory = new ArrayList<File>();
        File file0 = new File("source file path");
        sourceDirectory.add(file0);

    }

    public void create() throws IOException{

        // Read the jacoco.exec file. Multiple data files could be merged
        // at this point
        loadExecutionData();

        // Run the structure analyzer on a single class folder to build up
        // the coverage model. The process would be similar if your classes
        // were in a jar file. Typically you would create a bundle for each
        // class folder and each jar you want in your report. If you have
        // more than one bundle you will need to add a grouping node to your
        // report
        IBundleCoverage bundleCoverage = analyzeStructure();

        createReport(bundleCoverage);

    }

    private void createReport(IBundleCoverage bundleCoverage) throws IOException{

        // Create a concrete report visitor based on some supplied
        // configuration. In this case we use the defaults
        HTMLFormatter htmlFormatter = new HTMLFormatter();
        IReportVisitor visitor = htmlFormatter.createVisitor(new FileMultiReportOutput(reportDirectory));

        // Initialize the report with all of the execution and session
        // information. At this point the report doesn't know about the
        // structure of the report being created
        visitor.visitInfo(execFileLoader.getSessionInfoStore().getInfos(),execFileLoader.getExecutionDataStore().getContents());

        for (File sourceFile : sourceDirectory) {
            visitor.visitBundle(bundleCoverage,new DirectorySourceFileLocator(sourceFile,POSMConstant.ENCODING,4));
        }
        // Populate the report structure with the bundle coverage information.
        // Call visitGroup if you need groups in your report.

        // Signal end of structure information to allow report to write all
        // information out
        visitor.visitEnd();

    }


    private void loadExecutionData() throws IOException{
        execFileLoader = new ExecFileLoader();
        execFileLoader.load(executionDataFile);// Loading my jacoco.exe file
        analyzeStructure();
    }

    private IBundleCoverage analyzeStructure() throws IOException{
        final CoverageBuilder coverageBuilder = new CoverageBuilder();
        final Analyzer analyzer = new Analyzer(execFileLoader.getExecutionDataStore(),coverageBuilder);
        for (File classFile : classesDirectory) {
            analyzer.analyzeAll(classFile);// Analyzes all class files contained in the given file or folder. Folders are searched recursively.
        }
        return coverageBuilder.getBundle(title);
    }



    public static void main(String[] args) throws IOException{
        JaCoCoReportGenerator generator = new JaCoCoReportGenerator();
        generator.create();
    }

    }
person Unknown    schedule 22.10.2014

Модульные тесты не выполняются на сервере приложений. На самом деле, ресурсы Application Server считаются внешними зависимостями по отношению к модульному тесту, и их следует имитировать с помощью фиктивной среды. Следовательно, отчеты о покрытии кода могут быть созданы только при выполнении модульных тестов.

Возможно, вы имеете в виду автоматизированные функциональные тесты. Я не знаю об инструменте отчетности о покрытии для таких тестов.

person Amir Keibi    schedule 25.06.2014