Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >精准测分:基于函数调用关系链的用例消振算法 ( 上帝视角 )

精准测分:基于函数调用关系链的用例消振算法 ( 上帝视角 )

原创
作者头像
熊彪
修改于 2017-08-01 01:43:54
修改于 2017-08-01 01:43:54
1.6K0
举报
文章被收录于专栏:熊彪的专栏熊彪的专栏

基于函数调用关系链的功能用例消振算法

---上帝的视角

一、引言

(1)问题简述:当一个功能用例执行时,背后就会有数以千计的函数被调用运行。其中有与这个功能用例息息相关的业务函数,也有与这个功能用例描述无关的数据上报函数、log日志函数。如何区分什么是核心业务函数,什么是无关函数?

(2)《三体》像我们阐述了这样一个事实:一个文明不会孤立的存在,宇宙有其社会学法则。在这个法则的作用下,一个文明或主动或被动的与其他文明产生关联关系。地球文明不是孤岛。

二、函数孤岛?

地球文明不是孤岛,函数呢?从静态的视角观察函数,她只是一个一个在文件中孤立存在的代码片段。但从动态的视角观察,函数与函数之间就天然的发生了关联。这个关联是怎么产生的呢?答案是函数调用关系链。函数调用关系链就是函数自己的宇宙社会学法则,函数不是一个孤岛。我们将这种动态的视角称为---上帝的视角(文中最后部分有解释这个的含义)。

三、函数的宇宙社会学法则导致的用例关联函数问题剖析。

在函数调用关系链的作用下,一个函数或主动或被动的与其他函数产生调用关系。这种调用关系的存在,造成了用例与函数两者在关联的时候,总会出现一系列问题:

1、从函数角度而言,越是基础的公共函数,她被调用的次数就越多,她与其他函数的互相交叉关系就越复杂。如何将函数关联的用例控制在最能描述这个函数的用例集上呢?且不会关联过多无效的用例。

2、从用例角度而言,用例的设计主要是为几个有限的关联业务函数服务的。但是由于函数调用关系链的影响,用例会被动的关联很多跟他的功能描述不相关的函数。若是这个用例操作步骤很复杂,那么其所调用的函数将呈现爆炸式的递增。如何能够将用例关联的函数控制在核心业务函数范围内呢?

要解决上述两个问题,是否可以借鉴《三体》中挽救人类文明于灭亡边缘的“面壁计划”的思路:既然无法突破宇宙社会学法则,那么就利用、学习她,在绝境中寻求浴火重生的机会。我们是否也可以利用函数调用关系链的规则,制定我们自己的“面壁计划”?答案是肯定的,经过我们团队成员不懈的努力,我们找到了解决上述问题的方式:从调用链的两个不同视角来解决这两个问题:

广度视角:利用函数调用关系链hash值来解决问题1。

深度视角:利用函数调用关系链亲密度值来解决问题2。

额,好抽象的视角啊,如何理解?莫急,各位看官请听我将她娓娓道来:

四、广度视角:利用函数调用关系链hash值解决函数关联过多无效用例问题(尤其是公共库函数)。

首先让我们一起将视角调整到:函数与其调用的子函数之间这个角度,站在函数角度而言这是主动的调用,子函数之间是平等的兄弟节点的关系,她是横向的广度

函数有分支的概念,就造成了子函数分派的依附各自的分支中。为了方便大家理解这个概念,我们在这里打一个比方:在一棵树分支中分布的叶子,如图1,我们将一个函数的调用想象成上图中有分支有叶子的树图,树的分支代表函数分支,树的叶子代表函数调用的子函数。

图1

一棵树是靠他的分支像叶子输送养分的,若是在输送养分的过程中,只专门跑一个分支,就会造成其他分支的叶子因得不到养分而渐渐枯萎。为了使每一个分支的叶子都不会枯萎,需要在传输养分的时候保证每一个分支都能被传送到,保证叶子雨露均沾。若是我们再规定每天每一片叶子只能得到一次营养传输机会,那么我们如何严格的保证这个规则的执行呢?因为每一片叶子都是独一无二的,而她又依附于她所在的分支吸收营养,那么我们就可以通过一个分支中所有叶子的集合hash来区分每一个分支。当上图这棵树的三个分支都可以相互区分之后,我们就可以保证每一天每一个分支的每一片叶子一天只得到一次营养传输。若是一天中一个分支第二次意外的遇到有外部营养的传输的时候,我们就可以直接拒绝。

