前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >白盒技术之数据流测试

白盒技术之数据流测试

作者头像
一个正经的测试
发布2024-01-22 17:21:09
2480
发布2024-01-22 17:21:09
举报
文章被收录于专栏:一个正经的测试

DAY5

21

2024-01

点击上方蓝字“一个正经的测试“关注我,每天早上08:30准时推送,每月不定期赠送技术书籍

微信公众号后台回复“软件测试基础”、“简历与面试”等领取测试资源,回复“微信交流群”、“内推群”一起进群吹水摸鱼。

五星上将麦克阿瑟曾经说过“不会写自动化测试,不是好开发“

让我们来讲一个故事

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

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

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

代码语言:javascript
复制
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-

代码语言:javascript
复制
DEF(S) = {X | 语句 S 包含 X 的定义} 
USE(S) = {X | 语句 S 包含 X 的使用}

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

  • 变量已定义但未使用或引用,
  • 变量被使用但从未定义,
  • 变量在使用前定义两次

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

代码语言:javascript
复制
def example(a):
    b = a + 2 # 在此点定义了b
    return b*2

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

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

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

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

举数据流测试的类型:

  1. All-Du-Paths 测试:重点关注“所有定义使用路径”。All-Du-Paths 是“所有定义使用路径”的缩写。使用这种技术,可以测试从变量的定义到每个使用点的每个可能的路径。
  2. 全杜路径谓词节点测试:此技术侧重于控制流图中的谓词节点或决策点。
  3. 全用途测试:这种类型的测试检查应用程序中使用变量的每个位置。
  4. 全定义测试:这种类型的测试检查应用程序代码中指定变量的每个位置。
  5. All-P-Uses 测试:All-P-Uses 代表“所有可能的用途”。使用这种方法,可以测试变量的每个潜在用途。
  6. All-C-Uses Test:它代表“所有计算用途”。测试在计算或计算中使用变量的每个可能路径是该技术的主要目标。
  7. All-I-Uses 测试:All-I-Uses 代表“所有输入使用”。使用此方法,可以测试使用从外部输入获得的变量的每条路径。
  8. 测试所有 O 用途:它代表“所有输出用途”。使用此方法,必须测试使用变量产生输出的每个路径。
  9. 定义-使用对的测试:它集中于变量的特定定义和使用对。
  10. 使用定义路径的测试:这种类型的测试检查从变量的使用点到其定义的路径。

举一个例子:

代码语言:javascript
复制
1.读取x、y;
2. if(x>y)
 3. a = x+1 
else 
4. a = y-1
 5.打印 a;

流程图如下:

上例变量的定义/使用:

数据流测试有什么作用?:

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

  1. 防止错误: 如果一个变量在它被使用之前没有被正确初始化或定义,那么程序可能会失败或表现出预期之外的行为。例如,Python中如果在Allocate变量之前对其进行引用,会引发一个NameError错误。
  2. 准确性: 确保一个变量遵循我们预期的数据流模型,有助于维护程序的准确性。例如,如果您有一个生成新值的复杂算法,并希望将结果存储在一个变量中,你需要确保该变量在定义新值之前没有被其他代码部分错误地更改。
  3. 代码质量和可读性: 通过跟踪变量的整个生命周期,可以更好地理解代码的工作原理。这也有助于维护和优化代码,因为了解变量何时和如何被更改可以帮助找到可以改进或重构的区域。
  4. 性能优化: 对变量进行持续监测可能有助于发现潜在的性能问题。例如,如果一个变量被不断地重新分配或者它的值被频繁地复制和传递,那么这可能是一个引起性能瓶颈的地方。
  5. 安全性: 在安全性中,了解变量何时和怎样改变是相当重要的,尤其在涉及到敏感信息(如用户凭证)的情况下。如果一个攻击者能够操纵或预测变量的行为,他们可能能够利用这一点进行攻击。

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

代码语言:javascript
复制
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的值,那么我们可能会得到错误的结果并导致程序错误,这就突出了理解和检查变量在其生命周期中的变化的重要性。

总结

数据流测试的优点

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

  • 要查找已使用但从未定义的变量,
  • 要查找已定义但从未使用过的变量,
  • 要查找在使用前多次定义的变量,
  • 在使用变量之前释放它。

数据流测试的缺点

  • 耗时且成本高昂的过程
  • 需要编程语言知识

以上就是今天的全部内容,希望对大家有所帮助,也希望大家多多留言、点赞、在看、转发四连爱❤️ 支持。 咱们下篇文章见,Bye~👋

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-01-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 一个正经的测试 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
    • 什么是数据流测试:
      • 举数据流测试的类型:
        • 举一个例子:
        • 上例变量的定义/使用:
          • 数据流测试有什么作用?:
          • 总结
            • 数据流测试的优点
              • 数据流测试的缺点
              相关产品与服务
              腾讯云服务器利旧
              云服务器(Cloud Virtual Machine,CVM)提供安全可靠的弹性计算服务。 您可以实时扩展或缩减计算资源,适应变化的业务需求,并只需按实际使用的资源计费。使用 CVM 可以极大降低您的软硬件采购成本,简化 IT 运维工作。
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档