减少联调、高效集成,试试这个工具

大家好,我是Z哥。

最近在工作中学习到一个我觉得很有价值的小工具,在这里与大家分享一下。

这个小工具需要自己稍作开发,并不存在什么第三方的现成工具供你使用,因为这个工具的核心关键是「数据」,而「数据」这个东西对于不同的项目天然是不同的。

可能有的小伙伴已经猜到了,我今天要聊的就是一个mock工具(暂且叫这个名字吧,它的能力其实不仅仅只是mock数据)。

多团队协作中,很多功能的实现需要依赖于其它的子系统。这不但影响开发进度,还会导致测试工作开展不太顺利。这个问题在涉及多团队协作的分布式系统中尤其突出。

如果每个子系统都能够内置一个mock工具(模块),通过数据的自动生成,导入和导出,可以灵活地在不同环境上快速地让系统run起来,哪怕自己还没有真正地完成内部的业务逻辑代码编写。

可能你会觉得说,现在很多工具都支持根据定义的API自动生成mock数据啊,postman、apifox、yapi等等,为啥还要自己搞呢。

最大的价值在于以下几点:

  1. 这种方式支持在不同环境提供一份相同的数据(如唯一id等等),便于对相关的上下游系统屏蔽掉环境不同的影响。而使用上面提到的工具很难实现这点。

  2. 导入和导出功能可以作为在没有打通上下游系统之前的手动关联上下游系统的一种方式。

  3. 自动生成的数据可以针对多个API进行共享使用,以模拟“上下文”的感觉,让mock这件事变得更加贴近真实,而不是很假,不管输入的参数是什么,都只能固定返回某个数据。

  4. 基于上面第3点,我们可以再通过某种语法,串联起多个API的调用,快速验证mock出来的数据是否符合预期。并且这个串联调用的case可以保存下来,在真实的业务逻辑实现后再运行一下,快速验证自己的真实实现是不是存在什么bug。相当于同时编写了一个针对该项目定制的自动化测试工具。

  5. 基于上面第4点,可以不断地丰富case,以提高case所覆盖的场景。这不但丰富了数据样本,也提高了使用该工具进行自动化测试的效果。

总体来看,这样一个工具我们在实现的时候需要具备以下这些能力。

  • 自动生成mock数据

  • 清除数据

  • 导入数据

  • 导出数据

  • mock开关

  • mock数据的条件匹配

  • mock外部依赖数据

下面我们一个个展开说说。

/01  自动生成mock数据/

自动生成mock数据是这个工具的最核心功能。但在这之前还有一件更加重要的事情要做,就是:需要提前确定对外提供的 API 契约,如此才能得到相应的输入和输出参数。然后我们再考虑如何生成mock数据的事情。

当然,生成的数据必须要符合契约定义中的标准。比如,

  • 字段的格式。int32还是int64?字符串的格式等等。

  • 入参和出参的相关性,比如输入参数中传入的单据号,应该与输出参数中的单据号保持一致,以体现输入和输出之间的相关性。

  • ……

其次,生成的mock数据,需要尽可能地覆盖更多的场景。

另外,生成的mock数据中如果存在一些依赖于外部系统的唯一ID,允许传入一个ID生成器的hook,确保生成的Mock数据中的唯一ID在指定范围内。

然后,生成的mock数据需要持久化到硬盘上,以提供长期使用。

最后,可以指定生成某个API相关的mock数据,而非全部数据。

/02  清除数据/

可以通过清除数据,重置mock数据回到初始状态,以清理不符合当前API标准的垃圾数据。实现这个功能主要有两个点:

  1. 清除数据时需要考虑数据间的关联关系,比如清除单据类数据时,也应当清除与该单据相关的明细数据。

  2. 可以指定清除某个指定API的mock数据,而非全部数据。

/03  导入数据/

通过配合导入mock数据功能,快速复制出一个完全相同的mock环境。实现这点也有两个点:

  1. 可以导出指定API的mock数据,而非全部数据。 

  2. 导出的数据建议为csv或者excel格式,便于二次编辑。

/04  导出数据/

通过配合导出mock数据功能,快速复制出一个完全相同的mock环境。

导入数据时,需要进行数据合法性验证。如果数据不合法,需要进行处理,有两种情况:

  • 缺失的数据,如果可以自动填充缺省值,则自动修正。

  • 非法数据或者无法自动填充的缺失数据,进行相应的提示。