函数的用例设计也是与上述的类比一样的,为了保证函数的质量,需要为每一个分支设计一个关联的用例。当我们完成了函数每一个分支用例设计的时候,若是突然有一个无关的用例也调用了这个函数,我们如何拒绝将这个函数与这个用例进行关联呢?恩,与叶子是一样的,每一个子函数也是独一无二的,我们可以通过每一个分支的子函数集合hash来标识区分每一个函数的分支。然后在设计分支用例的时候,将每一个分支的hash与与这个用例相关联,这样当我们再遇到一个无关用例关联这个函数的时候,测试分析师就可以有法可依的拒绝这个用例的关联。

汇总:每一个分支的子函数集合hash就是函数调用关系链hash的概念。当一个公共库函数完成了其所有分支用例分覆盖之后,突然有一天多次意外的遇到无关用例主动关联的时候,那么作为测试分析师的我们就可以大胆的拒绝这个关联关系。

五、深度视角:函数调用关系链亲密度值解决用例关联不相关函数的问题。

首先让我们一起将视角调整到:函数与调用这个函数的父函数之间这个视角,站在函数角度而言这是被动的调用(与广度视角正好相反),父函数与函数之间是直系亲属的关系,她是纵向的深度。

由于函数之间有调用与被调用的关系,就造成了函数间:祖父函数、父亲函数、儿子函数、孙子函数、曾孙函数之间直系亲属关联关系的概念。了方便大家理解这个概念,我们在这里打一个比方:清朝皇室族谱中的直系亲属关系,看下图:

图2

我们将一个被调用的函数想象成上图中具有直系亲属关系的族谱图,族谱中的一个人名代表了一个函数。通过生物遗传学的特性,我们发现族谱中父子之间血缘关系是最亲近的,而隔着几代的两个人相互之间的血缘关系却是很淡薄的。

用例与其关联的核心业务函数的关系也是与上述的类比一样的,当我们把用例当做祖先,那么其关联的核心业务函数就是其子孙。调用链层次越上层的函数他所包容的功能越多,越靠近用例所描述的功能,其血缘关系就越近。调用链层次越下层的函数他所包容的功能越少(只是上层函数的一个功能子集),越远离用例所描述的功能,其血缘关系就越浅薄。

我们将用例与函数的血缘关系称为亲密度。若是亲密度的描述在这里就停止,我们相信大家都不会满意: 你们的系统怎么一定可以确认在调用链越下层的函数,就一定不能描述这个用例呢?额,从系统层面确实不能肯定的回答是,好心塞

抛开低落的情绪,让我们平静下来。回头再来看看我们的项目的目标:测分及测试体系精准化、STA(测试分析师)养成。默默的多读几遍,对啊!我们忽略了精准测分最重要、最核心的角色:拥有上帝视角的STA(测试分析师)。因为用例是由STA(测试分析师)创造设计的,他才是用例及其关联函数真正的祖先,他最清楚用例应该关联那些核心业务函数。STA(测试分析师)才是精准测分项目的“面壁者”,其拥有至高的话语权(上帝视角)。

通过测试分析师的选择我们过滤出一批核心业务函数,再在函数调用关系链的作用下,将这批核心业务函数按照调用链的层次分成不同的亲密度值。通过亲密度我们知道,哪些函数跟我这个用例才是最亲密的、哪些用例跟我这个函数才是最亲密的。

为了方便大家更深入理解函数调用关系链亲密度值,这里我们举一个用例设计过程中关联函数的实际例子:模拟器项目中“摇一摇”功能用例,下面是这个用例的描述截图。

图3

