白盒测试探讨及使用

        白盒测试又称结构测试、透明盒测试、逻辑驱动测试或基于代码的测试。白盒测试是一种测试用例设计方法,盒子指的是被测试的软件,白盒指的是盒子是可视的,你清楚盒子内部的东西以及里面是如何运作的。"白盒"法全面了解程序内部逻辑结构、对所有逻辑路径进行测试。"白盒"法是穷举路径测试。在使用这一方案时,测试者必须检查程序的内部结构,从检查程序的逻辑着手,得出测试数据。

一、白盒测试基本概念

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覆盖率结果展示图:

jacoco覆盖率结果展示图

2.1.1)jacoco基本概念

行覆盖率:度量被测程序的每行代码是否被执行,判断标准行中是否至少有一个指令被执行。

类覆盖率:度量计算class类文件是否被执行。

分支覆盖率:度量if和switch语句的分支覆盖情况,计算一个方法里面的总分支数,确定执行和不执行的 分支数量。

方法覆盖率:度量被测程序的方法执行情况,是否执行取决于方法中是否有至少一个指令被执行。

圈复杂度:在(线性)组合中,计算在一个方法里面所有可能路径的最小数目,缺失的复杂度同样表示测 试案例没有完全覆盖到这个模块。

2.1.2)jacoco注入方式介绍


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注入示例

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使用示例

jmockit使用示例图

2.3)代码质量管理平台:sonar简介

        Sonar是一个代码质量管理平台,通过插件机制可以支持20多种开发语言代码质量管理与检测。通过不同的插件对搜集的结果进行再加工处理,通过量化的方式度量代码质量的变化,从而可以方便地对不同规模和种类的工程进行代码质量管理。同时 Sonar 还对大量的持续集成工具提供了接口支持,可以很方便地在持续集成中使用 Sonar。

Sonar可以从以下七个维度检测代码质量:

不遵循代码标准

潜在的缺陷

复杂度分析

重复率分析

注释率分析

单元测试覆盖率分析

耦合度分析

我们先看看sonar分析展示图:

sonar分析展示图

2.3.1)Sonar与maven集成配置

        sonar与maven集成,只需修改maven的settings.xml文件,加入以下内容即可:

soanr与maven集成图

2.3.2)Sonar与Ant集成配置

        soanr与Ant集成比较麻烦,需要在build.xml文件中引用相应的包,如:jacocoant.jar、sonar-ant-task-2.2.jar等。build.xml部分配置如下:

soanr与Ant集成图(一)

soanr与Ant集成图(二)

3)白盒测试执行

        白盒测试执行比较简单,可与jenkins集成,在持续集成过程中执行,也可在本地执行。

执行方式一:Jenkins构建过程中自动执行(jenkins+sonar+Ant/maven+jacoco+Findbugs集成)

执行方式二:本地Eclipse编译过程中自动执行(jenkins+sonar+ant/maven+jacoco+Findbugs集成)

4)白盒测试报告

        白盒测试报告可在sonar平台查看,比较方便,具体不在累述。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Java Jacoco Ant Maven 针对 Jacoco[http://www.eclemma.org/ja...
    纳爱斯阅读 53,729评论 64 52
  • 文章来自:http://blog.csdn.net/mj813/article/details/52451355 ...
    好大一只鹏阅读 9,226评论 2 126
  • 1.测试与软件模型 软件开发生命周期模型指的是软件开发全过程、活动和任务的结构性框架。软件项目的开发包括:需求、设...
    Mr希灵阅读 22,050评论 7 278
  • 1.测试与软件模型 软件开发生命周期模型指的是软件开发全过程、活动和任务的结构性框架。软件项目的开发包括:需求、设...
    宇文臭臭阅读 6,761评论 5 100
  • 小黑说我,一拍脑袋,想法就来!喜欢这样想做就做的模样!
    卿莹阅读 179评论 0 1