声明:原创文章,转载请注明出处。https://www.jianshu.com/p/a30e2a77f62a
一、背景
由于最近题主在做一些分布式测试工具的开发,想分享一些思路或者想法出来。
具体的产品可见,小米分布式测试平台 (一)- 初识 Pecker。
因为涉及公司的项目以及保密性,故只分享一些这种工具的开发思路。
HTTP协议无论在公司内网或者公司外网来讲,尤其重要。但对其进行性能压测和功能压测的工具基本就那几种。且每个公司业务和环境不同,移植或者二次开发难度很大。
因此,大公司在这件事情基本上都投入很多人力,但核心功能还是下面讲到的这些。
声明:原创文章,转载请注明出处。https://www.jianshu.com/p/a30e2a77f62a
二、HTTP性能测试
1、基本架构
还是搬出下面这个图,HTTP测试功能只是在容器云上运行的一个客户端。
这样做的原因是:控制台和调度层相对独立,功能保持不变。容器云的Pod提供运行时环境,真正跑的任务为一个HTTP测试客户端。
清楚了,HTTP测试功能的整体所处的位置后,我们再考虑HTTP功能的各个模块。
2、HTTP功能模块
整个HTTP测试功能,一般需要以下四个模块。分别为:任务基本配置、测试配置、客户端特殊配置以及服务端配置。
- 基本配置:整个测试平台通用,包括常见的任务所属、名称以及任务环境、测试类型等。
- 测试配置:整个测试平台通用,包括压测方式以及压力机配置。
- 客户端特殊配置:HTTP测试功能专属。包括一些HTTP参数设置以及检查点配置。
- 服务端配置:待监控的服务端信息。
我画了一张草图,基本上HTTP测试就是下面这个样子:
题外音:原谅一个不会画原型图的程序员吧!!
3、基本配置
HTTP任务作为一种任务形态依附于项目,因此需要定义相关的项目和任务名称。基本配置作用于各个任务形态(RPC、HTTP、Jar)。
- 任务环境:通常来讲,环境分为测试环境和生产环境,当然也可以根据不同的机房进行定义;该项设定主要是决定了任务运行的Pod属于哪个环境。
- 任务类型:由于为HTTP任务,故此项无需改动。其他的选项为:RPC、Jar任务等。
- 测试类型:主要分为性能压测和功能测试两部分。
4、测试配置
也是整个测试平台的通用配置,主要包括压测方式设置以及压力机配置。
- 压测方式:可设置为用户数模式和TPS模式。二者的主要区别在于用户数模式,客户端会模拟等量的用户进行不间断测试;而TPS模式仅仅是保证在一个自然数周围进行测试(如设置TPS=1000,则客户端会尽量保证在这附近进行测试)
- 压力机配置:需要配置压力机的数量、CPU核数以及内存大小。其实就是对Pod的设置。
5、客户端请求
该模块作为HTTP任务的专用模块。可配置一些HTTP的常见基本参数。
- CSV功能替换模型:该模型比较难以理解。我们辅助一个例子来说明:假设有一个后端服务提供一个这样的接口:
path:/demo
参数:id=?
返回值:id
示例1:www.test.com/demo?id=1&name=1 返回:1
示例2:www.test.com/demo?id=2&name=2 返回:2
对这样的接口测试,我们不可能只请求一个不变的例子(如id===1),也不可能穷举N个任务,每个任务发送一个固定的请求。
所以,我们需要使用变量替换掉id,即:
www.test.com/demo?id=${id}&name=${name}
然后,在CSV中保证有id列和name列,即可。这样平台在测试过程中,会一行行进行遍历和替换。
- 检查点:对结果进行断言验证。提取点包括:ResponseHeader和ResponseBody;其中ResponseHeader只支持键值对匹配,ResponseBody支持JSON提取、文本提取和正则匹配等。
6、服务端监控
对被压测的服务进行监控,其实现思路常见有2种:服务端开启JMX或者服务端使用我们提供的Agent进行数据回传。
声明:原创文章,转载请注明出处。https://www.jianshu.com/p/a30e2a77f62a
三、HTTP任务调试
如果任务保存后,再执行。通常会进行一个:保存、Pod测试、报表收集等过程。
假设用户在编辑任务表单时输错了一个字符,仍需要进行以上步骤,其效率将大大折扣。
基于此,我们需要用户在编辑任务表单时,实时调试自己的任务,如下:
其中,概览包括请求及响应头信息、请求Body为POST时请求的数据、响应信息为服务端的真实响应数据。
备注:由于调试功能仅为校验表单的作用,是不能CSV替换模型同时使用。
声明:原创文章,转载请注明出处。https://www.jianshu.com/p/a30e2a77f62a
四、HTTP定时测试
多数情况下,我们的任务不仅要执行一次,而是多次执行。那任务本身如果支持定时测试,那真是极好的,至少不用外接Jenkins进行定时调度。
通常,我们为用户支持两种方式来支持定时调度,分别为Crontab模式和闹钟模式。
至于任务本身的定时调度实现,我们可以使用Spring Schedule或者Quartz组件,但是需要保证多节点不会同时调度的问题。
五、HTTP功能测试
针对HTTP功能来讲,无非就是跑一些case,能够输出判断结果。
可以精简性能测试模块,去掉压力机的相关配置。
任务须配置为CSV模式,其中包括请求参数变量以及检查点变量。具体不再详述。
声明:原创文章,转载请注明出处。https://www.jianshu.com/p/a30e2a77f62a