通过Jacoco生成黑盒测试覆盖率报告

背景

为了打通测试和开发界限,更好的保证产品质量,我们决定在黑盒测试的场景下分析代码的覆盖率情况,从而分析我们现有的case的完备程度,启发一些没有考虑到的场景。

好吧,以上为自动化组QA Manager的说辞,真实情况是他跑过来问我们能不能帮他们想想看能不能统计出他们自动化测试的代码覆盖率是多少。乍一听,有点蒙圈,意思黑盒测试还要看代码覆盖率的么,那我们写了这么多的白盒测试的UT是不是有点无地自容?虽然听起来启发一些测试场景还挺有道理的,但是感觉实际操作起来,个人觉得可能不一定那么理想。不过没关系!作为服务端的我们,就是要做好服务工作嘛!于是开始倒腾了一下,怎么能给黑盒测试统计处代码覆盖率。


原理

大概的原理如下:

  1. 以Jacoco Agent作为Java Option参数启动工程
  2. Jacoco Agent以tcp server的方式 dump出 jacoco.exec 数据文件
  3. 通过第三方工具,解析exec文件,从而得到覆盖率结果

当然,说的这么抽象的话,可能有些地方还是比较模糊的,我们就再更加具体一点。首先,我们知道Jacoco有两种处理方式on-the-fly和offline,一些更具体的内容,可以参考JAVA代码覆盖率工具JaCoCo-原理篇。简单点来讲,on-the-fly就是可以运行中进行埋点和数据采集,而offline则需要预先埋点。由于我们只是在测试环境进行一个数据收集而且能控制到环境中的Java Options,所以采用了在线的方式来统计结果,这样就可以拿到实时的数据而且无需中途停止或者重启服务器。

其次,在线的方式会使用到JVM本身提供的Intrumentation的特性,这种方式的主要原理就是通过调用JVM提供的接口,将所有需要load到虚拟机中的class进行自己的包装和修饰(具体在jacoco中就是行为埋点),可以理解为最终我们得到了一个全新的包含了埋点的class文件。具体可以参考一下Intrumentation相关的原理,其实其适用场景还有很多,如谈谈Java Intrumentation和相关应用

最后,得益于Jacoco的agent除了提供给我们普通file的方式外,还允许我们通过tcp server的方式,通过tcp连接来发送dump命令,并下载到相应的exec文件。这样我们就能远程不停机的情况下得到最新的覆盖率统计情况,从而解析得到报表。


实施

具体的实现步骤如下,部分需要根据需求进行取舍和更换:

  1. 下载jacoco的agent,并且在启动时以options的方式加入到启动参数中(注意使用tcpserver的方式启动):
java -jar xxx.jar -javaagent:$JACOCO_HOME/jacocoagent.jar=includes=com.xxx.yyy.*,output=tcpserver,port=8044,address=127.0.0.1 -Xverify:none 

这里主要是由于这个项目采用了jar直接运行的方式,如果采用的是war报部署tomcat之类的方式,可以采用在tomcat中加入angent的方式来运行,如Jacoco远程统计tomcat服务的代码覆盖率。(在如果没有办法加入javaagent的话,就只能选择离线的方式来获取dump,而走不通这种方案)

  1. dump覆盖率文件,并生成报告。这里有很多中方式可以处理,比如:
  • 通过eclipse的插件来直接获取和分析 Jacoco覆盖率使用总结
  • 通过ant编写xml来获取
  • 编写tcp连接来获取和生成(自己实现起来会比较复杂)

我们一开始实验了一下eclipse的emma插件,其实效果还是不错的,作为开发来说其实也挺方便的。但是考虑到我们实际面向是QA的同学,而且本身项目也是通过ant来进行管理的,所以最终选择了ant来进行处理,而且这种处理也利于后面我们集成到Jenkins中,加入到持续集成中。

xml的内容如下,且后续使用命令ant b_cover既可直接生成最终的html。其中reset和append参数需要特别注意一下,两者共同使用决定了你的覆盖率是否包含了上次已经被覆盖到的代码(代码中的$变量需要自己预先定义,这里没有写出来)

<target name="b_cover" xmlns:jacoco="antlib:org.jacoco.ant" >
        <jacoco:dump address="127.0.0.1" port="8044" reset="true" destfile="${report.dir}/remote/jacoco.exec" append="false" />
        <jacoco:report>
            <executiondata>
                <file file="${report.dir}/remote/jacoco.exec"/>
            </executiondata>
            <structure name="JaCoCo Report">
                <classfiles>
                    <fileset dir="${classes}">
                        <exclude name="**/*Test*.class" />
                        <include name="**/com/xxx/yyy/*.class"/>
                    </fileset>
                    <fileset dir="${test-classes}">
                        <exclude name="**/*Test*.class" />
                    </fileset>
                </classfiles>
                <sourcefiles encoding="UTF-8">
                    <fileset dir="${src.dir}"/>
                    <fileset dir="${test.dir}"/>
                </sourcefiles>
            </structure>

            <html destdir="${report.dir}/remote" />
            <csv destfile="${report.dir}/remote/report.csv" />
            <xml destfile="${report.dir}/remote/report.xml" />
        </jacoco:report>
    </target>

结论

最终,通过Jacoco的tcpserver,以及ant脚本的方式,统计出了API自动化测试的覆盖率。结果比我们想象的还理想一点,大概75%不到一点。不过具体的结果还没有进行仔细的分析,所以这个覆盖率的水分如何,以及是否真的有用,还不太清楚。

从个人的看法来说,这个主意虽然看起来还是有那么点意思,但是以下几点还值得商榷:

  1. 首先如果从覆盖率来看测试结果,感觉限制了QA的思考方向(说白了就是开发把测试往沟里带的感觉,毕竟测试的一个重要考量就是从非开发的角度去思考一些场景和问题)
  2. 其次感觉和白盒测试的工作有了一定的重叠,究竟这样能带来多大的好处或者说性价比,结论还有带商榷。
  3. 再者覆盖率是否真的能体现代码质量,对于做了非常多UT的我们,其实应该明白,答案是否定的。虽然覆盖率的代码质量多半不好,但是覆盖率高的代码质量好不好还真是一个未知数。
  4. 对测试同学的要求突然就高了很多,现实情况下很难达到。因为如果测试能看懂我们的代码的话其实开发起来也是完全ok的(TDD表示:先有鸡还是先有蛋)
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,362评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,330评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,247评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,560评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,580评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,569评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,929评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,587评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,840评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,596评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,678评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,366评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,945评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,929评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,165评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,271评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,403评论 2 342

推荐阅读更多精彩内容

  • tags: Java 前阵子使用 Jacoco 进行代码覆盖率测试,由于项目特殊遇到了不少坑,网上搜到的教程感觉也...
    LensAclrtn阅读 30,430评论 2 7
  • 一、代码覆盖率 通常我们在做单元测试的时候会接触到代码覆盖率的概念,通过在单元测试的过程中收集代码覆盖率去判断测试...
    _夏兮阅读 6,212评论 3 12
  • Java Jacoco Ant Maven 针对 Jacoco[http://www.eclemma.org/ja...
    纳爱斯阅读 53,411评论 64 52
  • 白盒测试又称结构测试、透明盒测试、逻辑驱动测试或基于代码的测试。白盒测试是一种测试用例设计方法,盒子指的是...
    yongliu1229阅读 2,701评论 0 4
  • day1,天太热了,不能再抱二宝出去了,中午给二宝讲了两则寓言故事《掩耳盗铃》《狐假虎威》。我不知道她有没有在听,...
    悦米时光阅读 135评论 0 2