/05  mock开关/

通过控制开关,灵活切换使用真实业务存储中的数据还是使用Mock存储中的数据。

/06  mock数据的条件匹配/

可以对mock数据的返回内容进行「条件匹配」配置,以满足两种能力:

1. 限定返回的数据范围。

2. 实现返回的出参一定与入参存在相关性。

/07  mock外部依赖数据/

可以将以上能力运用在所依赖的外部数据上,以提供系统「无依赖独立运行」的能力。

具备这个能力后,你所负责系统的测试工作可以不用等待所依赖的外部系统全部都准备就绪后才能开展,可以独立进行。

好了,就这么多。可能有的小伙伴会觉得,要实现这么多能力,得多大工作量啊。

我觉得这个问题不能这么考虑,我们还要考虑这个工具可以节省多少时间。节约的这个时间不仅仅是你自己做自测的时间,还有团队中其他人的时间。而且这个工具可以长期反复使用,时间拉得越长,它所发挥的价值也越大。

惯例总结一下。

这篇呢,Z哥和你分享了一个我认为很有价值的工具,一个需要我们自行开发的mock工具,它可以提升整个团队的长期效能。

这个工具需要实现以下7个能力:

  1. 自动生成mock数据

  2. 清除数据

  3. 导入数据

  4. 导出数据

  5. mock开关

  6. mock数据的条件匹配

  7. mock外部依赖数据

我相信,一旦你提供了这个工具,在团队中你将拥有很好的人缘和口碑~

不知道你是如何看待类似的mock工具的?欢迎和大家一起聊聊你的看法~

推荐阅读:

  • 程序员必备,《新老系统切换宝典》

  • golang使用3周总结

原创不易,如果你觉得这篇文章还不错,就「点赞」或者「在看」一下吧,鼓励我的创作 :)

也可以分享我的公众号名片给有需要的朋友们。

如果你有关于软件架构、分布式系统、产品、运营的困惑

可以试试点击「阅读原文

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/293703.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

浅谈C++类(7)--析构函数

欢迎转载,但请标明作者 “九天雁翎”,当然,你给出这个帖子的链接更好。 不知不觉我都写了6讲了,的确这样讲出来的学习才能迫使我真的去调试每个书上出现的代码,去想些自己能讲出什么新的书上没有的东西,这才…

Hadoop示例程序WordCount详解及实例

2019独角兽企业重金招聘Python工程师标准>>> 1.图解MapReduce MapReduce整体流程图 并行读取文本中的内容,然后进行MapReduce操作 Map过程:并行读取三行,对读取的单词进行map操作,每个词都以形式生成 reduce操作是对ma…

《SAS编程与数据挖掘商业案例》学习笔记之十

继续之前的读书笔记,本次讲解sas主要的变量操作,包括基本赋值语句、累加语句、keep语句、retain语句、array语句、rename语句、length语句。 1.基本赋值语句 zx y; zsum(x,y); sum函数的好处是可以克服缺失值的影响; 2.如果表达式中既有数值…

title与h1标签的区别和联系

很多新站长在网站SEO过程中,会认为把H1等同于Title。 其实两是有区别和联系的,两者不能划等号。下面主要从文章和页面角度分析title和H1。 H1等同于title吗? H1不等于title。H1,大标题。一般出现在文章页面,作用如同一张报…

浅谈C++类(5)--友元

欢迎转载,但请标明作者 “九天雁翎”,当然,你给出这个帖子的链接更好。 呵呵,又来了,自从我开始尝试描述类以来,我发现我自己是开始真的了解类了,虽然还不到就明白什么叫oo的高深境界&#xff0…

.NET 云原生架构师训练营(系统架构)--学习笔记

▲ 点击上方“DotNet NB”关注公众号回复“1”获取开发者路线图学习分享 丨作者 / 郑 子 铭 这是DotNet NB 公众号的第176篇原创文章目录对外展现的功能内部功能功能交互与价值通路系统架构目标认识系统的价值通路认识功能架构,通过把功能结构与形式结构结合来描…

JFinal整合CKFinder

2019独角兽企业重金招聘Python工程师标准>>> 使用JFinal对之前的系统进行重构,老系统使用了CKEditorCKFinder编辑器,发现在web.xml中配置ConnectorServlet会被JFinalFilter过滤处理,而且使用JFinal之后也不想在web.xml中增加额外的…

