JAVA代码覆盖_第1页
JAVA代码覆盖_第2页
JAVA代码覆盖_第3页
JAVA代码覆盖_第4页
JAVA代码覆盖_第5页
已阅读5页,还剩14页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、 个人知识管理平台下共享资源的个性化推荐个人知识管理平台下共享资源的个性化推荐 王蕾王蕾 2013 Sina Weibo. JAVA代码覆盖工具 大纲大纲 代码覆盖的意义代码覆盖的意义1 JAVAJAVA常用常用覆盖工具 2 工具的工作原理工具的工作原理3 2 实例与问题实例与问题4 3 代码覆盖的意义代码覆盖的意义 p使用目的使用目的 n发现手工/自动化测试的遗漏点,并补充case n作为手工测试、UT及qa自动化测试全面性的衡量标准 p使用范围使用范围 n RD使用衡量单测覆盖率 nQA使用衡量测试覆盖率 p使用方式使用方式 n 手工测试中,通过环境搭建使用覆盖率工具 n持续集成中,通过h

2、udson插件根据自动化执行情况生成覆盖率 n自动化case开发中,通过eclipse的覆盖率插件使用 pJAVAJAVA常用覆盖率工具常用覆盖率工具 n Emma、Cobertura、Jacoco J A V AJ A V A 常 用 覆 盖 工 具常 用 覆 盖 工 具 jacocojacocoemmaemmacoberturacobertura 原理原理 使用asm修改字节码可以修改Jar文件、class文件字节码文件 基于jcoverage。基于ASM框架, 对class 插桩 覆盖粒度覆盖粒度 方法,类,行,分支和指令覆盖 语句、行、类、基本块、指令。无分支覆 盖。 项目,包,类,方

3、法的语句覆盖 和分支覆盖 插桩插桩 支持on-the-fly和offline的插桩模式支持on the fly模式和offline 采用Offline模式,把统计代码插 入编译好的.class文件 生成报告生成报告 在tomcat的catalina.sh中配置-javaagent参 数,指出要采集覆盖率的文件。默认在 shutdown时才能收集覆盖率数据。 html、xml、txt、二进制格式报表生成HTML或xml报告 缺点缺点 1、需要debug版本、并打开build.xml中的 debug编译项 2、需要源代码。必须与插桩的代码完全 一致 1、不能捕获测试案例中未考虑 的异常 2、关闭服

4、务器才能输出覆盖率 信息的结果(已有修改源代码的 解决方案,定时输出结果) 3、输出结果之前设置了hook, 会与某些服务器的hook冲突。 4、Web测试中需要将 cobertura.ser文件来回copy 性能性能 快比较小插入的字节码信息更多 执行方式执行方式 Ant/maven命令行maven,ant 或命令行 jenkins集成集成 生成html报告,直接与hudson集成,展 示覆盖率报告。无趋势图 无法与hudson集成 有现成的插件,有美观的报告, 并有趋势图 报告实时性报告实时性 默认在shutdown时收集覆盖率数据;可 动态从jvm dump出数据。 可以不关闭tomca

5、t 就得到覆盖率报告 默认是在shutdown服务器时才写 覆盖率文件 覆 盖 率 基 本 概 念覆 盖 率 基 本 概 念 p行覆盖率行覆盖率 n度量被测程序的每行代码是否被执行,判断标准行中是否至少有一个指令被执行。 p类覆盖率类覆盖率 n 度量计算class类文件是否被执行 p分支覆盖率分支覆盖率 n 度量if和switch语句的分支覆盖情况。计算一个方法里面的总分支数,确定执行和不 执行的分支数量。被执行(绿色方块) p方法覆盖率方法覆盖率 n 度量被测程序的方法执行情况,是否执行取决于方法中是否有至少一个指令被执行。 p指令覆盖指令覆盖 n计数单元是单个java二进制代码指令。指令覆

