插桩原理On-the-fly插桩: Class Loader自定义classloader实现自己的类装载策略, 在加载到JVM前修改字节码典型代表: emma 插桩原理Offline插桩在测试前先对文件进行插桩, 然后生成插过桩的class或jar包, 测试插过桩的class和jar包后, 会生成动态覆盖信息到文件, 最后统一对覆盖信息进行处理, 并生成报告。offline插桩( Instrumentation) 又分为两种:Repace: 修改字节码生成新的class文件Inject: 在原有字节码文件上修改典型代表: cobertura8Source InstrumentationSource Instrumentation( 源代码插桩) : 把统计代码插入源代码并编译成新的.class文件Runtime profiling应用JAVA的JVMPI( 虚拟机监视程序接口) 、 JVMTI( Java 虚拟机工具接口) 的接口实现。 On-the-fly和offline比较On-the-fly模式更方便简单进行代码覆盖分析, 无需提前进行字节码插桩,无需考虑classpath 的设置存在如下情况不适合on-the-fly, 需要采用offline提前对字节码插桩运行环境不支持java agent部署环境不允许设置JVM参数字节码需要被转换成其他的虚拟机如Android Dalvik VM动态修改字节码过程中和其他agent冲突无法自定义用户加载类插桩原理 插桩方法插桩方法无论是静态还是动态, 插桩都涉及到修改二进制文件的字节码问题。怎么修改字节码开源工具asm, Javassist等根据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()VINVOKESTATIC a()VINVOKESTATIC cond()ZIFEQ L1INVOKESTATIC b()VGOTO L2L1 : INVOKESTATIC c()VL2: INVOKESTATIC d()VRETURN3 Probe探针3.Probe探针探针是字节指令集能被插入java方法中, 探针执行行为被记录, 探针不能改变原有代码的 行为示例该方法控制流图插入探针前后的对比实例-JACOCO原理 4.探针插入规则探针插入在方法控制流图的边上理论上任何一条边都可以插上probe,但是会引发大量的指令指令, 增加class file增加 lfil简单顺序指令之间插入一个probe非条件的GOTO指令前插入probe实例-JACOCO原理大小, 降低插桩后的class执行效率探针插入规则如有在RETURN, throw等语义退出方法前插入probe反转操作语义, 在满足条件跳转的后方添加probe conditional jump. 实例-JACOCO配置3.通过exec文件生成报告 javaagent:/usr/home/wenping1 /jacoc-------------------------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/wenping1 /jacoco/lib/jacocoagent.jar=includes= *,output=tcpserver,port=1 0001 ,address=1 0.75.0.1 57“ 实例-JACOCO配置offline 模式build. xml示例配置instrument task执行ant instrument插桩, 将插桩后的class部署到测试环境收集exec数据收集同on-the-fly产出报告同on-the-fly 代 码 覆 盖 问 题覆盖率分析碰到的问题qa能力要求较高。 建议: 对于能力不高的团队, 建议一方面提高能力, 另一方面暂时让rd帮忙分析手工测试中, 对于新项目, 测试覆盖率数据比较可靠。 但对于升级项目,rd只是增改部分函数和代码行, 这时覆盖率不能反应升级功能的测试效果。