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

下载本文档

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

文档简介

1、JAVA代码覆盖工具,大纲,2,实例与问题,4,3,代码覆盖的意义,使用目的 发现手工/自动化测试的遗漏点,并补充case 作为手工测试、UT及qa自动化测试全面性的衡量标准 使用范围 RD使用衡量单测覆盖率 QA使用衡量测试覆盖率 使用方式 手工测试中,通过环境搭建使用覆盖率工具 持续集成中,通过hudson插件根据自动化执行情况生成覆盖率 自动化case开发中,通过eclipse的覆盖率插件使用 JAVA常用覆盖率工具 Emma、Cobertura、Jacoco,JAVA常用覆盖工具,覆盖率基本概念,行覆盖率 度量被测程序的每行代码是否被执行,判断标准行中是否至少有一个指令被执行。 类覆盖

2、率 度量计算class类文件是否被执行 分支覆盖率 度量if和switch语句的分支覆盖情况。计算一个方法里面的总分支数,确定执行和不执行的分支数量。被执行(绿色方块) 方法覆盖率 度量被测程序的方法执行情况,是否执行取决于方法中是否有至少一个指令被执行。 指令覆盖 计数单元是单个java二进制代码指令。指令覆盖率提供了代码是否被执行的信息,度量完全独立源码格式。 圈复杂度 在(线性)组合中,计算在一个方法里面所有可能路径的最小数目。缺失的复杂度同样表示测试案例没有完全覆盖到这个模块,6,覆盖工具工作过程,工作过程 字节码插桩的过程 执行测试用例,收集程序执行轨迹的信息,将其dump出内存 数

3、据处理:覆盖率信息分析计算的过程 数据显示:生成覆盖率报告的过程,On-the-fly插桩 (java agent) JVM中通过 javaagent参数指定特定的 jar 文件启动 Instrumentation 的代理程序。 代理程序在每装载一个class前判断是否转换修改class文件,将统计代码插入.class。测试覆盖率分析可以在JVM执行测试代码的过程中完成 典型代表:jacoco。,插桩原理,On-the-fly插桩:Class Loader 自定义classloader实现自己的类装载策略,在加载到JVM前修改字节码 典型代表:emma,8,插桩原理,Offline插桩 在测试