6、盖率提供了代码是否被执行的信息,度 量完全独立源码格式。 p圈复杂度圈复杂度 n在(线性)组合中,计算在一个方法里面所有可能路径的最小数目。缺失的复杂度同 样表示测试案例没有完全覆盖到这个模块 6 覆盖工具工作过程覆盖工具工作过程 p工作过程工作过程 n字节码插桩的过程 n执行测试用例,收集 程序执行轨迹的信息, 将其dump出内存 n数据处理:覆盖率信 息分析计算的过程 n数据显示:生成覆盖 率报告的过程 pOn-the-flyOn-the-fly插桩插桩 (java agentjava agent) nJVM中通过 javaagent参数指定特 定的 jar 文件启动 Instrument

7、ation 的 代理程序。 n代理程序在每装载一 个class前判断是否转 换修改class文件,将 统计代码插入.class。 测试覆盖率分析可以 在JVM执行测试代码 的过程中完成 n典型代表:jacoco。 插桩原理插桩原理 pOn-the-flyOn-the-fly插桩插桩:Class Loader:Class Loader n自定义classloader实现自己的类装载策 略,在加载到JVM前修改字节码 n典型代表:emma 8 插桩原理插桩原理 pOfflineOffline插桩插桩 n在测试前先对文件进行插桩,然后生成插过桩的class或jar包,测试插过桩 的class和jar

8、包后,会生成动态覆盖信息到文件,最后统一对覆盖信息进行 处理,并生成报告。 noffline插桩(Instrumentation)又分为两种: Repace:修改字节码生成新的class文件 Inject:在原有字节码文件上修改 n典型代表: cobertura pSource InstrumentationSource Instrumentation nSource Instrumentation(源代码插桩):把统计代码插入源代码并编译 成新的.class文件 pRuntime profilingRuntime profiling n应用JAVA的JVMPI(虚拟机监视程序接口)、JVMT

9、I( Java 虚拟机工具接 口)的接口实现。 pOn-the-flyOn-the-fly和和offlineoffline比较比较 nOn-the-fly模式更方便简单进行代码覆盖分析,无需提前进行字节码插桩, 无需考虑classpath 的设置 n存在如下情况不适合on-the-fly,需要采用offline提前对字节码插桩 运行环境不支持java agent 部署环境不允许设置JVM参数 字节码需要被转换成其他的虚拟机如Android Dalvik VM 动态修改字节码过程中和其他agent冲突 无法自定义用户加载类 插桩原理插桩原理 插桩方法插桩方法 p插桩方法插桩方法 n无论是静态还是

