你也许测试工作中了解过白盒测试,但是一直没有机会做白盒测试,希望这篇文章能够帮到你,指引你迈入白盒测试实践之路。
1.什么是白盒测试?
白盒测试也称逻辑驱动测试,是针对被测单元内部是如何进行工作的测试。它根据程序的控制结构设计测试用例,主要用于软件程序验证,属于基于代码的测试技术。与之相对应的黑盒测试是从用户角度对软件进行测试。
1.1 白盒测试测什么?
白盒测试涉及以下测试内容:
- 内部安全漏洞
- 编码规范
- 预期输出
- 条件循环的功能
- 分别测试每个语句、对象和功能
白盒测试可以在软件开发的系统、集成和单元测试阶段进行。
1.2 如何进行白盒测试?
白盒测试可以分为两个基本步骤:
- 了解源代码
测试人员经常要做的一件事是学习和理解应用程序的源代码。由于白盒测试涉及对应用程序内部逻辑工作的测试,因此测试人员必须非常了解所测试应用程序的编程语言。
- 创建并执行测试用例
白盒测试的第二个步骤是测试应用程序的源代码,以验证其流程和逻辑运行的正确性。测试源代码的方法是编写更多测试代码,为应用程序中的每个函数开发一定场景的测试用例。
1.3 白盒测试案例
被测代码如下:
Printme(int a,int b){ int c = a b; if(c > 0){ System.out.println("正",c) } else{ System.out.println("负",c) }
白盒测试的目的是验证代码中的所有决策分支、循环、语句。
为了验证上述示例代码中的语句,白盒测试用例设计为:
- A = 1,B = 1
- A = -1,B = -3
1.4 白盒测试技术
白盒测试的实现方法有代码检查法、静态结构分析法、静态质量度量法、代码覆盖率分析技术和程序变异。代码覆盖率分析技术能够发现测试用例执行未能覆盖到的程序。而一旦发现存在测试用例覆盖盲区,就可以创建测试用例以验证未经测试的代码部分,从而提高软件产品的质量。
以下是白盒测试的几种覆盖率分析技术:
语句覆盖:这种技术要求在软件工程的测试过程中,至少对代码中的每个可能的语句进行一次测试。
分支覆盖:它要求覆盖软件应用程序的每个可能路径(if-else和其他条件循环)。
除上述内容外,还有条件覆盖,多个条件覆盖,路径覆盖,功能覆盖等。每种技术都有其自身的优点,并尝试测试(覆盖)软件代码的所有部分。使用语句和分支覆盖率,通常可以达到80-90%的代码覆盖率,这已经比较充分了。
- 语句覆盖
- 决策覆盖
- 分支覆盖
- 条件覆盖
- 多条件覆盖
- 路径覆盖
- 控制流测试
- 数据流测试
1.5 白盒测试类型
白盒测试包含几种用于评估应用程序,代码块或软件包的可用性的测试类型。
- 单元测试: 通常是在应用程序上进行的第一类测试。单元测试是在开发每个单元或代码块时执行的。单元测试本质上是由开发人员完成的。作为软件开发人员需要开发测试代码,对一个函数或一个对象进行测试,以确保可以正常工作,然后再继续进行单元测试,以在软件开发生命周期的早期识别出大多数缺陷。
- 测试内存泄漏:内存泄漏是导致应用程序运行缓慢的主要原因。如果软件应用程序运行缓慢,那么具有丰富的检测内存泄漏经验的质量保证专家就很容易发现问题所在。
1.7 白盒测试的优点
- 项目初期就能发现代码隐藏的缺陷并进行优化。
- 白盒测试用例可以轻松实现自动化。
- 通常涵盖所有代码路径,因此测试更加彻底。
1.8 白盒测试的缺点
- 白盒测试实现相对复杂。
- 通常执行白盒测试用例的开发人员会反感。然而,开发人员不进行白盒测试,软件更容易产生缺陷。
- 白盒测试需要测试人员十分熟练编程。
好了,介绍了白盒测试概述后,下面就对白盒测试的代码覆盖率技术进行实践。
2.代码覆盖率实践
代码覆盖率是一种度量,它描述了对程序源代码的测试程度。这是白盒测试的一种手段,它可以发现测试用例无法覆盖到的程序。测试人员可以创建代码覆盖缺失的测试用例,以增加覆盖率并确定代码覆盖率的定量度量。
在大多数情况下,代码覆盖系统会收集有关正在运行程序的信息,它还将其与项目源代码信息相结合,以生成有关测试套件的代码覆盖率的报告。
以下是进行代码覆盖率的一些主要原因:
- 它可以帮助你评估测试的有效性
- 它提供了定量测量手段
- 它帮助你了解对源代码测试程度。
2.1 代码覆盖方法
以下是主要的代码覆盖方法:
- 语句覆盖
- 分支覆盖
- 条件覆盖
- 路径覆盖
2.1.1 语句覆盖
语句覆盖是一种白盒测试技术,其中源代码中的所有可执行语句至少执行一次。它用于计算源代码中已执行的语句数。语句覆盖的主要目的是覆盖源代码中所有可能的路径、行和语句。
在“白盒测试”中,测试人员专注于软件程序的“工作”方式。
通常,在任何软件中,如果我们查看源代码,都会有各种各样的元素,例如运算符、函数、循环、异常处理程序等。根据程序的输入,某些代码语句可能不会执行。
让我们通过一个示例来了解如何计算语句覆盖率。
在这里,我们采用两种不同的方案来检查每种方案的语句覆盖率。
源代码:
print(int a,int b){ ------------ Printsum是一个函数 int result = a b; if(result> 0) print("Positive",result) else print("Negative",result) } -----------源代码结尾
方案1:
如果A = 3,B = 9
黄色标记的是根据业务情景执行的语句
已执行的语句数= 5,语句总数= 7
语句覆盖率:5/7 = 71%
方案2:
如果A = -3,B = -9
黄色标记的是根据业务场景执行的语句。
执行语句数= 6
语句总数= 7
语句覆盖率:6/7 = 85%
但是总的来说,所有的未覆盖的语句都被第二种方案所覆盖。因此我们可以得出结论,语句覆盖率为100%。
语句覆盖范围是什么?
- 未执行的语句
- Dead Code
- 未执行的分支
2.1.2 分支覆盖
分支覆盖是一种白盒测试方法,其中对来自代码模块(语句或循环)的每个结果进行测试。分支覆盖的目的是确保来自每个分支的每个决策条件至少执行一次。它有助于测量独立代码段的百分比,并找出没有分支的部分。
例如,如果结果是布尔类型,则需要同时测试True和False结果。计算分支覆盖率的公式:
要了解分支机构的覆盖范围,让我们考虑之前使用的相同示例:
代码语言:javascript复制Demo(int a) {
If (a> 5)
a=a*3
Print (a)
}
分支覆盖范围也将考虑无条件分支
测试用例 | a | 输出 | 分支覆盖率 |
---|---|---|---|
1 | 2 | 2 | 33% |
2 | 6 | 18 | 67% |
分支覆盖率具有以下优点:
- 能让你验证代码中的所有分支
- 帮助你确保没有分支导致程序操作的任何异常
- 分支覆盖方法可消除由于语句覆盖测试产生的问题
- 使你可以找到其他测试方法未测试的区域
- 分支覆盖率会忽略布尔表达式内部的分支
2.1.3 条件覆盖
条件覆盖是一种测试方法,用于测试和评估条件语句中的变量或子表达式。条件覆盖的目标是检查每个逻辑条件的单个结果。与判定覆盖相比,条件覆盖对控制流的敏感性更高。
条件覆盖率的计算公式:
例子:
对于以上表达式,我们有4种可能的组合:
- TT
- FF
- TF
- FT
考虑以下输入
X = 3 Y = 4 | (x <y) | True | 条件覆盖率为¼= 25% |
---|---|---|---|
A = 3 B = 4 | (a> b) | False |
2.1.4 路径覆盖
路径覆盖是一种结构测试方法,涉及使用程序的源代码来查找每个可能的可执行路径。此方法旨在程序执行所有或选定的路径。下面举一个简单的例子,以更好地了解什么是基本路径覆盖。
在上面的示例中,有3条路径或条件需要进行测试才能获得输出,
- 路径1:1、2、3、5、6、7
- 路径2:1、2、4、5、6、7
- 路径3:1、6、7
基本路径覆盖涉及的基本步骤包括
- 绘制控制图(以确定不同的程序路径)
- 计算圈复杂度(用于确定独立路径数的度量)
- 找到一组基本路径
- 生成测试用例以练习每条路径
基本路径测覆盖的优点
- 它有助于减少冗余测试
- 它着重于程序逻辑
- 它有助于简化分析和任意案例设计
- 具有练习集的测试用例将至少执行一次程序中的每个语句
2.2 代码覆盖率与功能覆盖率比较
代码覆盖率 | 功能覆盖 |
---|---|
代码覆盖率告诉您测试平台对源代码的执行情况 | 功能覆盖范围衡量测试平台对设计功能的覆盖程度 |
切勿使用设计规范 | 使用设计规范 |
由开发人员完成 | 由测试人员完成 |
2.3 代码覆盖率工具
以下是流行的代码覆盖率工具的列表:
工具名称 | 介绍 |
---|---|
Cobertura | 开源代码覆盖工具。它通过检测代码库来衡量测试覆盖率,并分析测试用例套件运行时正在执行的代码行和未执行的代码行。 |
Clover | Clover通过仅运行覆盖自上次构建以来已修改的应用程序代码的测试来减少测试时间。 |
DevPartner | DevPartner使开发人员能够分析Java代码的代码质量和复杂性。 |
Emma | EMMA支持类、方法、行和基本块覆盖范围,聚合的源文件、类和方法级别。 |
Kalistick | Kalistick是第三方应用程序,它以不同的角度分析代码。 |
CoView & CoAnt | 此软件是用于度量标准、模拟对象创建、代码可测试性、路径和分支覆盖率等的代码覆盖率工具。 |
Bullseye for C | BulseyeCoverage是C 和C的代码覆盖工具。 |
Sonar | Sonar是一个开源的代码覆盖率工具,可以管理代码质量。 |
Jacoco | Jacoco是一个开源的针对java语言的覆盖率工具 |
3 总结
- 代码覆盖率是一种度量,它描述了程序源代码已经过测试的程度
- 它可以帮助你评估测试执行的效率
- 语句覆盖涉及至少一次执行源代码中的所有可执行语句
- 判定覆盖率报告每个布尔表达式的正确或错误结果
- 在分支机构中,将测试代码模块的所有结果
- 条件语句将揭示如何评估条件语句中的变量或子表达式
- 代码覆盖率告诉你测试用例对源代码的执行情况,而功能覆盖率则衡量设计功能被覆盖的程度
- Cobertura、JTest、Clover、Emma和Kalistick是一些重要的代码覆盖工具
- 代码覆盖率使你可以创建额外的测试用例以增加覆盖率
- 代码覆盖率无法帮助您确定我们是否测试了功能的所有可能值