在白盒测试中运用方法调用图
一.理论指导
阅读《测试之美》时发现第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路径的场景。
由于目前手头还没有项目可以实际验证上述策略,本文仅仅是提供一个思路以供参考,欢迎提出宝贵的意见。