白盒测试又称结构测试、透明盒测试、逻辑驱动测试或基于代码的测试。白盒测试是一种测试用例设计方法,盒子指的是被测试的软件,白盒指的是盒子是可视的,你清楚盒子内部的东西以及里面是如何运作的。"白盒"法全面了解程序内部逻辑结构、对所有逻辑路径进行测试。"白盒"法是穷举路径测试。在使用这一方案时,测试者必须检查程序的内部结构,从检查程序的逻辑着手,得出测试数据。
一、白盒测试基本概念
1)白盒测试分类
2)白盒测试方法
二、白盒测试常用工具
代码分析检查工具:FindBugs、PMD
覆盖率工具:jacoco、EMMA
白盒测试工具:junit、testng
质量管理平台:SonarQube
编译工具:Ant、maven
Mock工具:Jmockit
数据库:mysql
持续集成工具:Jenkins
代码管理工具:SVN、git
2.1)覆盖率工具:jacoco简介
JaCoCo是一个开源的覆盖率工具(官网地址:http://www.eclemma.org/JaCoCo/),它针对的开发语言是java,其使用方法很灵活,可以嵌入到Ant、Maven中;可以作为Eclipse插件,可以使用其JavaAgent技术监控Java程序。很多第三方的工具提供了对JaCoCo的集成,如sonar、Jenkins等。
JaCoCo包含了多种尺度的覆盖率计数器,包含指令级覆盖(Instructions,C0coverage),分支(Branches,C1coverage)、圈复杂度(CyclomaticComplexity)、行覆盖(Lines)、方法覆盖(non-abstract methods)、类覆盖(classes)等。
我们先来看看jacoco覆盖率结果展示图:
2.1.1)jacoco基本概念
行覆盖率:度量被测程序的每行代码是否被执行,判断标准行中是否至少有一个指令被执行。
类覆盖率:度量计算class类文件是否被执行。
分支覆盖率:度量if和switch语句的分支覆盖情况,计算一个方法里面的总分支数,确定执行和不执行的 分支数量。
方法覆盖率:度量被测程序的方法执行情况,是否执行取决于方法中是否有至少一个指令被执行。
圈复杂度:在(线性)组合中,计算在一个方法里面所有可能路径的最小数目,缺失的复杂度同样表示测 试案例没有完全覆盖到这个模块。
2.1.2)jacoco注入方式介绍
说明:
1、 JaCoCo在Byte Code时使用的ASM技术修改字节码方法,可以修改Jar文件、class字节码文件。
2、JaCoCo同时支持on-the-fly和offline的两种插桩模式。
3、 On-the-fly模式中, JVM中通过-javaagent参数指定特定的jar文件启动Instrumentation的代理程序,代理程序在通过Class Loader装载一个class前判断是否转换修改class文件,将统计代码插入class,测试覆盖率分析可以在JVM执行测试代码的过程中完成。
4、offline模式中,在测试前先对文件进行插桩,然后生成插过桩的class或jar包,测试插过桩 的class和jar包后,会生成动态覆盖信息到文件,最后统一对覆盖信息进行处理,并生成报告。
On-the-fly和offline比较:
On-the-fly模式更方便简单进行代码覆盖分析,无需提前进行字节码插桩,无需考虑classpath 的设置。
存在如下情况不适合on-the-fly,需要采用offline提前对字节码插桩:
(1) 运行环境不支持java agent。
(2) 部署环境不允许设置JVM参数。
(3) 字节码需要被转换成其他的虚拟机如Android Dalvik VM。
(4) 动态修改字节码过程中和其他agent冲突。
(5) 无法自定义用户加载类。
5、jacoco最小支持java5。
2.1.3)jacoco注入示例
2.1.4)jacocoAgent简介
jacoco提供jacocoagent.jar,采用On-the-fly模式插桩,然后jacoco dump内存数据到本地,解析dump数据,得出代码覆盖率。
PS:具体配置方式请查看之前文章:《代码覆盖率解决方案》一文,在此不在累述。
地址://www.greatytc.com/writer#/notebooks/10195615/notes/10727392
2.2)mock工具:jmockit简介
JMockit是google code上面的一个java单元测试mock项目,是基于Java中的java.lang.instrument包开发,内部使用ASM库来动态修改java的字节码,可以Mock公共方法、私有方法、接口等。
2.2.1)Jmockit常用注解
@Mocked:被修饰的对象将会被Mock,对应的类和实例都会受影响(同一个测试用例中)
@Injectable:仅Mock被修饰的对象
@Capturing:可以mock接口以及其所有的实现类
@Mock:MockUp模式中,指定被Fake的方法
2.2.2)Jmockit常用类
Expectations:期望,指定的方法必须被调用
StrictExpectations:严格的期望,指定方法必须按照顺序调用
NonStrictExpectations:非严格的期望,是否调用和顺序不作要求
Verifications:验证,一般配合NonStrictExpectations来使用
Invocation:工具类,可以获取调用信息
Delegate:自己指定返回值,适合那种需要参数决定返回值的场景,只需指定匿名子类就可以。
MockUp:模拟函数实现
Deencapsulation:反射工具类
2.2.3)Jmockit使用示例
2.3)代码质量管理平台:sonar简介
Sonar是一个代码质量管理平台,通过插件机制可以支持20多种开发语言代码质量管理与检测。通过不同的插件对搜集的结果进行再加工处理,通过量化的方式度量代码质量的变化,从而可以方便地对不同规模和种类的工程进行代码质量管理。同时 Sonar 还对大量的持续集成工具提供了接口支持,可以很方便地在持续集成中使用 Sonar。
Sonar可以从以下七个维度检测代码质量:
不遵循代码标准
潜在的缺陷
复杂度分析
重复率分析
注释率分析
单元测试覆盖率分析
耦合度分析
我们先看看sonar分析展示图:
2.3.1)Sonar与maven集成配置
sonar与maven集成,只需修改maven的settings.xml文件,加入以下内容即可:
2.3.2)Sonar与Ant集成配置
soanr与Ant集成比较麻烦,需要在build.xml文件中引用相应的包,如:jacocoant.jar、sonar-ant-task-2.2.jar等。build.xml部分配置如下:
soanr与Ant集成图(一)
3)白盒测试执行
白盒测试执行比较简单,可与jenkins集成,在持续集成过程中执行,也可在本地执行。
执行方式一:Jenkins构建过程中自动执行(jenkins+sonar+Ant/maven+jacoco+Findbugs集成)
执行方式二:本地Eclipse编译过程中自动执行(jenkins+sonar+ant/maven+jacoco+Findbugs集成)
4)白盒测试报告
白盒测试报告可在sonar平台查看,比较方便,具体不在累述。