如何让Jacobo集成测试报告与Jenkins合作



我正在尝试让我的集成(JavaAgent)测试在Jenkins中自动显示测试结果。目前我不知道有什么比更好的方法可以做到这一点

1) 使用JavaAgent运行集成测试并输出Jacobo.exec。(当前使用文件)

2) 编写一个shell脚本,将.exc/.classes/.bin复制到指定的jenkins构建中。

3) 运行Jenkins-Jacobo插件以显示覆盖范围。

然而,Jacobo插件不会拾取我的.exec文件。它只接收我的课程,所以它总是显示0%的覆盖率。

我创建了3个文件夹:exec、classes、src,并将所需的文件复制到这些位置。我可以看到我的类在jenkins上被正确读取,但exec文件从未被拾取,尽管它们具有相同的语法。我试过**/exec、**/*.exec、**/jacoco.exec和其他几种。**/类和**/*java似乎可以工作,但对exec来说不行。

这正是您所需要的。

例如:假设你有一个Java项目,在你的项目中ProjectABC

  • src/main/java:这里有您的主要源代码
  • src/test/java:这里有测试源代码。这些是单元测试
  • src/xxxTest/java:这里有一些xxx测试代码(其中xxx可以是integrationTest、acceptanceTest、seleniumTest或某种非单元测试

根据Maven/Ant/Gradle构建系统,何时运行构建和测试(注意单元测试在Maven和Gradle中免费运行)。

由于这些构建系统中的任何一个都使用Java来运行,一旦构建完成,您将在Maven/Gradle/ANT的Java JVM中生成一个jacoco.exc文件,用于单元测试。我将为单元测试生成的文件命名为jacocoUT.exec(即仅用于单元测试的jacoco-exec文件)。

随着构建/test/jar/war/etc的完成,您现在拥有了在Tomcat/类似容器后面运行项目的.war/.ear文件所需的一切。

假设您的项目创建了projectabc.war文件,并且您正在使用Tomcat。

您知道,要运行任何非单元测试,有两件事:1.你需要Tomcat/类似的——这需要另一个JAVA/JVM(即Tomcat将使用的)。

  1. 您需要.war文件和jacocoagent.jar文件。在单元测试运行期间,如果您的单元测试使用jacoco生成代码覆盖率,您将生成一个jacocoagent.jar文件(或者您可以四处搜索以获取此文件)

现在,这些是获得非单元测试代码覆盖率的操作(例如:集成测试)

我将首先将jacocoagent.jar附加到Tomcat的启动脚本(shell脚本)等中。如果您将以下内容添加到Tomcat启动脚本中已经使用的某个OPT变量中,或者您可以创建一个名为EXTRA_OPTS="…"的新变量,然后在Tomcat启动脚本中将其使用,就可以实现这一点。您在这里实际要做的是,您可以将jacocoagent.jar附加到Tomcat的JVM(被视为外部JVM,因为您的应用程序/项目的.war fiel将在该JVM中运行)。这将使jacoco现在对Tomcat可见。

例如:假设您创建了一个如下所述的新变量,并将其添加到Tomcat startup.sh脚本中(当您运行Tomcat时,它将被选中)。

export PROJ_EXTRA_JVM_OPTS="-javaagent:tomcat/jacocoagent.jar=destfile=somefolder/in/your/workspace/build_or_target_or_somecustom_folder/jacoco/IT/jacocoIT.exec,append=false"

注意:这里我将把jacocoagent.jar文件放在tomcat文件夹中。您可以将其放在任何位置,并将该路径用于javaagent变量的jacocoagent.jar文件。

现在,在Tomcat的startup.sh脚本中,您可以在Tomcat实际启动的地方添加这个变量。例如,这个启动脚本的快照看起来像:

## Tomcat command
TOMCAT_CMD="$JAVA_HOME/bin/java $TOMCAT_JVM_ARGS 
$OPTIT_JVM_ARGS 
... 
... 
$PROJ_EXTRA_JVM_OPTS 
-Dthc.tomcat.extrapaths=$TOMCAT_EXTRA_PATHS 
org.apache.catalina.startup.Bootstrap $TOMCAT_CFG_FILE_ARGS start"

正如您在上面看到的,现在我创建的变量正在使用,而Tomcat将启动(当我们运行具有命令行的Tomcat_CMD变量时)。

现在,当你把.war文件放在tomcat/webapps文件夹中并启动tomcat的startup.sh脚本时,你会在给定的路径上看到一个新的jacocoIT.exec文件(此时为0字节,因为你还没有运行任何非单元测试)。

此时,您将启动并运行Tomcat,并将项目的.war文件扩展到Tomcat/webapps文件夹+中的文件夹中。如果项目是一个应用程序,则在某台计算机(localhost/ip x.x.x:port/yourCoolApp)中运行。现在,它已经为您的非单元测试(也就是要运行的集成/验收测试/基于硒的etc测试)做好了准备。为了运行任何非单元测试,您需要使用项目的.war/.ear等文件启动/运行Tomcat/类似容器。

好的。此时,您将运行集成测试。您会注意到,如果您正在执行(tail-fcatalina.out)文件,那么在集成测试正在进行/运行时,catalina.outlog文件中正在进行一些活动/命中。

此时,您的jacocoIT.exec文件仍然是(0字节或一些字节),请稍候,因为这还不是用于IT测试的有效/填充的jacoco代码覆盖率文件。

假设您的IT测试(gradle/Maven方式)现在已经完成,您将最终停止Tomcat(比如运行一些stopTomcat.sh shell脚本)。

此时,您将获得一个完全填充的jacocoIT.exec文件(因为在停止Tomcat实例后,它将把所有代码覆盖率数据刷新到jacocoIT.exc文件中)。

根据您运行的是IT、AT(验收测试)还是ST(硒测试),您可以相应地命名jacocoXX.exec文件。

因此,您已经完成了Tomcat启动+运行IT测试+停止Tomcat+获取有效/已填充的jacocoIT.exec文件。

注意:重要的是要停止Tomcat以获取已填充的jacocoIT.exec文件,否则它将不是有效的代码覆盖率文件。Tomcat停止后,文件大小会增加,这是另一个迹象,表明您在那里得到了一些好东西。

如果您以某种方式在应用程序代码中转储代码覆盖率数据,或者使用tcp方式捕获代码覆盖率,则不必停止tomcat。当您不想停止Tomcat实例时(即,如果您想在应用程序需要启动和运行的INT、QA等环境中获得IT测试的代码覆盖率,该怎么办),这很有用。查看jacoco文档,了解如何在不停止Tomcat/类似应用程序容器实例的情况下获得代码覆盖率。

现在所要做的就是将这个jacocoIT.exec(集成测试)文件放在jacocoUT.exec文件(单元测试)旁边,然后使用"**/*.exec"模式;基本上使用两个.exec文件(或者运行的各种测试的多个.exe文件)来获得代码覆盖率。