通过上面的截图描述我们知晓这个功能用例的主要关联业务函数类型是:界面窗口的摇一摇OnShake、模拟器模块摇一摇事件消息发送SendShake、事件中堆内存的清除。分析了业务函数的类型之后,将他们与这个用例相关联即可,之后系统会根据函数调用关系链计算关联函数的亲密度值。接着当我们继续深入分析界面窗口摇一摇函数OnShake的时候,发现一个用例不能完全覆盖他所有的分支,这时我们就要创造设计出不同的用例对函数OnShake进行高质量的覆盖。上述我们创造设计的用例与函数OnShake的亲密度值均为1,因为他们都是围绕这个函数而生的。但是当还有其他不怎么相关的用例,因为调用关系链的缘故也被迫关联了函数OnShake时,我们就可以通过测试分析师的选择以及函数调用链将其亲密度降低。这样在亲密度值的作用下,测试分析师只需执行亲密度为1的用例,更低亲密度的用例呆一边去。

汇总:函数调用关系链亲密度值的计算通过两个步骤的操作来完成:

1、STA(测试分析师)的选择过滤,这是至关重要的选择。不然下面一步的操作就会变成无源之水、无本之木。

2、通过函数调用关系链将1中选择过滤的业务函数进行亲密度值的计算。

根据这些亲密度值,我们就可以将函数关联的用例进一步的过滤消振。

六、总结

通过广度视角:函数调用关系链hash值我们解决了函数关联用例过多的问题,将函数关联的用例在横向方向上过滤出一批。再通过深度视角:函数调用关系链亲密度值我们解决了用例关联函数过多的问题,将用例关联的函数在纵向的方向上再过滤出一批。这样剩下的函数关联用例,用例关系函数,互相之间才是最核心、优先级最高的。自然的,与用例无关的函数、与函数无光的用例都被无情的过滤了。

上述就是桌管安全测试团队针对精准测分中用例消振提出的“面壁计划”

。这里请允许我代表我们团队再郑重的跟大家阐述一下精准测分项目的目标:测分及测试体系精准化、STA(测试分析师)养成,额一不小心泄露了个大秘密

七、名词解释

三体》:是刘慈欣创作的系列长篇科幻小说,由《三体》、《三体Ⅱ·黑暗森林》、《三体Ⅲ·死神永生》组成。

面壁计划”:一个通过利用三体人唯一战略劣势——不能隐瞒自己想法。利用地球人无法被看穿的思想找到阻止三体入侵的方法的计划的总称。

面壁者”(测试分析师):选定一批面壁计划的制定者和领导者,他们完全依靠自已的思维制定战略计划,不与外界进行任何形式的交流,计划的真实战略思想、完成的步骤和最后目的都只藏在他们的大脑中,我们称他们为面壁者。面壁者将被授予很高的权力,使他们能够调集和使用地球已有的战争资源中的一部分。