4、前先对文件进行插桩,然后生成插过桩的class或jar包,测试插过桩的class和jar包后,会生成动态覆盖信息到文件,最后统一对覆盖信息进行处理,并生成报告。 offline插桩(Instrumentation)又分为两种: Repace:修改字节码生成新的class文件 Inject:在原有字节码文件上修改 典型代表: cobertura Source Instrumentation Source Instrumentation(源代码插桩):把统计代码插入源代码并编译成新的.class文件 Runtime profiling 应用JAVA的JVMPI(虚拟机监视程序接口)、JVMTI(

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

6、vassist等 根据class规范修改 何时修改字节码 On the fly模式 定义用户类装载器,实现自己的类装载策略 定义一个java agent:在类加载到虚拟机前先对其进行插桩 Offline模式:在执行测试前 replace inject,1.实例 public static void example() a(); if (cond() b(); else c(); d(); ,2.编译后的字节码 public static example()V INVOKESTATIC a()V INVOKESTATIC cond()Z IFEQ L1 INVOKESTATIC b()V GOT

7、O L2 L1: INVOKESTATIC c()V L2: INVOKESTATIC d()V RETURN,3.Probe探针 探针是字节指令集能被插入java方法中,探针执行行为被记录,探针不能改变原有代码的 行为 示例该方法控制流图插入探针前后的对比,实例-JACOCO原理,4.探针插入规则 探针插入在方法控制流图的边上 理论上任何一条边都可以插上probe,但是会引发大量的指令,增加class file大小,降低插桩后的class执行效率 探针插入规则如有,简单顺序指令之间插入一个probe,非条件的GOTO指令前插入probe,在RETURN,throw等语义退出方法前插入prob

8、e,反转操作语义,在满足条件跳转的后方添加probe conditional jump.,实例-JACOCO原理,实例-JACOCO配置,3.通过exec文件生成报告 -V4模块覆盖率 -engine模块覆盖率 - ,On-the-fly 模式build.xml示例,1. 配置on-the-fly在类加载时插桩 JAVA_OPTS=xxxx -javaagent:/usr/home/wenping1/jacoco/lib/jacocoagent.jar=includes= * 2.实时 dump出覆盖率数据 JAVA_OPTS=xxxx -javaagent:/usr/home/wenping

9、1/jacoco/lib/jacocoagent.jar=includes= *,output=tcpserver,port=10001,address=57“,实例-JACOCO配置,offline 模式build.xml示例 配置instrument task 执行ant instrument插桩,将插桩后的class部署到测试环境 收集exec数据收集同on-the-fly 产出报告同on-the-fly,代码覆盖问题,覆盖率分析碰到的问题 qa能力要求较高。建议:对于能力不高的团队,建议一方面提高能力,另一方面暂时让rd帮忙分析 手工测试中,对于新项目,测试覆盖率数据

10、比较可靠。但对于升级项目,rd只是增改部分函数和代码行,这时覆盖率不能反应升级功能的测试效果。 建议:开发使用diff覆盖率工具;根据代码diff进行分析,也是qa的基本功之一 覆盖率结果没有标准,不同项目覆盖率差异较大。建议:目前还是以经验为主,只要经过认真仔细的分析来补充case就好,覆盖率数据大小不重要 覆盖率分析投入大,效果不明显,不如做好测试设计和code review。建议:一个是事前的设计,一个是事后的验证,两个不是只能选其一的关系,而是可以共同存在的。,16,Q&A,白盒测试与代码覆盖,插桩技术 1.字节码插桩:On-the-fly(java agent) JVM javaag

11、ent指定特定的 jar文件启动插桩代理程序;装载class过程中将统计指令插入class文件。 2.字节码插桩: On-the-fly(Class Loader) 自定义classloader实现自己的类装载策略,在加载到JVM前修改字节码 3.字节码插桩: Offline插桩 测试前对class或者jar包插桩,测试插过桩的class和jar包 4.源码插桩 源代码插桩:将统计代码插入源代码并编译成新的.class文件 5.Runtime profiling 应用JAVA的JVMPI、JVMTI的接口实现,代码覆盖技术及实践,代码覆盖实践 1.工具调研 JaCoCo:支持java agen

12、t的on-the-fly,ASM修改字节码。确定代码覆盖实践工具。 EMMA:不支持分支覆盖,支持class Loader的on-the fly Cobertura:offline插桩 2.应用效果 核心class自动化行覆盖率70%左右 完成6个核心接口的代码覆盖分析,补充55个case,系统框架、存储策略和接口流程逻辑图 定性成果:QA深入理解产品,辅助测试范围和影响定位、bug定位能力等。,字节码技术 开源ASM,Javassist字节码操作框架 根据class规范修改字节码 Probe探针 探针:字节指令集,探针记录执行行为,探针不能改变原有代码的行为 插入规则:顺序指令、非条件跳转指

13、令、条件跳转和退出方法插入指令规则,JUnit4单元测试技术 1.Junit Annotation和反射 Annotation:提供给与程序元素关联任何信息或者任何元数据的途径。 通过反射机制提取Annotation。 2. JUnit生命周期 BeforeClass、 Before、 Test、After、 AfterClass 3. JUnit 断言 Hamcrest :书写匹配器对象时允许直接定义匹配规则的框架。 assertThat:使用Hamcrest 的 Matcher匹配符灵活定义断言 测试构建 1.Maven构建 项目构建、依赖管理和项目信息管理工具 定义测试项目的pom.xml文件,确定依赖jar包远程仓库,构建测试工程 2.Maven生命周期 Clean Lifecy、 Clean Lifecycle 、 Site Lifecycle,单元测试技术及实践,Mock技术 1.mock场景 依赖于其他外部系统 依赖于结果

温馨提示

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

评论

0/150

提交评论