在日常的性能测试中,流量回放是一个非常优秀的方式,不仅可以快速构建测试用例且无限贴近预设场景,而且借助许多优秀的回放框架如goreplay等,可以极大地降低测试门槛,节省时间成本。此方式非常适合进行快速的性能排查,于在有限的资源下快速发现解决问题。
而另外一种方式就是重新构建测试场景的请求。常用的单接口测试、多接口混合测试、链路测试、全链路测试等等都是基于这个方式。单相比于流量回放能够实现的场景更加灵活,对于测试过程的控制也更加精细,对于集成CI/CD
以及性能巡检也更加容易。但这类测试用例所面临的最大问题就是如何更加贴近真实流量。从单个接口来说就是用户在请求的时候参数分布,从业务链来说用户操作链路分叉。如果是针对某些特定场景的用例,所需要考虑的这些因素就比较少,但是在外扩方向上的全量负载测试的情况和内缩方向的精细化性能测试来说就显得有些捉襟见肘,复杂度就会飙升。
在之前的文章中,(需要的加我qq:3177181324)提到将所有的接口封装成方法,将功能和性能测试对象都转化成对这个方法的测试。通过构造参数、请求方法、处理返回值,这三步将执行测试用例的整个过程放在Java
或者Groovy
脚本中实现,这样用例的复杂程度很降低可读性会增高,也能极大提高测试框架的拓展性。
在实践过程中有一个必经之路的小石头:分段随机,就是根据线上流量分析出一个预设场景下的流量模型,主要信息就是接口请求比例,接口参数比例。然后根据这个比例发送不同的请求,携带不同的参数,使得压测流量更加贴近真实流量。
功能实现
这里我写了两个方法,思路前半部分重合如下:
- 先将
map
分成两个对应的list
,一个保存key
一个保存value
后半部分不尽相同:
第一种:
- 将
values
转换成第i
项为旧list
前i
项之和的形式 - 随机函数从1~
values
最后一项(即旧list
所有项之和)一个整型数字 - 循环判断该值落入某两个
index
下标的value
之间,取出keys
中响应的key
返回
/**
* 根据不同的概率随机出一个对