相信大家在做接口测试的时候,一定绕不开一个话题:幂等性。
那么作为一名测试工程师,站在研发的角度,去学习哪些地方需要幂等性,以及如何实现幂等性的实现,在接下来的业务场景中,才能更好测试。
什么是幂等性?
在如何测试幂等性之前,首先我们得弄清楚幂等性是什么?
首先我们看下维基百科上的定义:
幂等(idempotent、idempotence)是一个数学与计算机学概念,常见于抽象代数中。在编程中一个幂等操作的特点是其任意多次执行所产生的影响均与一次执行的影响相同。幂等函数,或幂等方法,是指可以使用相同参数重复执行,并能获得相同结果的函数。这些函数不会影响系统状态,也不用担心重复执行会对系统造成改变。
任意多次执行所产生的影响均与一次执行的影响相同,这是幂等性的核心特点。
那么在编程业务中,考虑幂等性的地方主要是由于各种各样的原因,从而接口的重复请求。
接口重复提交场景
一般接口被重复提交大概有以下几个原因:
1、前端重复提交表单:在填写一些表格时候,用户填写完成提交,很多时候会因网络波动没有及时对用户做出提交成功响应,致使用户认为没有成功提交,然后一直点提交按钮,这时就会发生重复提交表单请求。
2、用户恶意刷单:如果用户针对一个用户进行重复提交投票,这样会导致接口接收到用户重复提交的投票信息,这样会使投票结果与事实严重不符。
3、接口超时响应:第三方调用接口,为了防止网络抖动等防止请求丢失,一般会设置一个最大重复次数,防止网络抖动等原因造成的请求丢失。
4、消息重复消费: 当使用 MQ 消息中间件时候,如果发生消息中间件出现错误未及时提交消费信息,导致发生重复消费。
试想这样的一种场景:在电商平台上支付后,因为网络原因导致系统提示你支付失败,于是你又重新付款了一次,等完成后检查网银发现被系统扣了两次款,这是一种什么样的体验?
幂等性实现方式
对于前端而言:
对于一些和web或者H5交互的接口,在用户提交一次后,前端做下按钮的置灰,隐藏操作,让用户在接口响应之前无法再次提交。
当然其实前端做此校验也只是拦截一部分,毕竟懂点技术的就知道怎么抓取接口和重复调用接口,因此安全策略主要还是需要后端来实现。
对于后端而言:
1、通过token机制
比如用户在购物提交订单时,服务端提供一个发送token的接口,服务端生成的token一般放在redis中,前端在提交购物订单时,先请求获取token的接口,下单时带着此token放在请求接口头部,同时请求后端接口, 服务端在接受到下单接口的token,判断redis中该token是否存在,如果存在,则代表是第一次请求下单接口,允许下单,并把redis中该token。
下次如果同样的订单及token再次下单时,该token不存在,就表示重复提交下单,服务端直接返回重复下单或其他友好文案。
2、数据库去重表
往去重表里插入数据的时候,利用数据库的唯一索引特性,保证唯一的逻辑。
唯一序列号可以是一个字段,例如订单的订单号。
3、状态机实现
对于很多业务是有一个业务流转状态的,每个状态都有前置状态和后置状态,以及最后的结束状态。
以订单为例,已支付的状态的前置状态只能是待支付,而取消状态的前置状态只能是待支付,通过这种状态机的流转我们就可以控制请求的幂等。
当然还有其他很多方式比如利用redis,加锁等许多方式,针对不同的业务使用合适的实现幂等的方法。
如何测试幂等性
如果测试同学辨别出了业务中哪些接口需要实现幂等,可以提醒研发同学提前实现。
测试过程中,接口的一次提交和多次重复提交的结果一致,可以通过自动化重复调用接口,查看响应结果。
还有就是可以通过抓包方式,修改接口的请求参数,看是否破坏幂等性等。
知道幂等性是什么以及如何实现,提起bug来才有底气。