10、动态,插桩都涉及到修改二进制文件的字节码问题。 p怎么修改字节码怎么修改字节码 n开源工具asm,Javassist等 n根据class规范修改 p何时修改字节码何时修改字节码 nOn the fly模式 定义用户类装载器,实现自己的类装载策略 定义一个java agent:在类加载到虚拟机前先对其进行插桩 nOffline模式:在执行测试前 replace inject 1.实例实例 public static void example() a(); if (cond() b(); else c(); d(); 2.编译后的字节码编译后的字节码 public static example()

11、V INVOKESTATIC a()V INVOKESTATIC cond()Z IFEQ L1 INVOKESTATIC b()V GOTO L2 L1: INVOKESTATIC c()V L2: INVOKESTATIC d()V RETURN 3.Probe探针探针 探针是字节指令集能被插入java 方法中,探针执行行为被记录,探 针不能改变原有代码的 行为 示例该方法控制流图插入探针前 后的对比 实例实例-JACOCO-JACOCO原理原理 4.探针插入规则探针插入规则 探针插入在方法控 制流图的边上 理论上任何一条边 都可以插上probe, 但是会引发大量的 指令,增加class

12、file 大小,降低插桩后 的class执行效率 探针插入规则如有 简单顺序指令之间 插入一个probe 非条件的GOTO指 令前插入probe 在RETURN,throw 等语义退出方法前 插入probe 反转操作语义,在 满足条件跳转的后 方添加probe conditional jump. 实例实例-JACOCO-JACOCO原理原理 实例实例-JACOCO-JACOCO配置配置 3.通过通过exec文件生成报告文件生成报告 -V4模块覆盖率模块覆盖率 -engine模块覆盖率模块覆盖率 - On-the-fly 模式模式 build.xml示例示例 1. 配置配置on-the-fly在

13、类加载时插桩在类加载时插桩 JAVA_OPTS=xxxx - javaagent:/usr/home/wenping1/jaco co/lib/jacocoagent.jar=includes= * 2.实时实时 dump出覆盖率数据出覆盖率数据 JAVA_OPTS=xxxx - javaagent:/usr/home/wenping1/jaco co/lib/jacocoagent.jar=includes= *,output=tcpserver,port=10001,addr ess=57“ 实例实例-JACOCO-JACOCO配置配置 poffline offline

14、模式模式build.xmlbuild.xml示例示例 n配置instrument task n执行ant instrument插桩,将插桩后的class部署到测试环境 n收集exec数据收集同on-the-fly n产出报告同on-the-fly 代 码 覆 盖 问 题代 码 覆 盖 问 题 p覆盖率分析碰到的问题覆盖率分析碰到的问题 nqa能力要求较高。建议:对于能力不高的团队,建议一方面提高能力,另 一方面暂时让rd帮忙分析 n手工测试中,对于新项目,测试覆盖率数据比较可靠。但对于升级项目, rd只是增改部分函数和代码行,这时覆盖率不能反应升级功能的测试效果。 建议:开发使用diff覆盖率

15、工具;根据代码diff进行分析,也是qa的基本功 之一 n覆盖率结果没有标准,不同项目覆盖率差异较大。建议:目前还是以经验 为主,只要经过认真仔细的分析来补充case就好,覆盖率数据大小不重要 n覆盖率分析投入大,效果不明显,不如做好测试设计和code review。建议: 一个是事前的设计,一个是事后的验证,两个不是只能选其一的关系,而是 可以共同存在的。 16 Q&A 白盒测试与代码覆盖 p插桩技术插桩技术 1. 1.字节码插桩:字节码插桩:On-the-flyOn-the-fly(java agentjava agent) nJVM javaagent指定特定的 jar文件启动插桩代理程

16、序; 装载class过程中将统计指令插入class文件。 2. 2.字节码插桩:字节码插桩: On-the-fly(Class Loader)On-the-fly(Class Loader) n自定义classloader实现自己的类装载策略,在加载到JVM 前修改字节码 3. 3.字节码插桩:字节码插桩: OfflineOffline插桩插桩 n测试前对class或者jar包插桩,测试插过桩的class和jar包 4. 4.源码插桩源码插桩 n源代码插桩:将统计代码插入源代码并编译成新的.class文 件 5.Runtime profiling 5.Runtime profiling n应用

17、JAVA的JVMPI、JVMTI的接口实现 代码覆盖技术及实践代码覆盖技术及实践 p代码覆盖实践代码覆盖实践 1. 1.工具调研工具调研 nJaCoCo:支持java agent的on- the-fly,ASM修改字节码。确定代 码覆盖实践工具。 nEMMA:不支持分支覆盖,支持 class Loader的on-the fly nCobertura:offline插桩 2. 2.应用效果应用效果 n核心class自动化行覆盖率70%左 右 n完成6个核心接口的代码覆盖分析, 补充55个case,系统框架、存储策 略和接口流程逻辑图 n定性成果:QA深入理解产品,辅 助测试范围和影响定位、bug

18、定位 能力等。 p字节码技术字节码技术 n开源ASM,Javassist字节码操作框架 n根据class规范修改字节码 pProbeProbe探针探针 n探针:字节指令集,探针记录执行行为,探针不能改变原 有代码的行为 n插入规则:顺序指令、非条件跳转指令、条件跳转和退出 方法插入指令规则 pJUnit4JUnit4单元测试技术单元测试技术 1.Junit Annotation 1.Junit Annotation和反射和反射 nAnnotation:提供给与程序元素关 联任何信息或者任何元数据的途径。 n通过反射机制提取Annotation。 2. 2. JUnit JUnit生命周期生命周期 nBeforeClass、 Befor

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论