Unit testing 针对Weblogic server上运行的IntegrationTests的Jacoco代码覆盖率报告

Unit testing 针对Weblogic server上运行的IntegrationTests的Jacoco代码覆盖率报告,unit-testing,weblogic,integration-testing,code-coverage,jacoco,Unit Testing,Weblogic,Integration Testing,Code Coverage,Jacoco,我已经为不同的域类和服务类(Webservice)编写了单元测试。现在我想使用JoCoCo生成代码覆盖率报告。 因此,我们的想法是,当我们执行一些操作(如手动使用站点或启动Junit测试)时,了解我在weblogic上运行的代码的代码覆盖率。 我已经在我的weblogic服务器中部署了ear文件。如何将JoCoCo连接到weblogic服务器? 您能告诉我如何使用weblogic服务器配置JaCoCo并生成报告吗。单元测试不在应用程序服务器上运行。事实上,应用服务器资源被认为是单元测试的外部依赖

我已经为不同的域类和服务类(Webservice)编写了单元测试。现在我想使用JoCoCo生成代码覆盖率报告。 因此,我们的想法是,当我们执行一些操作(如手动使用站点或启动Junit测试)时,了解我在weblogic上运行的代码的代码覆盖率。 我已经在我的weblogic服务器中部署了ear文件。如何将JoCoCo连接到weblogic服务器?
您能告诉我如何使用weblogic服务器配置JaCoCo并生成报告吗。

单元测试不在应用程序服务器上运行。事实上,应用服务器资源被认为是单元测试的外部依赖项,应该使用模拟框架进行模拟。因此,代码覆盖率报告只能在单元测试运行时生成


您所指的可能是自动化功能测试。我不知道有哪种测试的覆盖率报告工具。

如果您需要获得针对Java代码的测试的代码覆盖率,那么JaCoCo是一个非常好的选择,因为您不需要事先插入代码,它将在测试过程中动态地执行

将JaCoCo连接到Weblogic JVM:

JaCoCo收集器将其自身作为代理连接到JVM,并持续收集代码覆盖工具。我们需要添加JVM参数来进行设置

步骤1: 要执行此操作,请编辑setDomainEnv.cmdsetDomainEnv.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
在同一文件中,将其添加到额外的JAVA_属性环境变量:

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服务器。使用startWeblogic.sh或startWeblogic.cmd再次启动JVM后,将创建列出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();
    }

    }
导入java.io.File;
导入java.io.FileInputStream;
导入java.io.FileOutputStream;
导入java.io.FileWriter;
导入java.io.IOException;
导入java.util.ArrayList;
导入java.util.List;
导入org.jacoco.core.analysis.Analyzer;
导入org.jacoco.core.analysis.CoverageBuilder;
导入org.jacoco.core.analysis.IBundleCoverage;
导入org.jacoco.core.analysis.IClassCoverage;
导入org.jacoco.core.tools.ExecFileLoader;
导入org.jacoco.report.DirectorySourceFileLocator;
导入org.jacoco.report.FileMultiReportOutput;
导入org.jacoco.report.IReportVisitor;
导入org.jacoco.report.html.HTMLFormatter;
公共类JaCoCoReportGenerator{
私有静态字符串title=“代码覆盖率”;
私有静态文件executionDataFile=新文件(“您拥有jacoco.exec的路径”);
私有静态列表类目录;
私有静态列表源目录;
私有静态文件reportDirectory=新文件(“您希望生成报告的路径”);
私有ExecFileLoader ExecFileLoader;
公共报告生成器(){
超级();
初始化ClassFileList();
初始化资源列表();
}
private void initializeClassFileList(){
classesDirectory=newarraylist();
文件file0=新文件(“类文件路径”);
classesDirectory.add(file0);
}
private void initializeSourceFileList(){
sourceDirectory=newarraylist();
文件file0=新文件(“源文件路径”);
sourceDirectory.add(file0);
}
public void create()引发IOException{
//读取jacoco.exec文件。可以合并多个数据文件
//此时
loadExecutionData();
//在单个类文件夹上运行结构分析器以构建
//覆盖率模型。如果您的类
//在jar文件中。通常,您会为每个文件创建一个包
//类文件夹和报告中所需的每个jar
//您需要将一个分组节点添加到多个捆绑包中
//报告
IBundleCoverage bundleCoverage=analyzeStructure();
createReport(bundlecoraverage);
}
私有void createReport(ibundleverage bundleverage)引发IOException{
//根据所提供的一些信息创建一个具体的报表访问者
//配置。在本例中,我们使用默认值
HTMLFormatter HTMLFormatter=新的HTMLFormatter();
IReportVisitor=htmlFormatter.createVisitor(新文件MultiReportOutput(reportDirectory));
//使用所有执行和会话初始化报告
//信息。此时报告不知道
//正在创建的报告的结构
visitonfo(execFileLoader.getSessionInfoStore().getInfos(),execFileLoader.getExecutionDataStore().getContents());
用于(文件sourceFile:sourceDirectory){
visitor.visitBundle(bundlecorerage,新的DirectorySourceFileLocator(sourceFile,POSMConstant.ENCODING,4));
}
//使用包覆盖率信息填充报告结构。
//如果报告中需要组,请调用visitGroup。
//发出结构结束信息的信号,以允许报告写入所有
//信息输出
visiter.visitEnd();
}
私有void loadExecutionData()引发IOException{
execFileLoader=新的execFileLoader();
加载(executionDataFile);//加载我的jacoco.exe文件
解析结构();
}
私有IBundleCoverage analyzeStructure()引发IOException{
最终Coverage Builder Coverage Builder=新Coverage Builder();