MBT-模型驱动测试的探索与实践(一)

MBT-模型驱动测试的探索与实践(一)作者 干玥开鑫金服资深测试工程师二宝辣妈我应在江湖悠悠饮一壶浊酒醉里看百花深处愁最近遇到了个这样的问题 chapter1 我们家产品汪宣布要盖一栋新型狗屋 于是开发汪哼哧哼哧开始了开发 而测试喵写了 200 的用例来检测狗屋的质量 chapter2 产品

640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=1

640?wx_fmt=jpeg&tp=webp&wxfrom=5&wx_lazy=1

作者:干玥

开鑫金服资深测试工程师

二宝辣妈

我应在江湖悠悠

饮一壶浊酒

醉里看百花深处愁

最近遇到了个这样的问题:

chapter1  我们家产品汪宣布要盖一栋新型狗屋,于是开发汪哼哧哼哧开始了开发,而测试喵写了200+的用例来检测狗屋的质量;

chapter2 产品汪又宣布要盖一栋复合型的狗屋,开发汪说好办,我们把之前的狗屋模型拿来改改就行,而测试喵又满怀激情的写了200+的用例;

chapter3、chapter4 again again again

测试喵突然有一天感觉腰也酸了,腿也疼了,干不动了,当测试在复制黏贴中沦为纯体力活,激情和价值都不复存在。

 

测试喵想:

针对这些业务流程、规则类似,但可能在某些分支场景上存在差异的产品,用例似乎可以复用,不需要完全重新设计,但是到底哪些是一致的可以共用的,哪些是需要单独设计的呢?难道完全靠经验来筛选么?出了问题完全看命?改变工作方式的需求呼之欲出,模型驱动测试-MBT进入了测试喵的视线。

 

 

184658_cgtf_2969787.gif

模型驱动测试MBT是什么

184658_gCC5_2969787.gif

 

今天第一篇开篇,我们先来分享一下模型驱动MBT的概念,之后我们会有篇续文分享我司在这方面的实践和探索。

 

模型驱动测试MBT顾名思义就是基于模型的测试,核心在于模型,模型是对被测系统的抽象。

 

模型驱动测试MBT并不是什么新鲜的概念,事实上IBM的Rational Rhapsody TestConductor Add On 和 Rational Quality Manager,微软的Spec Explorer都是基于模型驱动的测试工具,腾讯等大厂在这方面均有实践,只是暂时没有看到通用性很强的工具。

 

640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=1

 常见MBT建模种类

640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=1

 

我们通常建立的模型有以下几种:

Mental Model(心智模型):即是人们对于世界的理解方式是透过询问:这是什么?为什么这样?这样有什么目的呢?这个东西是如何运作?它会造成什么后果?将这些问题简化成下列的架构图,这里我们可以将其归纳为对产品的理解、设想和体验。

 640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=1

 

SUT Model:System Under Test Model 是心智模型(对产品的理解、设想和体验)的外化(以及与现有模型的整合),是一种图形化或形式化的类比模型。它涉及到不同的层次(如系统、组件和工作环境)、不同视角(如语境/上下文、组件与结构、功能、行为和用户体验)和不同关注点(如数据类型、因果关联、程序结构、任务控制、动作、事件和接口)等经过抽象、泛化和删减后,SUT模型只保留有助于实现特定测试目的的特征。SUT模型的实例化可能用到的技术包括Finite State Machine (FSM),Message Sequence Chart (MSC), Control FlowGraph (CFG),Event Flow Diagram,MarkovChains和UML Testing Profile ,语法测试(SYNTAX TESTING),NLP(自然语言语义模型),此外还有从整体视角的HTSM和ACC等等。

 

TRM:Test-Ready Model 是对SUT模型的扩展和转化,以使模型达到可测试的标准;该模型也可独立使用,即给出相关信息,我们就可以设计或使用一套测试设计算法,用来产生可以运行的测试用例。它根据SUT模型特征和项目实际情况增加或凸显质量风险信息。必要时TRM需要创建新的模型,这是测试建模的主要难点之一,但也体现了我们价值所在。另外,它转化SUT模型以达到可测试标准,并增加“怎么测”的信息,同时为SUT模型修改重构提供反馈。