上帝的视角”:在二维角度(平面)上的点看自己,只是一个点。但是从三维角度看,却是互相关联组成的网状图。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

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

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
mybatis中foreach collection三种用法
在做mybatis的mapper.xml文件的时候,时常遇到一些需要批量操作的情况,这个时候mybatis的foreach标签就派上用场了。
BUG弄潮儿
2020/06/15
7.5K0
SSM第五讲 动态SQL与高级查询
就是相对与固定SQL。就是通过传入的参数不一样,可以组成不同结构的SQL语句. 这种根据参数的条件修改SQL结构的SQL语句,我们称为动态SQL语句.
易兮科技
2020/09/27
2.1K1
SSM第五讲  动态SQL与高级查询
Mybatis | 基础
(1)#{}会经过JDBC当中的PreparedStatement的预编译,会根据不同的数据类型来编译成对应数据库中所对应的数据,并放到SQL语句的占位符问号上。如下:
Java小技巧
2022/05/23
2440
mybatis动态sql之foreach补充(一)
说明,现在我们使用public List<Employee> getEmpByForeach2(List<Employee> employee);,传入的是一个Employee集合,那么此时我们应该怎么使用foreach呢?
西西嘛呦
2020/08/26
2680
mybatis.5.动态SQL
1.动态SQL,解决关联sql字符串的问题,mybatis的动态sql基于OGNL表达式
张哥编程
2024/12/17
1220
mapper.xml相关语法
一般在列表页面,有多个查询条件,并且不确定条件是否使用的时候可以使用 if test语法
java攻城狮
2020/10/10
1.3K0
springboot结合MyBatis中使用foreach
在pom.xml中自行加入需要的依赖,application.properties的配置如下
道可道非常道
2019/05/22
1.5K0
springboot结合MyBatis中使用foreach
从架构角度看MyBatis及foreach用法小结
关注点分离[Separation of Concerns,简称SOC]是最经典的架构设计原则之一,在许多架构设计中被广泛使用。 关注点分离原则为我们的架构设计提出了三点要求。
烟雨平生
2023/03/07
1.3K0
从架构角度看MyBatis及foreach用法小结
SpringBoot学习笔记(五)——Spring Boot中使用MyBatis进阶
mybatis框架运行时可以调整一些运行参数。比如,开启二级缓存,开启延迟加载等等。全局参数会影响mybatis的运行行为。
张果
2022/05/09
1.7K0
SpringBoot学习笔记(五)——Spring Boot中使用MyBatis进阶
五、MyBatis的增删改查模板(参数形式包括:String、对象、集合、数组、Map)
foreach元素的属性主要有 item,index,collection,open,separator,close。
刘大猫
2025/03/11
1140
mybatisPlus多数据源分页配置
网上很多教程的配置比较老,并且不支持多数据源。踩坑后记录下,看了下MybatisPlus在github中提问非常不优化,文档也没有标注这块,只能看了下源码。
高久峰
2023/07/02
8450
Mybatis + Oracle CRUD
Columns 需要查询的列 Xml <sql id="ztTerminalProducerColumns"> a.id AS "id", a.terminal_id AS "terminalId", a.name AS "name", a.link_man AS "linkMan", a.telphone AS "telphone", a.address AS "address", a.emailbox AS "emailbox", a.orgunitid AS "orgunitid",
Remember_Ray
2020/04/10
5970
Mybatis + Oracle CRUD
Data Access 之 MyBatis(四) - Dynamic SQL
动态 SQL 是 MyBatis 的强大特性之一。如果你使用过 JDBC 或其它类似的框架,你应该能理解根据不同条件拼接 SQL 语句有多痛苦,例如拼接时要确保不能忘记添加必要的空格,还要注意去掉列表最后一个列名的逗号。利用动态 SQL,可以彻底摆脱这种痛苦。
RiemannHypothesis
2022/08/19
4490
Data Access 之 MyBatis(四) - Dynamic SQL
MyBatis学习笔记之Mapper文件的foreach标签详解
MyBatis的Mapper文件的foreach标签用来迭代用户传递过来的Lise或者Array,让后根据迭代来拼凑或者批量处理数据。如:使用foreach来拼接in子语句。
Jetpropelledsnake21
2022/11/07
9720
MyBatis学习笔记之Mapper文件的foreach标签详解
05_MyBatis动态SQL学习笔记
动态sql目的是为了解决查询条件不确定而存在的,条件判断使用的表达式为OGNL 表达式,常用的动态SQL有:<if> <where> <choose> <foreach>
全栈程序员站长
2021/07/13
3560
java进阶|MyBatis系列文章(六)XML版批量操作sql
九,由于这里面用到了分页查询的实现,所以整合了pageHelper的jar和配置信息。
码农王同学
2020/04/27
6170
mybatis的foreach、if、choose when使用
package org.sjframework.learn.mybatis.dao; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Select; import java.util.List; import java.util.Map; /** * mybatis dao * <p> * no
gfu
2019/10/21
2.2K0
Maven项目集成Mybatis
上述实例类TdyMemberInfo 中定义的变量 id 对应表t_dy_member_info中的member_id,在TdyMemberInfoMapper.xml的resultMap 中会有对应的映射关系。 startIndex、pageSize 这两个字段用于分页查询。
用户7741497
2022/02/28
4740
mybatis动态sql之遍历集合(学习foreach标签(初探))
也就是说整个sql语句是这样的:select * from tbl_employee where id in (1,2,3)
西西嘛呦
2020/08/26
1.3K0
干货 | MyBatis的动态SQL
本文主要根据自己demo案例,详细介绍动态SQL的使用。基于官网,但比官网更详细。
子乾建建-Jeff
2020/06/29
1K0
干货 | MyBatis的动态SQL
相关推荐
mybatis中foreach collection三种用法
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档