在白盒测试中运用方法调用图

在白盒测试中运用方法调用图

一.理论指导

阅读《测试之美》时发现第11章谈到了如何运用方法调用关系图来确定被改动代码的传播性,继而减少测试和回归工作量的测试策略,比较感兴趣,就做了一些记录和实践。

左图描述了f1~f10的10个方法之间的调用关系,右图11-4b表示了方法f3的代码发生了改动,图中除f1\f2\f4外,其他方法都和f3有间接或直接的调用关系,但根据经验数据,实际变化之外的三级分离是基本安全的,改动的所有后果都可以在二级分离以内的方法中被检测到。(注意这个图中的箭头表示的调用和被调用关系与下面是相反的)

理论上,如果存在和f3\f5\f8\f9相对应的测试用例,且这些用例已经对上述方法进行100%覆盖,那么运行这些用例就能够发现f3的改变产生的影响。

以及,根据依赖关系,可以把方法分为3类,每一类方法的测试策略会有所不同。

源方法

不调用其他方法,被很多其他方法调用。这类方法的变更会对所有调用它的方法都产生影响。换言之,调用源方法的方法都在测试和回归的范围。

同步方法

不被其他方法调用,调用了很多其他方法,所以任何被它调用的方法的改变都会影响到它,反之,它自身的改变不会传播出去。

换言之,只有同步方法变更时,只需要保证自身功能正确即可。

管道方法

既调用其他方法,也被其他方法调用。

上述2种场景的结合。测试时既要覆盖自身,也要测试调用它的其他方法。

总结

策略的核心观点

1每个方法改动的影响都会在距离它二级调用以内的方法中被发现。(可以称为二级调用原则)

2根据依赖关系可以制定不同的测试策略。

3要先完成对方法的100%覆盖再使用这个测试策略。

二.获取方法关系图

使用这个测试策略需要两部分的准备工作

1获取被测代码中方法的调用/被调用关系

2编写被测代码对应的白盒测试用例,且完成100%覆盖

先看第一步

我使用了IDEA的插件callgraph来生成关系图,能够获取调用关系图的途径是很多的,这个插件的优点是能够把调用和被调用关系完整的显示出来。

https://blog.csdn.net/21aspnet/article/details/123422984

安装和基本使用可以看上面的链接,

拿几个类中的方法举例

第1个例子

中间的一个点是名称为add的方法,黄线和指向它的箭头表示有2个方法调用它,它的2个绿色箭头分别指向其他2个方法表示它自己调用了2个方法。看左上角的颜色,标识了add调用了2个私有方法。

add方法就是一个典型的管道方法,当它的代码发生变更时,要同时测试图中左边调用它的2个方法和它自己内部的所有代码,然后根据代码的变更的部分是否有调用图中右侧它的2个方法来判断是把图中右侧它调用的2个方法归入迭代测试还是回归测试中。

第2个例子

这是一个互相依赖的方法比较多的一个类

看图的下半部分,假如鼠标点中的私有方法updatePackageDate发生了变更,此时可以通过关系图很清楚的看见它调用了2个方法,以及有3个方法调用了它。和第1个例子不同之处在于,图中最左侧的modifyPackageDateByProject方法是通过调用modifyPackageDate间接调用了updatePackageDate,按照二级调用原则,这个方法也在测试范围内。

第3个例子

来看一个调用链路比较长的类,

假设方法synConstructionByAssetNo发生了变更,和前2个例子一样,通过关系图可以很方便的找到一级和二级调用和被调用关系。这个例子中synConstructionByAssetNo还存在3个三级调用的方法,根据二级调用原则,这3个方法就不在测试范围内。

总结,只是获取方法关系图,但如果没有完成方法的全覆盖用例,无法最终完成精细到调用路径的白盒测试,不过仍旧足以在没有足够测试时间的时候获取大致的测试范围,是这个策略的一个好处。

三.全覆盖用例与策略的运用实践

这是第1个例子中的add方法的手画的流程控制图,以及完成了代码95%覆盖的自动化接口用例集。(可以单独执行的异常分支没有写在一起)

1添加asset类型的切片任务,成功

2重复1,触发自身重复添加

3添加资产包类型的切片任务,成功,步骤1的任务状态变为-1

4重复3,触发自身重复添加

5使用sql把步骤1的数据状态改为0

6添加项目类型的切片任务,成功,步骤1和3的任务状态变为-1

7重复6,触发自身重复添加

8重复3,触发项目不能重复添加

9调用删除job接口,删除步骤6的数据

10重复6,成功

11删除所有60天后生成的数据

其中用例1走的是图中if的路径,用例3走的是图中if else的路径,用例6走的是图中else的路径。

假如add方法变更的代码在if路径中,那么执行白盒测试就可以只执行对应的用例,以及按照二级调用原则验证调用和被调用方法的路径中会走到if路径的场景。

由于目前手头还没有项目可以实际验证上述策略,本文仅仅是提供一个思路以供参考,欢迎提出宝贵的意见。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值