TRM目前缺少成熟的工具和方法,是MBT的难点和研究方向;可见我们平常通过流程图来推演测试场景的过程本身也是建模的过程,并没有那么高大上对不对。

 

 

640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=1

MBT建模途径

640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=1

 

 

建模的过程又有以下几种路径,不同的路径决定了不同的测试设计过程:

 640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=1

路径一(红色箭头):从心智模型(Mental Model)直接得到测试用例(Ad-hoc Test Design,基于临时需求);

路径二(黄色箭头): 从心智模型(Mental Model)得到TRM模型,再由TRM模型生成测试用例(传统测试设计);

路径三(蓝色箭头->紫色箭头):从心智模型(Mental Model)到SUT模型,再由SUT模型生成测试用例(教科书式);

路径四(蓝色箭头):从心智模型(Mental Model)到SUT模型,再由SUT模型到TRM模型,最终由TRM模型生成测试用例(MBT)。

 

 

640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=1

实践举例

640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=1

 

说了这么多理论,我们来举个实际的例子(路径四):

需求描述:投资中我们需要增加起投金额的判断

假设项目剩余金额为X,投资金额Y输入校验:

 a.Y大于等于起投金额Z;

 b.X-Y需大于等于起投金额Z;

 a、b条件为且的关系

 

第一步,建立Mental Model(心智模型):

需求:投资金额合法性判断

1.投资金额>=起投金额 且  项目剩余可投金额-投资金额>=起投金额

 投资成功

2.投资金额
<起投金额   ="" 投资失败<="" p="">

3.项目剩余可投金额-投资金额
<起投金额  投资失败<="" p="">

 

第二步,根据心智模型建立SUT模型:

640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=1

第三步,根据SUT建立TRM模型:

TRM通过SUT建立的模型,增加检查点等,将SUT转化成可执行的用例;

1、投资金额
<起投金额< p="">

2、投资金额=起投金额

3、…..

 

 第四步:将模型转换成用例

模型建立好,我们还需要工具支持将我们的模型转化成用例(最好是可执行的用例)。

 

 

184658_SK1b_2969787.gif

MBT测试过程

184658_nfwb_2969787.gif

 

 

640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=1

A、根据需求选择合适的模型来描述被测试对象(测试设计的核心)

B、根据模型生成测试用例及期望结果(MBT工具的核心),如果能够直接生成可执行的用例最好;

C、在被测系统上执行用例

D、比较系统行为及输出和预期结果、反馈验证结果;

虽然MBT工具使用的语言千差万别但是基本过程基本一致,我司的MBT测试工具也是这个思路。

 

 

640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=1

MBT带来的好处

640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=1

 

1、模型建立的过程有助于我们从立体的角度重新认识我们的被测对象,同时也把我们对被测对象的理解通过模型化的方式表达出来,能够更高效的和开发团队中的其他人员沟通;

2、如果模型建立适当,我们可以获得我们的基线业务模型、最大程度的减少我们测试设计上的重复工作量,聚焦于变化的部分,并将这种分析从单纯的靠经验转化成通过工具来实现;

3、我们可以通过维护模型来保持我们的产品知识库、测试设计、测试数据、用例与系统当前实现的一致性,避免由于版本的快速迭代造成的文档和实际系统脱节的问题;

4、为测试leader在测试范围评估过程中的识别风险模块提供现实的依据。

 

640?wx_fmt=gif&tp=webp&wxfrom=5&wx_lazy=1

总结一句话,懒惰才是推动人类科学进步的动力,就像电梯是因为我们懒得爬楼才应运而生的,扫地机器人是因为我们懒得扫地才有市场的,现在我们也懒得反复造轮子写一堆几乎一样的用例,我们要引入新的测试方法,把我们的力气发挥在更有价值的地方。

 

