天天看点

简单谈一谈幂等测试1、什么是幂等测试2、幂等测试的常见场景3、实现幂等的方式4、如何测试幂等性

1、什么是幂等测试

幂等是一个抽象的概念,在编程中一个幂等操作的特点是其任意多次执行所产生的影响均与一次执行的影响相同,即多次调用方法或者接口不会改变业务状态,可以保证重复调用的结果和单次调用的结果一致。幂等测试,则主要是为了验证同一个请求被执行一次与被执行多次的效果是否是一样的。

2、幂等测试的常见场景

(1)前端重复提交

用户在前端提交一些数据给后台服务时,后台需要根据用户提交的数据在数据库中创建记录。如果用户不小心多点了几次,后端收到了多次提交,这时就会在数据库中重复创建多条记录。这就是接口没有幂等性带来的 bug。

(2)接口超时重试

调用接口时,有可能会因为网络原因而调用失败,这时,一般在设计的时候会对接口调用加上失败重试的机制。如果第一次调用已经执行了一半时,发生了网络异常。如果没有幂等处理,这时再次调用时就会因为脏数据的存在而出现调用异常。

(3)消息重复消费

在使用消息中间件来处理消息队列时,如果消费者突然断开连接,那么已经执行了一半的消息会重新放回队列。当消息被重新消费时,如果没有幂等性,就会导致消息重复消费时结果异常。

3、实现幂等的方式

对于前端而言:在用户提交一次操作后,前端将按钮置灰、隐藏等,可以让用户在接口响应之前无法再次提交。当然前端做此校验也只能拦截一部分,毕竟可以通过工具重复调用接口,因此幂等主要还是需要后端来实现。后端实现幂等的常见方式如下。

(1)通过token机制

比如用户在购物提交订单时,服务端提供一个发送token的接口,服务端生成的token一般放在redis中,前端在提交购物订单时,先请求获取token的接口,下单时带着此token放在请求接口头部,同时请求后端接口, 服务端在接受到下单接口的token,判断redis中该token是否存在,如果存在,则代表是第一次请求下单接口,允许下单。下次如果同样的订单及token再次下单时,该token不存在,就表示重复提交下单,服务端直接返回重复下单或其他友好文案。

(2)数据库去重表

往去重表里插入数据的时候,利用数据库的唯一索引特性,保证唯一的逻辑。唯一序列号可以是一个字段,例如订单的订单号。

(3)状态机实现

对于很多业务是有一个业务流转状态的,每个状态都有前置状态和后置状态,以及最后的结束状态。

以订单为例,已支付的状态的前置状态只能是待支付,而取消状态的前置状态只能是待支付,通过这种状态机的流转我们就可以控制请求的幂等。

(4)其他方式

当然还有其他很多方式比如利用redis,加锁等许多方式,针对不同的业务使用合适的实现幂等的方法。

4、如何测试幂等性

(1)网络重发,比如在扫码支付时,商户在扫码时,先断网扫码一次再重连扫码。

(2)系统重发,比如接口请求超时,通过接口补处理机制,触发新的请求。

(3)消息重发,比如通过某个消息中间件重复推送消息,查看消费者是否重复消费。

(4)接口重发,比如对同一笔订单,通过脚本重复提交。

继续阅读