这就是我在詹金斯所做的。

  1. 主项目作业,签出代码,运行构建(包括测试),在主作业的工作区中,我有jacocoUT.exec文件(如果单元测试存在并运行)。

  2. 我触发/调用另一个子作业/下游作业来运行IT测试,并执行以下操作(在此子作业运行期间,主作业被阻止/搁置,直到子作业完成其工作):a.使用相同的更改/修订进行签出,设置用于签出的主构建作业,然后导出PROJECT_EXTRA_JVM_OPTS变量。在Tomcat启动脚本中,已经使用了它。这里我传递了我的测试类型是IT,即它将创建jacocoIT.exec文件。b.我使用Copy Artifact插件,从主构建作业的最新工作空间中获取.war和jacocoagent jar文件,并将文件放在各自的位置。c.我启动Tomcatd.我进行集成测试。e.我停止Tomcatf.我在Jenkins中运行/发布jacoco报告(Gradle中的jacocoTestReport)或Jacobo插件。这只是用于IT测试的jacoco报告(仅使用jacocoIT.exec文件)。

  3. 现在控件返回到主项目/构建作业,在这里我使用a.再次复制工件插件。这一次是从CHILD作业的工作区获取jacocoIT.exec文件,并将其放在jacocoIT.exc文件旁边的某个文件夹/位置(即build/jacoco/UT/jacocoUT.exec和build/jacco/it/jacocoIT.exec)。

  4. 现在,我可以很容易地使用Jacobo(Gradle的jacocoTestReport任务)或Jacobo插件(**/*.exec模式)来显示/获取/发布组合的Jacobo代码覆盖率(用于单元和集成测试)。如果有超过这两种类型的测试,如for ex、jacocoST.exec(用于selenium测试),则可以获得相同的测试,然后使用3个测试获得组合代码覆盖率。

注意:代码覆盖率是指在运行测试(单元/集成等)时,了解您在MAIN源代码中覆盖了多少代码(各种计数器)。

  1. 最后,我调用sonarRunner(Gradle任务)或声纳分析,并将sonar属性设置为读取.exc文件和其他属性值,并在sonar中获得组合报告。你应该看看SonarQube中的"视图组合插件"(看看它有什么作用)。使用投资组合插件,您可以在Sonar中创建不同团队、人员、项目类型等的各种顶级视图和度量,并获得组合的Sonar度量

相关内容

  • 没有找到相关文章

最新更新