编辑:开普勒鑫球-大玲

 

推荐阅读:

迄今为止最接地气的区块链应用,没有之一!

Elasticsearch依赖Guava类库冲突的解决方案

知识是一种概率

 

关注公众号↓,第一时间获取下期信息

 

640?wx_fmt=jpeg&tp=webp&wxfrom=5&wx_lazy=1

转载于:https://my.oschina.net/u//blog/

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/207534.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月19日 下午1:40
下一篇 2026年3月19日 下午1:40


相关推荐

  • java生成pfx_JAVA代码-数字证书公私钥生成-公钥cer ,私钥jks, pfx格式

    java生成pfx_JAVA代码-数字证书公私钥生成-公钥cer ,私钥jks, pfx格式importjava.io.File;importjava.io.FileInputStream;importjava.io.FileOutputStream;importjava.io.FileWriter;importjava.io.IOException;importjava.math.BigInteger;importjava.security.InvalidKeyException;im…

    2022年5月29日
    53
  • win10环境下不通过cppan编译tesseract4.1动态库[通俗易懂]

    win10环境下不通过cppan编译tesseract4.1动态库[通俗易懂]在我的博客中,写了几篇关于tesseract如何编译Windows环境下的dll库,但那几篇都是基于cppan的环境依赖,而cppan的官方网站在2021年1月已经正式关闭了,因此那种方式将无法下载到对应的依赖环境,根据tesseract官方文档是使用SW的方式进行依赖下载,因此这篇博客将讲解使用基于SW的编译方式。1SW的环境配置在SW官方地址上下载sw.exe。将下载的sw.exe所在路径添加到系统环境变量PATH下。以管理员权限打开cmd,输入命令:swsetup这个命令主要是在用

    2022年9月30日
    4
  • i386和i686的具体定义

    i386和i686的具体定义转自:http://hi.baidu.com/adongwang/blog/item/a4f89c3e5654ad0bbaa167b2.htmli386和i686    现在所有的intel32位体系(包括AMD等兼容CPU)都叫i386体系,包括P4。、i686仍然属于i386体系,不过对CPU(相对于386)的特性作了指令优化。GNU/Linux分为alpha、PowerP

    2022年6月1日
    44
  • seaweedfs部署及使用(兼容Hadoop)

    seaweedfs部署及使用(兼容Hadoop)软件版本 软件版本压缩包包名 seaweedfssea 1 11linux amd64 tar gzGitHub https github com chrislusf seaweedfs 相关定义说明 定义名称说明 master 提供 volume gt location 位置映射服务和文件 id 的序列号 Node 系统抽象的

    2026年3月17日
    2
  • 消息中间件有哪些

    消息中间件有哪些1 学习中间件的方式和技巧理解中间件在项目架构中的作用 以及各中间件的底层实现 可以使用一些类比的生活概念去理解中间件 使用一些主流图或者脑图的方式去梳理各个中间件在架构中的作用 尝试使用 Java 技术去实现中间件 静下来去思考中间件在项目中设计和使用的原因 如何找到对应的替代方案 尝试编写博客总结类同中间件技术的对比和使用场景 学会查看中间件的源码以及开源项目和博客 2 消息中间件的应用场景跨系统数据传递 高并发的流量削峰 数据的分发和异步处理 大数据分析与传递 分布式事务比

    2026年2月3日
    5
  • 什么是Lambda架构?

    什么是Lambda架构?写在前面本文隶属于专栏《100个问题搞定大数据理论体系》,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢!本专栏目录结构和文献引用请见100个问题搞定大数据理论体系解答1.Lambda架构定义了一套面向大数据应用的模式和准则。更重要的是,它允许同时查询历史数据和实时新增的数据,并且获得期望的分析视图。2.处理历史数据(批处理)和实时数据。3.技术无关和通用性。Lambda架构是一种通用的模式,完全不依赖于任何技术,而且任何技术只要能满足需求,都可以在Lamb

    2022年6月25日
    31

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号