✨博客主页: https://blog.csdn.net/m0_63815035?type=blog
💗《博客内容》:.NET、Java.测试开发、Python、Android、Go、Node、Android前端小程序等相关领域知识
📢博客专栏: https://blog.csdn.net/m0_63815035/category_11954877.html
📢欢迎点赞 👍 收藏 ⭐留言 📝
📢本文为学习笔记资料,如有侵权,请联系我删除,疏漏之处还请指正🙉
📢大厦之成,非一木之材也;大海之阔,非一流之归也✨
白盒测试与黑盒测试
一、白盒测试
1.白盒测试定义:白盒测试是基于软件内部结构的一种测试方法。(针对代码和程序逻辑)
2.白盒测试的目的:发现代码中的隐藏错误(逻辑错误、边界条件、异常处理缺陷),保证每个逻辑分支正确执行
3.白盒测试的常用方法:单元测试、语句覆盖、分支覆盖、路径覆盖、数据流分析
-
单元测试:编写代码测试程序中最小功能单位(一个函数或方法),输入不同数据验证函数的输出是否符合预期
+++
def grade(score): if score >= 90: return 'A' elif score >= 80: return 'B' elif score >= 70: return 'C' elif score >= 60: return 'D' else: return 'F'
+++
-
语句覆盖:执行代码中的每一行至少一次,确保没有遗漏的代码
-
解释:语句覆盖是一种最基本的覆盖方法,要求每一行代码都被执行。这并不要求所有的条件和逻辑都被测试,只要代码行被执行就行
-
如何测试:
-
用例 1:
grade(95)
,输出 ‘A’(覆盖if score >= 90
的分支) -
用例 2:
grade(75)
,输出 ‘C’(覆盖elif score >= 70
的分支) -
用例 3:
grade(50)
,输出 ‘F’(覆盖else
的分支)+++
-
-
分支覆盖:测试每个条件的每一个分支(True 或 False)
-
解释:分支覆盖要求测试代码中所有的条件分支,包括
if
和elif
的True
和False
情况。这样可以确保代码在各种条件下的行为是正确的 -
如何测试:
-
用例 1:
grade(95)
,覆盖if score >= 90
为True
的分支 -
用例 2:
grade(85)
,覆盖elif score >= 80
为True
的分支 -
用例 3:
grade(75)
,覆盖elif score >= 70
为True
的分支 -
用例 4:
grade(65)
,覆盖elif score >= 60
为True
的分支 -
用例 5:
grade(55)
,覆盖所有if
和elif
为False
的情况,走到else
分支
-
-
路径覆盖:测试代码中所有可能的执行路径
-
解释:路径覆盖是最严格的一种覆盖方法,要求测试程序中的每一条可能路径。包括每一条分支和条件的组合。例如,对于嵌套的
if-else
语句,路径覆盖会要求测试每一种嵌套组合 -
如何测试: 在上述示例中,由于每个条件(
if
和elif
)都是独立的,所有可能路径相对较少。主要路径包括:- 路径 1:
score >= 90
为True
,执行第一个分支,返回 ‘A’ - 路径 2:
score >= 90
为False
,score >= 80
为True
,执行第二个分支,返回 ‘B’ - 路径 3:
score >= 90
为False
,score >= 80
为False
,score >= 70
为True
,返回 ‘C’ - 路径 4:
score >= 90
为False
,score >= 80
为False
,score >= 70
为False
,score >= 60
为True
,返回 ‘D’ - 路径 5:所有条件都为
False
,执行else
分支,返回 ‘F’
解释:每一种路径都代表了代码中可能的执行顺序,通过测试这些路径,可以确保代码逻辑的全面覆盖
+++
- 路径 1:
-
数据流分析:检查变量的定义和使用,确保数据在程序中的流动是正确的
-
解释:数据流覆盖更关注变量的状态。它跟踪变量的定义、使用和销毁,检查代码中变量在每个位置的正确性。例如,检查一个变量在被使用之前是否被正确初始化
-
如何测试: 这个方法不直接适用于上述的
grade
函数,因为它更适合一些复杂函数,如涉及大量变量的计算函数。假设有如下代码:def calculate_area(radius): pi = 3.14 area = pi * (radius ** 2) return area
- 在这段代码中,
pi
在area
被计算时是一个已定义的变量。数据流覆盖会检查pi
是否在使用前被正确定义,并在后续过程中被正确使用
解释:数据流覆盖确保在代码执行过程中,每个变量都被正确使用,减少由于错误数据流导致的程序错误
+++
- 在这段代码中,
小结
-
语句覆盖:确保每行代码都被执行
-
分支覆盖:确保每个条件的
True
和False
分支都被测试 -
路径覆盖:测试所有可能的执行路径,验证代码中不同逻辑组合的正确性
-
数据流覆盖:检查变量在程序中的定义和使用情况,确保数据流的正确性
+++
二、黑盒测试
1.黑盒测试定义:黑盒测试是根据软件的功能和需求进行测试,而不关注其内部实现
2.黑盒测试的目的:通过模拟用户的操作发现软件的功能缺陷、界面问题和性能问题,保证功能的完整性和可靠性
3.黑盒测试的常用方法:等价类划分、边界值分析、决策表、因果图、错误推测法
+++
示例 :登录系统
假设有一个登录系统,需要输入用户名和密码,然后验证是否匹配。它的功能需求如下:
1.用户名长度必须在 4 到 12 个字符之间。
2.密码不能为空,且必须包含至少一个数字。
+++
-
等价类划分:将输入数据划分为不同的等价类,每个等价类代表一种输入情况,只需测试每个类中的一个值,就能覆盖整个类
-
解释:通过划分等价类,可以减少测试用例的数量。等价类分为有效等价类和无效等价类
如何划分
- 用户名:
- 有效等价类:用户名长度为 4-12 个字符。
- 无效等价类:用户名长度小于 4 或大于 12。
- 密码:
- 有效等价类:密码不为空。
- 无效等价类:密码为空。
测试用例
- 用例 1(有效):用户名 = “user1234”,密码 = “pass123”。
- 用例 2(无效):用户名 = “usr”,密码 = “pass123”(用户名长度小于 4)。
- 用例 3(无效):用户名 = “username_is_too_long”,密码 = “pass123”(用户名长度大于 12)。
- 用例 4(无效):用户名 = “user1234”,密码 = “”(密码为空)。
解释:通过划分等价类,我们确保覆盖了所有可能的输入类型。只要测试了每个等价类中的一个值,就可以代表该类的所有情况。
- 用户名:
+++
-
边界值分析:测试输入数据的边界条件>
-
解释:边界值分析关注输入值的边界,如最小值、最大值、刚超过边界和刚未到边界的值。常用来检测可能的溢出、越界等问题
如何分析
- 用户名长度:用户名必须是 4 到 12 个字符。边界值包括:
- 最小边界:4 个字符。
- 最大边界:12 个字符。
- 刚小于最小边界:3 个字符。
- 刚大于最大边界:13 个字符。
测试用例
- 用例 1(边界值):用户名 = “user”,密码 = “pass123”(4 个字符,最小边界)。
- 用例 2(边界值):用户名 = “user12345678”,密码 = “pass123”(12 个字符,最大边界)。
- 用例 3(边界值):用户名 = “usr”,密码 = “pass123”(3 个字符,刚小于最小边界)。
- 用例 4(边界值):用户名 = “user123456789”,密码 = “pass123”(13 个字符,刚大于最大边界)。
解释:通过测试边界值,我们能更好地发现程序在处理边界情况时的潜在问题,如输入限制不正确或处理异常情况失败。
- 用户名长度:用户名必须是 4 到 12 个字符。边界值包括:
+++
-
决策表:列出输入条件和可能的操作,通过组合不同条件来测试每个可能的输出情况>
-
解释:决策表是一种将输入条件与操作组合起来的表格,尤其适用于复杂的逻辑判断场景
如何构建决策表
假设登录系统有以下条件:
- 用户名有效(长度 4-12)。
- 密码非空。
每个条件有两种状态(满足或不满足),组合成一个决策表:
条件 规则 1 规则 2 规则 3 规则 4 用户名有效 是 是 否 否 密码非空 是 否 是 否 输出 允许登录 错误:密码为空 错误:用户名无效 错误:用户名无效且密码为空 测试用例
- 用例 1:用户名 = “user1234”,密码 = “pass123”(规则 1,允许登录)。
- 用例 2:用户名 = “user1234”,密码 = “”(规则 2,错误:密码为空)。
- 用例 3:用户名 = “usr”,密码 = “pass123”(规则 3,错误:用户名无效)。
- 用例 4:用户名 = “usr”,密码 = “”(规则 4,错误:用户名无效且密码为空)。
解释:决策表将所有条件的组合列举出来,确保每种可能的情况都得到了测试,适用于具有多个条件的复杂逻辑。
+++
-
错误推测法:基于测试者的经验和直觉,推测可能出现错误的地方
-
解释:错误推测法没有严格的规则,它依赖于测试者对常见错误的了解,如输入非法字符、空值、极端值等
如何进行错误推测
- 假设测试者认为系统可能在处理特殊字符时出错,可以尝试输入包含特殊字符的用户名和密码。
- 可能测试的输入:
- 用户名 = “user!@#$”,密码 = “pass123”(测试特殊字符)。
- 用户名 = “”,密码 = “pass123”(测试恶意代码注入)。
- 用户名 = " ",密码 = “pass123”(测试全空格)。
解释:错误推测法适用于不容易分类的测试场景,测试者通过经验和直觉来设计测试用例,往往能发现一些意想不到的问题。
+++
总结:白盒测试和黑盒测试的区别
特性 白盒测试 黑盒测试 测试视角 了解软件内部结构,关注代码细节 不了解内部结构,只关注功能和界面 测试内容 测试代码逻辑、路径、数据流 测试软件功能、性能、用户界面 测试方法 语句覆盖、分支覆盖、路径覆盖 等价类划分、边界值分析、错误推测 优点 发现代码中的隐藏错误,提高代码质量 贴近用户操作,发现功能缺陷 缺点 测试范围有限,难以发现外部接口问题 无法发现内部逻辑错误,需大量测试用例 白盒测试和黑盒测试通常结合使用,以确保软件的全面质量:白盒测试侧重于代码的正确性,黑盒测试则模拟用户操作,验证软件的功能性。
+++
今天这篇文章就到这里了,大厦之成,非一木之材也;大海之阔,非一流之归也。感谢大家观看本文