Loading [MathJax]/jax/input/TeX/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 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
这就是TDSQL的向量化执行引擎?有效降低函数调用开销,提升CPU利用率
在“国产数据库硬核技术沙龙-TDSQL-A技术揭秘”系列分享中,5位腾讯云技术大咖分别从整体技术架构、列式存储及相关执行优化、集群数据交互总线、Fragment执行框架/查询分片策略/子查询框架以及向量化执行引擎等多方面对TDSQL-A进行了深入解读。没有观看直播的小伙伴,可要认真做笔记啦!今天带来本系列分享中最后一篇腾讯云数据库高级工程师胡翔老师主题为“TDSQL-A向量化执行引擎技术揭秘”的分享的文字版。 作为领先的分析型数据库,TDSQL-A是腾讯首款分布式分析型数据库,采用全并行无共享架构,具有自
腾讯云数据库 TencentDB
2021/08/05
9150
【初阶数据结构】二叉树(附题)
树是一种非线性的数据结构,它是由n(n>=0)个有限结点组成一个具有层次关系的集合。把它叫做树是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。
ZLRRLZ
2024/12/13
3860
【初阶数据结构】二叉树(附题)
万字详解 Spark开发调优(建议收藏)
在大数据计算领域,Spark 已经成为了越来越流行、越来越受欢迎的计算平台之一。Spark 的功能涵盖了大数据领域的离线批处理、SQL类处理、流式/实时计算、机器学习、图计算等各种不同类型的计算操作,应用范围与前景非常广泛。大多数同学(包括笔者在内),最初开始尝试使用Spark的原因很简单,主要就是为了让大数据计算作业的执行速度更快、性能更高。
大数据老哥
2021/09/16
1K0
万字详解 Spark开发调优(建议收藏)
京东零售数据资产能力升级与实践
本文主要聚焦于京东零售在数据资产管理方面的升级与实践。在数字经济时代,数据资产已成为企业核心竞争力之一,京东零售作为国内领先的电商平台,积极探索并优化数据资产管理,旨在提升运营效率、优化用户体验。文章详细阐述了京东零售在数据资产能力升级过程中的关键举措,包括数据治理、数据挖掘、数据应用等方面的创新实践,为零售行业的数据资产管理提供了有益的借鉴和启示。通过阅读本文,读者可以深入了解京东零售在数据资产领域的探索成果,以及如何将这些成果应用于实际业务中,推动企业持续增长。
京东技术
2024/03/06
5460
京东零售数据资产能力升级与实践
前亚马逊产品经理:TikTok的真正优势,并不是算法
在前段时间的风波中,TikTok 的推荐算法一度成为大家争相讨论的话题中心。但在前亚马逊产品经理(同时也是亚马逊战略规划部第一位分析师)Eugene Wei 看来,TikTok 的算法本身并没有特别的突破性创意,TikTok 产品真正的价值点在于 TikTok 的设计和流程里面的每一个元素是怎么互相关联到一起,从而创建出一个数据集,再通过这个数据集,把算法训练成最佳性能的。
程序员小猿
2021/01/20
8600
前亚马逊产品经理:TikTok的真正优势,并不是算法
腾讯百亿级大规模内容处理系统探究
作者 | 腾讯内容处理中台技术团队 1. 背景介绍 腾讯内容处理中台是打通腾讯内容生产、内容处理、内容分发、内容变现等内容生态闭环的核心基础服务。作为衔接内容生产端和内容消费端的关键路径,旨在通过智能化、规模化的人机协同内容处理和内容审核等关键技术方案,对内容供给端产生的各种形态内容如视频、图文、商品、评论等,进行安全化、标准化、算法化等流水线工业化处理,并将处理后的内容统一分发到腾讯视频、QQ 浏览器、腾讯新闻等多端渠道,为不同的用户群体提供更好、更高效的内容服务体验。 图 1-1 内容生态概览图 2.
深度学习与Python
2023/03/29
1.5K0
腾讯百亿级大规模内容处理系统探究
算法可视化:把难懂的代码画进梵高的星空
选文 | 吴佳乐 翻译|黄念 校对|冯琛 姚佳灵 作者 |Mike Bostock 素材来源 | bost.ocks.org 独立心灵的力量被高估了……真正的力量源自于外部能提高认知能力的帮助。 ——唐纳德 本文重点研究算法。然而,这里讨论的技术适用于更广泛的问题空间:数学公式、动态系统、过程等。基本上,任何需要理解代码的地方。 那么,为什么要可视化算法呢?甚至为什么要去可视化呢?这篇文章将告诉你,如何利用视觉去思考。 算法是可视化中一种迷人的用例。要将一种算法可视化,我们不只是将数据拟合到图表中,况且也
大数据文摘
2018/05/25
1.6K0
为什么泛型会让你的Go程序变慢
强烈推荐大家读完,可以很好的理解泛型实现,以及当前有哪些性能问题,翻译时我会加些注释,以便大家更好的理解
KevinYan
2023/10/25
4150
为什么泛型会让你的Go程序变慢
推荐系统中的自动化特征工程
在机器学习的各个子领域中,特征工程都扮演着重要的角色。业界有这么一句话,数据和特征决定了机器学习算法的上限,而模型、算法的选择和优化只是在不断逼近这个上限。通过运用领域知识,在原始数据集中构造解释变量,有利于机器学习模型预测目标。传统的特征工程方法是运用与问题相关的领域专业知识,从数据集中提取特征。我们称之为手动特征工程,手动特征工程的缺点在于繁琐耗时,对于不同的问题需要重新开始,过于依赖人的经验与判断。因此,研发自动特征工程就尤为重要。
曲奇
2021/12/14
1.3K0
推荐系统中的自动化特征工程
数据科学家成长指南(上)
这才是真正的力量,年轻人! 这是Swami Chandrasekaran所绘制的一张地图。名字叫MetroMap to Data Scientist(数据科学家之路),别称怎么死都不知道的。
Datawhale
2019/09/09
8920
数据科学家成长指南(上)
四大视角、万字长文,欧盟MuMMER项目之商场服务机器人深入解读
欧盟 MuMMER 项目属于欧盟地平线 2020 项目,后者是欧盟有史以来规模最大的研究与创新计划,甚至吸引了一些私人投资。根据官网信息,其计划在 7 年内(2014 年至 2020 年)提供近 800 亿欧元资金,来推动将出色的想法从实验室推向市场的过程。
机器之心
2019/12/06
5500
软件测试笔试面试题目完全汇总
软件测试:为了发现软件产品中的各种缺陷,而对软件产品进行验证和确认的活动过程,此过程贯穿整个软件开发生命周期。 简单的说,软件测试是以发现错误为目的而执行的一个程序或系统的过程。
全栈程序员站长
2022/08/24
8320
软件测试笔试面试题目完全汇总
三万字长文 | Spark性能优化实战手册
在大数据计算领域,Spark已经成为了越来越流行、越来越受欢迎的计算平台之一。Spark的功能涵盖了大数据领域的离线批处理、SQL类处理、流式/实时计算、机器学习、图计算等各种不同类型的计算操作,应用范围与前景非常广泛。
王知无-import_bigdata
2020/02/10
1.2K0
❤️ 爆肝三万字《数据仓库体系》轻松拿下字节offer ❤️【建议收藏】
🍅 作者主页:不吃西红柿 🍅 简介:CSDN博客专家🏆、信息技术智库公号作者✌  华为云享专家、HDZ核心组成员。 简历模板、PPT模板、学习资料、面试题库、技术互助。 目录 🍅 信息技术智库 🍅 ---- 文章很长,前言一定要看 拥有本篇文章,意味着你拥有一本完善的书籍,本篇文章整理了数据仓库领域,几乎所有的知识点,文章内容主要来源于以下几个方面: 源于「数据仓库交流群」资深数据仓库工程师的交流讨论,如《sql行转列的千种写法》。 源于群友面试大厂遇到的面试真题,整理投稿给我,形成《面试题库》。 源于笔
不吃西红柿
2022/07/29
1.1K0
❤️ 爆肝三万字《数据仓库体系》轻松拿下字节offer ❤️【建议收藏】
软件设计师复习资料「建议收藏」
大家好,我是架构君,一个会写代码吟诗的架构师。今天说一说软件设计师复习资料「建议收藏」,希望能够帮助大家进步!!!
Java架构师必看
2022/06/27
6.6K0
2022爱分析·数据智能应用实践报告
为解决数据类型丰富、数据体量倍增带来的存储问题,同时满足人工智能、机器学习在趋势预测、探索分析等方面的应用需求,同时配置数据仓库、数据湖成为企业的普遍选择。然而企业逐渐发现多架构的配置并不完美,解决既有问题的同时带来新的架构问题,如数据流通低效、数据冗余以及存储成本高。
爱分析ifenxi
2022/09/07
9400
2022爱分析·数据智能应用实践报告
JavaScript专家开课啦。
Hi好久不见的大家,雷小达想死你们了! 今天带来三个JavaScript的内容,让大家一把过足瘾。在西安办公室有一个JavaScript方面的专家,最近他的努力方向转移到了Lisp上。且听,JavaScript专家——邱俊涛一一道来。 I code it Code and Life RSS 文章 文章归档 出版物 关于 团队里的两类程序员 JAN 14TH, 2018 程序员的分类 最近几年,我在多个不同类型的项目上,以不同的角色工作过:有时候会为项目前期做一些预研、然后为后续的交付估算工作量;有时
ThoughtWorks
2018/04/18
1.8K0
JavaScript专家开课啦。
上帝掷骰子吗–量子物理史话
大家好,又见面了,我是你们的朋友全栈君。   上帝掷骰子吗–量子物理史话   第一章黄金时代   一   我们的故事要从1887年的德国开
全栈程序员站长
2022/06/26
7.3K0
构建安全可靠的系统:第十一章到第十五章
一旦您分析并设计了您的系统,就该是实现计划的时候了。在某些情况下,实现可能意味着购买现成的解决方案。第十一章提供了谷歌在决定构建定制软件解决方案时的思考过程的一个例子。
ApacheCN_飞龙
2024/01/11
3490
构建安全可靠的系统:第十一章到第十五章
《软件开发的201个原则》—— 一般原则、需求原则、设计原则、编码原则、测试原则、管理原则、产品原则、演变原则
我无意中发现了这一个书《软件开发的201个原则》,是国外一个大佬写的,国内诸多大佬推荐,发现写的很好,可以用来指导软件的开发!下面的内容是我手打的一遍,内容不全,甚至一些信息可能敲错了,大家想看完整地内容,还是建议网购买书!
明志德道
2023/10/21
1.1K0
《软件开发的201个原则》——  一般原则、需求原则、设计原则、编码原则、测试原则、管理原则、产品原则、演变原则
推荐阅读
相关推荐
这就是TDSQL的向量化执行引擎?有效降低函数调用开销,提升CPU利用率
更多 >
LV.0
这个人很懒,什么都没有留下~
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档