您现在的位置是:首页 >学无止境 >年终前一周写了个bug,两万年终奖没了网站首页学无止境

年终前一周写了个bug,两万年终奖没了

ApiChain 2025-02-15 00:01:03
简介年终前一周写了个bug,两万年终奖没了

没出过严重线上事故的都不算是个完整的程序员。

还记得在上个公司,临近版本迭代准备上线的空儿,老板插了一个需求,用户登录时如果***信息没有填,就给它设置为**。想着也就一行代码的事儿,于是一个只有老板、产品、研发知道的新增功能随着版本迭代一起上线了。然后上线后,流量部门反馈用户注册明显下滑,一个一个部门排查,最后到我这儿,突然惊觉,这个函数从用户注册微服务调用过来也会走这逻辑,顿时全身冷汗直流。。。

现在换了个公司,有个需求,一个下拉列表展示的元素加个过滤逻辑,问了一下前端这个下拉列表调用的接口和传参,然后一顿操作猛如虎,搞定测试通过,上线。然而两天后,另一个部门人反馈,一个重要的数据列表500错误了。打开一看,我勒个去,这个下拉列表的接口还真是个万能接口,不同的地方都在调用这个接口,只是不同的地方传参不一样,返回也不一样罢了。好在以前写全部app用户在使用的功能,现在写后台,影响范围有限,不会引起高层注意,悄悄修复掉,不需要换公司了。。。不过时间不巧,领导正在考虑不给谁发年终奖呢。

现在觉得,程序员不光是个体力活,还是个高危职业,你写的每个函数,来自于不同微服务的各种功能,不同参数组合的方法调用都可能用到你现在正在改的这个函数功能,让你估一下你这个改动的影响范围,好让测试来测一下,可能你都没办法完整估下来。很多时候,你也只是接手了别人留下的这个烂摊子,需求来了,需要改个功能,你的任务算是完成了,但这个函数关联的其他各种调用全都挂了。


我想这些对于程序员已经不算是新鲜事了,随着公司部门越来越多,微服务调用的拓扑图越来越大,代码接手过的人越来越多,那些万能接口、万能函数越来越多,整个代码就像摇摇欲坠的高楼,就看谁是最后的那个幸运儿了。

既然是个老生常谈的问题,那肯定也是有解决方案的,只是这个方案是老外提出来的,不适合中国特色社会主义的国情。这个方法的就是写单测,把所有可能的入参,所有代码执行过的路径全部用代码的方式模拟出来,还搞出一个指标——单测覆盖率。每次上线之前都要过一遍单测。

想想这个方式确实能解决上面的问题,本质是代码修改了,对于当前需要开发的功能是实现了业务提出的需求的,也就是符合新版本的测试用例。但旧版本的这些测试用例并没有删掉,也就是旧版本的那些功能都要能正确执行才对啊,所以如果有单测在的话,跑单测肯定过不去的,也就可以倒逼着研发去兼容旧逻辑。

但问题是,为什么前面人没有留下单测呢,为什么你也不写单测呢?因为没时间啊,因为人少事多啊,因为要忙着给用户交付功能啊,因为给用户交付的功能老板不断改想法啊。得赶紧上线,你不上线老板怎么知道后面怎么改需求呢?这一套单测下来,需要增加多少代码量,并且随着后面每次发生的需求变动,代码量都要乘上单测的数量的,最后直接的制约因素就是时间。

所以,总之,需求是要快速且没有bug的完成上线,单测很显然无法做到快速,老外发明的东西果然不适合中国国情。


所以,我们有限的工作时间都要围绕着价值交付展开,作为一个后端开发,交付的价值就是接口。为接口写代码、自测自己写的接口、编写接口文档供前端看,这些是我们无法省去的过程,我们要做的就是将这个过程充分利用起来,最终能够产生一个能反复执行的接口回归测试的用例。这一切都是围绕着价值交付的主线来的,用户使用你的软件,使用的就是你的接口,接口回归测试就是确保接口功能正常,调用成功且返回数据符合业务逻辑。

ApiChain项目链接:ApiChain: 基于版本迭代和项目视角的接口测试和文档生成

这是我自去年四月起一直在写的项目,目前自认为功能已经开发完毕,正在搞一些多语言的翻译。它是按照版本迭代管理我们的接口文档,和前端、测试共享文档,迭代上线迭代的接口和单测回归项目,这里不做过多的介绍。

如上图所示是一个用户注册接口,返回的header中有jwt这个鉴权令牌,服务端每次开发完接口自己都要用类似PostMan这样的工具,自己po一下,确保功能可用然后交给前端和测试,为了让这个测试的过程变得更有通用性,可反复执行,最终能够做成测试用例用于项目的回归测试,就要修改成如下的方式

也就是说,对于一个单测用例来说,起始数据要有代表性,随机数和随机不重复字符串能够很好的满足这个需求。

这个是使用那个鉴权的jwt拿用户信息的接口,我们平时使用PostMan一般会如上图所示,但如果要让这个过程更有代表性,需要修改成如下:

header里的 Authorization 不再是一个明确的字符串,而是一个对前面步骤执行结果中header里的jwt的一个引用(然后加上后续逻辑,比如拼接上 bearer 这个字符串),这样无论是注册还是获取用户信息都变成了通用可反复执行的测试用例了。完整的注册登录流程的单测用例如下:

这样用一连串,像链条一样的接口和数据流,模拟出了一个用户注册,查看自己信息,后面使用自己注册的账号再次登录确保可以登录的操作流程,这个测试用例就是可反复执行的。

可多选自己编写的接口测试用例,点击执行

经过差不多两秒的时间,这些接口依次执行完毕,已经成功注册了一个用户,这个用户也登录成功了。

这个是我们迭代写的测试用例回归到了项目中,以后这个项目需要上线时,可以随时跑一遍这个测试用例。

更多关于ApiChain 的功能和使用方面的介绍,可浏览这个项目的主页 ApiChain: 基于版本迭代和项目视角的接口测试和文档生成 ,如果你也觉得它对你有帮助,记得给个Star哦!

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。