白盒技术之数据流测试


五星上将麦克阿瑟曾经说过“不会写自动化测试,不是好开发“
在这里插入图片描述

让我们来讲一个故事

今天和女朋友吵架了,(假设你有女朋友)。

今晚又是一个人睡沙发,这天晚上,你躺在沙发上,夜不能寐

因为,你没有发现这段代码的问题所在


def compute_square_root(x):
    x = x ** 0.5 # 计算x的平方根,重新赋值给x
    return x

x = 9 # 定义变量x
print(compute_square_root(x)) # 输出将为3.0
print(x) # 输出将为9

决定学习一下这个事情——白盒技术之数据流测试

什么是数据流测试:

是结构测试的一种。它是根据程序中变量的定义和使用位置来查找程序测试路径的方法。它与数据流程图无关。此外,它还涉及:

变量接收值的语句,

使用或引用这些值的语句。

为了说明数据流测试的方法,假设程序中的每个语句分配了唯一的语句号。对于声明编号 S-


DEF(S) = {X | 语句 S 包含 X 的定义} 
USE(S) = {X | 语句 S 包含 X 的使用}

如果语句是循环或 if 条件,则其 DEF 集为空,而 USE 集基于语句的条件。数据流测试使用控制流图来查找可能中断程序流的情况。在值和变量之间关联时检测数据流中的引用或定义异常。这些异常现象是:

变量已定义但未使用或引用,

变量被使用但从未定义,

变量在使用前定义两次

例如,让我们考虑一个简单的Python代码片段来理解这一点。


def example(a):
    b = a + 2 # 在此点定义了b
    return b*2

x = example(5)
print(x) # 在此点使用了x

在这段代码中,有两个数据流包:

'a’的定义是作为example函数的参数,使用是作为计算b的一部分。

'b’的定义是在函数example内,使用是在返回值中。假设在定义’b’和使用’b’之间有更多的代码或逻辑,我们有必要确保在这两点之间没有更改’b’的值。这就是数据流测试的重要性所在。

不断测试这些“定义和使用”路径可以帮助我们更早地发现可能的逻辑错误,从而提高程序的质量和可靠性。

数据流测试的类型:

  • All-Du-Paths 测试:重点关注“所有定义使用路径”。All-Du-Paths 是“所有定义使用路径”的缩写。使用这种技术,可以测试从变量的定义到每个使用点的每个可能的路径。

  • 全杜路径谓词节点测试:此技术侧重于控制流图中的谓词节点或决策点。

  • 全用途测试:这种类型的测试检查应用程序中使用变量的每个位置。

  • 全定义测试:这种类型的测试检查应用程序代码中指定变量的每个位置。

  • All-P-Uses 测试:All-P-Uses 代表“所有可能的用途”。使用这种方法,可以测试变量的每个潜在用途。

  • All-C-Uses Test:它代表“所有计算用途”。测试在计算或计算中使用变量的每个可能路径是该技术的主要目标。

  • All-I-Uses 测试:All-I-Uses 代表“所有输入使用”。使用此方法,可以测试使用从外部输入获得的变量的每条路径。

  • 测试所有 O 用途:它代表“所有输出用途”。使用此方法,必须测试使用变量产生输出的每个路径。

  • 定义-使用对的测试:它集中于变量的特定定义和使用对。

  • 使用定义路径的测试:这种类型的测试检查从变量的使用点到其定义的路径。

举一个例子:


1.读取x、y;
2. if(x>y)
 3. a = x+1 
else 
4. a = y-1
 5.打印 a;

流程图如下:
在这里插入图片描述
上例变量的定义/使用:
在这里插入图片描述

数据流测试有什么作用?

当我们编写或维护一个程序时,理解和验证变量在其生命周期中的变化是至关重要的,原因有如下几点:

  • 防止错误: 如果一个变量在它被使用之前没有被正确初始化或定义,那么程序可能会失败或表现出预期之外的行为。例如,Python中如果在Allocate变量之前对其进行引用,会引发一个NameError错误。

  • 准确性: 确保一个变量遵循我们预期的数据流模型,有助于维护程序的准确性。例如,如果您有一个生成新值的复杂算法,并希望将结果存储在一个变量中,你需要确保该变量在定义新值之前没有被其他代码部分错误地更改。

  • 代码质量和可读性: 通过跟踪变量的整个生命周期,可以更好地理解代码的工作原理。这也有助于维护和优化代码,因为了解变量何时和如何被更改可以帮助找到可以改进或重构的区域。

  • 性能优化: 对变量进行持续监测可能有助于发现潜在的性能问题。例如,如果一个变量被不断地重新分配或者它的值被频繁地复制和传递,那么这可能是一个引起性能瓶颈的地方。

  • 安全性: 在安全性中,了解变量何时和怎样改变是相当重要的,尤其在涉及到敏感信息(如用户凭证)的情况下。如果一个攻击者能够操纵或预测变量的行为,他们可能能够利用这一点进行攻击。

让我们回到开头所举的例子,说明为什么我们需要检查程序的变量在其生命周期中是如何变化的。

def compute_square_root(x):
    x = x ** 0.5 # 计算x的平方根,重新赋值给x
    return x

x = 9 # 定义变量x
print(compute_square_root(x)) # 输出将为3.0
print(x) # 输出将为9

在这个例子中,我们有一个名为compute_square_root的函数,该函数接受一个参数x,并将其平方根计算出来,然后将结果重新赋值给x,最后返回这个结果。主函数中,我们设置x的值为9,然后调用compute_square_root函数。

需要注意的是,尽管我们在compute_square_root函数中重新为x赋值,但这并不会影响主函数中的x变量。这是因为Python函数内的变量是局部的;也就是说,它们只存在于函数的生命周期内,且对它们的更改不会影响函数外的同名变量。这种理解是通过研究变量在其生命周期内的变化习得的。

假设我们错误地期待compute_square_root函数会修改主函数中的x的值,那么我们可能会得到错误的结果并导致程序错误,这就突出了理解和检查变量在其生命周期中的变化的重要性。

总结

数据流测试的优点

  • 数据流测试用于发现以下问题 -

  • 要查找已使用但从未定义的变量,

  • 要查找已定义但从未使用过的变量,

  • 要查找在使用前多次定义的变量,

  • 在使用变量之前释放它。

数据流测试的缺点

  • 耗时且成本高昂的过程

  • 需要编程语言知识

微信公众号搜索【一个正经的测试】,专注于AI与软件测试技术和宝藏干货分享,每天准时更新原创技术文章,每月不定期赠送技术书籍,让我们在测试会所在测试社区这个大家庭一起学习交流。喜欢记得星标⭐我,每天及时获得最新推送,
在这里插入图片描述

后台回复“软件测试基础”、“AI与大模型“,简历与面试”等领取测试资源,回复“微信交流群”、“内推群”一起进群吹水摸鱼。
个人微信llwfancymyself添加请注明来意 😃

  • 23
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值