通过简单的Word Count讲解MapReduce原理以及Java实现

MapReduce原理: MapReduce采用"分而治之"的思想,把对大规模数据集的操作,分发给一个主节点管理下的各个分节点共同完成,然后通过整合各个节点的中间结果,得到最终结果。简单地说,MapReduce就是&q…

经验总结03-dwr

java使用dwr进行ajax请求。 1.编写对应的查询数据的类。 2.添加dwr.jar&#xff0c;可直接复制到lib下。 3.在dwr.xml配置对应的类&#xff0c;让其可在页面中调用类。<create creator"new" javascript"test"><param name"class" value…

浅谈C++类(6)--复制构造函数

欢迎转载&#xff0c;但请标明作者 “九天雁翎”&#xff0c;当然&#xff0c;你给出这个帖子的链接更好。 还记得&#xff08;1&#xff09;中讲到的构造函数吗&#xff1f;复习一下&#xff0c;这次我们重载一个新的默认构造函数--即当你不给出初始值时调用的构造函数&#x…

.NET 6新特性试用 | TryGetNonEnumeratedCount

前言.NET 6新增了TryGetNonEnumeratedCount方法&#xff0c;计算可枚举类型的元素总数。LINQ不是已经有了Count方法吗&#xff0c;为什么还要画蛇添足呢&#xff1f;Demo尝试下列代码&#xff1a;var b new B<int>(); Console.WriteLine($"{b.Count()}");var …

阻塞队列之七:DelayQueue延时队列

一、DelayQueue简介 是一个无界的BlockingQueue&#xff0c;用于放置实现了Delayed接口的对象&#xff0c;其中的对象只能在其到期时才能从队列中取走。这种队列是有序的&#xff08;PriorityQueue实际存放Delayed接口对象&#xff09;&#xff0c;即队头对象的延迟到期时间最短…

研究表明:喝酒“上脸”是基因突变,不仅容易老年痴呆,还容易得胃癌

全世界只有3.14 % 的人关注了爆炸吧知识本文转自科研大匠“喝酒上脸的人能喝&#xff01;”这句话&#xff0c;不管来自天南还是海北的&#xff0c;在酒桌上&#xff0c;肯定都耳熟能详有没有&#xff1f;其实&#xff0c;喝酒“上脸”并不意味着能喝&#xff0c;而是一种基因突…

PHP中如何配置smarty框架实现PHP代码和HTML代码分离

header(Cache-Control:Private);//保留用户填写的信息 session_start();//开启缓存 define(MYCMS,UTF-8);//定义网站编码常量 define(ROOT,str_replace(\\,/,realpath(dirname((__FILE__))./../)));//定义根目录常量 ../是返回上级目录 define(TPL,ROOT./tpl);//定义网页模板的…

Hook API (C++)

一、基本概念&#xff1a; 钩子(Hook)&#xff0c;是Windows消息处理机制的一个平台,应用程序可以在上面设置子程以监视指定窗口的某种消息&#xff0c;而且 所监视的窗口可以是其他进程所创建的。当消息到达后&#xff0c;在目标窗口处理函数之前处理它。钩子机制允许应用程序…

本科、硕士、博士的区别(终极版)

全世界只有3.14 % 的人关注了爆炸吧知识本文转自募格学术本科生和研究生到底有何区别&#xff1f;硕士和博士又有什么不同&#xff1f;这是很多人都有的困惑&#xff0c;对于这个问题的说法也有很多版本&#xff0c;我们挑选了几个比较经典的版本&#xff0c;以期能和大家一同探…

C# Jpush 极光推送消息推送

简介消息推送&#xff08;Push&#xff09;指运营人员通过自己的产品或第三方工具对用户移动设备进行的主动消息推送。用户可以在移动设备锁定屏幕和通知栏看到push消息通知&#xff0c;通知栏点击可唤起APP并去往相应页面。我们平时在锁屏上看到的微信消息等等都属于APP消息推…

Linux 环境变量 $PATH

我们知道查阅文件属性的指令 ls 完整文件名为&#xff1a;/bin/ls(这是绝对路径)&#xff0c;那为什么可以在任何地方执行/bin/ls 这个指令呢&#xff1f; 为什么在任何目录下输入 ls 就一定可以显示出一些讯息而不会说找不到该 /bin/ls 指令呢&#xff1f; 这是因为环境变量 …