在之前的几天,抽空完成了浏览器请求重放的基础功能,今天得空写了一个多链路性能测试实践的Demo,顺便也解决了之前一直遗留的重放浏览器性能测试中关于多接口请求顺序的问题。
旧文如下:
下面进入正题,主要思路如下:
FileUtil
获取某一目录下全部文件CurlUtil
将文件转换成List<HttpRequestBase>
对象这个思路比较朴实没啥可讲的,只是在最后一步需要自己写一个多线程类,实现一下循环请求从文件中获取到的List<HttpRequestBase>
中的HttpRequestBase
对象。由于每一个链路的请求耗时各不相同,所以难以采取固定请求次数
的模式,故而智能采取固定请求时间
的模式,这里默认了固定线程
而非固定QPS
的压测模型。
package com.okayqa
import com.alibaba.fastjson.JSONObject
import com.fun.base.constaint.ThreadLimitTimeCount
import com.fun.base.exception.FailException
import com.fun.base.interfaces.MarkThread
import com.fun.frame.httpclient.FanLibrary
import com.fun.utils.FileUtil
import com.okayqa.common.Common
import com.okayqa.composer.base.OkayBase
import org.apache.http.client.methods.HttpRequestBase
import static com.fun.utils.CurlUtil.getRequests
class TTT extends OkayBase {
public static void main(String[] args) {
//path为文件的绝对路径+文件名
String path = ""
//time是压测时间,单位秒(s)
def time = 1000
//用例描述,控制在20个字以内
def desc = "FunTester多链路压测Demo"
//获取多链路日志
def file = FileUtil.getAllFile(path)
def tasks = []
file.each {
tasks << new FunTester(it, time, null)
}
new Concurrent(tasks, desc).start()
FanLibrary.testOver()
}
/**
* FunTester测试类
*/
static class FunTester extends ThreadLimitTimeCount<String> {
List<HttpRequestBase> reqs
FunTester(String s, int time, MarkThread markThread) {
super(s, time, markThread)
reqs = getRequests(s)
}
@Override
void before() {
super.before()
//初始化标记字符,防止空指针异常
threadmark = threadmark == null ? EMPTY : threadName
}
@Override
protected void doing() throws Exception {
reqs.each {
it.removeHeaders(Common.REQUEST_ID.getName())
def header = Common.getRequestIdHeader()
it.addHeader(header)
threadmark << header + CONNECTOR
JSONObject simlple = FanLibrary.executeSimlple(it)
if (!isRight(simlple)) FailException.fail("响应错误!" + it.getURI().toString())
}
}
}
}
这里我添加了threadmark
初始化工作,以及在doing()
方法中进行标记的处理,以及每一个请求的通用业务验证。如果对于部分接口有更加细致的验证需求,可以自己实现一下,我这里先抛砖引玉。
INFO-> 当前用户:fv,IP:10.60.193.37,工作目录:/Users/fv/Documents/workspace/okay_test/,系统编码格式:UTF-8,系统Mac OS X版本:10.16
INFO-> FunTester多链路压测Demo进度:▍▍▍▍▍▍▍▍▍▍▍ 16.41%
INFO-> FunTester多链路压测Demo进度:▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍ 32.83%
INFO-> FunTester多链路压测Demo进度:▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍ 49.25%
INFO-> FunTester多链路压测Demo进度:▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍ 65.67%
INFO-> FunTester多链路压测Demo进度:▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍ 82.08%
INFO-> FunTester多链路压测Demo进度:▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍ 100%
INFO-> 线程:FunTester多链路压测Demo0,执行次数:37, 失败次数: 0,总耗时: 30.024 s
这里省略大部分无用日志
INFO-> 线程:FunTester多链路压测Demo24,执行次数:38, 失败次数: 0,总耗时: 31.095 s
INFO-> 总计50个线程,共用时:31.121 s,执行总数:1917,错误数:0,失败数:0
INFO-> 数据保存成功!文件名:/Users/fv/Documents/workspace/okay_test/long/data/FunTester多链路压测Demo031618,50
INFO-> 数据保存成功!文件名:/Users/fv/Documents/workspace/okay_test/long/mark/FunTester多链路压测Demo031618
INFO->
~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~ JSON ~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~
> {
> ① . "rt":796,
> ① . "total":1917,
> ① . "qps":62.814,
> ① . "failRate":0.0,
> ① . "threads":50,
> ① . "startTime":"2021-02-03 16:18:14",
> ① . "endTime":"2021-02-03 16:18:45",
> ① . "errorRate":0.0,
> ① . "executeTotal":1917,
> ① . "mark":"FunTester多链路压测Demo031618",
> ① . "table":"eJzj5VIgDNxK80JSi0tSi54umfVy8r4X29c/7et+trXbJTU338DY0MzQwtSACGN4uXjx2xaUWlyQn1ecqhCSmZtqpVChW5xalJmYo5BXmqujUKmbm5qSmZhHyA6CzsjNzFOAGGVlbGiqkFusk5tYYWVoZAFiE+MLwmooAI+mdQAR7Wx5NK0JiGDW0NS2R9OagQjNKtrZiNVntLX10bRWIMJrJdVtfjStEYiAVDsQEWM1dV3waFoLEJFgL/VdQXyo084lRCQ2erqIwlihhauoE0vUdRm5eYdOLqRFoqKyK2kfq5S7lN6xTKGL4c4dSHeS5moaFjc0czk8cw2CVEGGDwaobKCmLwa27KCOTwZT2UIFH+Frog8xCuarwVs2UeSz4ectuO+GZrlAmg8HgTNGfTjqw1EfDrwzRn046kO8PgQAblRBew=="
> }
~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~ JSON ~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~
INFO->
FunTester多链路压测Demo03161850
Response Time: x-serial num, y-median
min median:315 ms,max:1285 ms
这里省略文本图像,下文中有效果展示
Process finished with exit code 0