写点什么

基于 docker 的分布式性能测试框架功能验证(三)

用户头像
FunTester
关注
发布于: 2 小时前

本文是 FunTester 测试框架分布式性能测试功能拓展实践,是一种比较粗略的技术验证实践,技术方案采用



粗实现方案分成三块:master 调度机slave 测试机server 被测服务


  • master 调度机:处理用例、分配任务

  • slave 测试机:接受任务、执行用例

  • server 被测服务:提供测试接口

docker 镜像

内容同文章基于docker的分布式性能测试框架功能验证(一),这里不再赘述。

master 调度机

这里master节点接收到用例通过参数分配给slave测试机运行。由于只是功能性验证,我就选了一个slave节点。我依然值采用了固定线程固定请求次数的压测模型,用例就是功能验证的案例。


这里依然采用了FunTester moco server实现,分布式测试框架单节点版本正在内测,更多消息请留意近期公众号推文。

master 脚本

这里只返回一个测试脚本,这里就不用参数化了,有点麻烦。下面是脚本内容:


package com.mocofun.moco.main

import com.alibaba.fastjson.JSONObjectimport com.funtester.base.bean.Resultimport com.funtester.utils.RWUtilimport com.mocofun.moco.MocoServer
class DcsServer3 extends MocoServer {
public static void main(String[] args) { def server = getServer(12345) def res = new JSONObject() res.script = RWUtil.readTxtByString("/Users/oker/IdeaProjects/funtester/src/test/groovy/com/funtest/groovytest/Share.groovy") server.get(urlStartsWith("/m")).response(obRes(Result.success(res))) def run = run(server) waitForKey("fun") run.stop() }}
复制代码


/Users/oker/IdeaProjects/funtester/src/test/groovy/com/funtest/groovytest/Share.groovy脚本内容:

测试用例

package com.funtest.groovytest
import com.funtester.config.Constantimport com.funtester.frame.execute.Concurrentimport com.funtester.frame.thread.RequestThreadTimesimport com.funtester.httpclient.ClientManageimport com.funtester.httpclient.FunLibraryimport com.funtester.utils.ArgsUtilimport org.apache.http.client.methods.HttpGet
class Share extends FunLibrary {
public static void main(String[] args) { ClientManage.init(10, 5, 0, "", 0); def util = new ArgsUtil(args) int thread = util.getIntOrdefault(0, 20); int times = util.getIntOrdefault(1, 100); String url = "http://localhost:12345/m"; HttpGet get = getHttpGet(url); Constant.RUNUP_TIME = 0; RequestThreadTimes task = new RequestThreadTimes(get, times); new Concurrent(task, thread, "本地固定QPS测试").start(); }
public static void test(String params) { main(params.split(COMMA)) }
}
复制代码


这里test(String params)为了做参数化特意加的,可忽略。

slave 测试机

这个逻辑通过简单的轮询去master调度机提供的接口获取测试任务或者测试用例。然后解析,执行测试用例。



package com.funtest.groovytest
import com.funtester.frame.execute.ExecuteGroovyimport com.funtester.httpclient.FunLibrary
class Dcs3 extends FunLibrary {
public static void main(String[] args) { while (true) { // String url = "http://host.docker.internal:12345/m" //请求此接口会返回一个用例,目前没有用对象封装 String url = "http://localhost:12345/m" //请求此接口会返回一个用例,目前没有用对象封装 def get = getHttpGet(url) def response = getHttpResponse(get) if (response.getInteger("code") == 0) { def data = response.getJSONObject("data") def script = data.getString("script") ExecuteGroovy.executeScript(script) } sleep(5.0) fail() } }}
复制代码


就是从服务拿到用例,然后使用默认参数运行测试用例。


控制台输出:


INFO-> 当前用户:oker,工作目录:/Users/oker/IdeaProjects/funtester/,系统编码格式:UTF-8,系统Mac OS X版本:10.16INFO-> 请求uri:http://localhost:12345/m , 耗时:463 ms , HTTPcode: 200INFO-> =========预热完成,开始测试!=========INFO-> 本地固定QPS测试进度:▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍  100%INFO-> 总计20个线程,共用时:0.754 s,执行总数:1933,错误数:0,失败数:0INFO-> 数据保存成功!文件名:/Users/oker/IdeaProjects/funtester/long/data/本地固定QPS测试251800_20INFO-> ~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~ JSON ~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~>  {>  ① . "rt":7,>  ① . "failRate":0.0,>  ① . "threads":20,>  ① . "deviation":"10.27%",>  ① . "errorRate":0.0,>  ① . "executeTotal":1933,>  ① . "qps2":2563.660477453581,>  ① . "total":1933,>  ① . "qps":2857.1428571428573,>  ① . "startTime":"2021-06-25 18:00:52",>  ① . "endTime":"2021-06-25 18:00:53",>  ① . "mark":"本地固定QPS测试251800",>  ① . "table":"eJzj5VIgCjybs+bpnA1PZ+96um5WYEDws63dL9ZPVTAyUCjJKEpNTCHOEAVeLl789gWlFhfk5xWnKoRk5qZaKVToFqcWZSbmKOSV5uooVOrmpqZkJuYRsoMIh+Rm5ilADLMyVMgt1slNrLAyMQeyqOILSsGjaR1ARJxPRm0ZtWXUllFbRm0ZtWXUllFbCFrRCET0sQlsBa1tQvUQTW17NK0ZiNCsorqNcA9BqVYgQlBYrKaiC+A+xO1RIigKXILuXYK+poar0H2Nj6KGS6jmAxqGFp1882haExANDgdR2XdDLDrI8CEA/wFbOg==">  }~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~ JSON ~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~
Process finished with exit code 1
复制代码


server 被测服务

内容通方案(一)这里依然不分享了。


日志如下:


Content-Length: 1089Content-Type: text/plain; charset=utf-8
{"code":0,"data":{"script":"package com.funtest.groovytest;\r\n\r\nimport com.funtester.config.Constant;\r\nimport com.funtester.frame.execute.Concurrent;\r\nimport com.funtester.frame.thread.RequestThreadTimes;\r\nimport com.funtester.httpclient.ClientManage;\r\nimport com.funtester.httpclient.FunLibrary;\r\nimport com.funtester.utils.ArgsUtil;\r\nimport org.apache.http.client.methods.HttpGet;\r\n\r\nclass Share extends FunLibrary {\r\n\r\n public static void main(String[] args) {\r\n ClientManage.init(10, 5, 0, \"\", 0);\r\n def util = new ArgsUtil(args)\r\n int thread = util.getIntOrdefault(0, 20);\r\n int times = util.getIntOrdefault(1, 100);\r\n String url = \"http://localhost:12345/m\";\r\n HttpGet get = getHttpGet(url);\r\n Constant.RUNUP_TIME = 0;\r\n RequestThreadTimes task = new RequestThreadTimes(get, times);\r\n new Concurrent(task, thread, \"本地固定QPS测试\").start();\r\n }\r\n\r\n public static void test(String params) {\r\n main(params.split(COMMA))\r\n }\r\n\r\n}\r\n"}}
Request received:
GET /favicon.ico HTTP/1.1Host: localhost:12345Connection: keep-alivePragma: no-cacheCache-Control: no-cachesec-ch-ua: " Not;A Brand";v="99", "Google Chrome";v="91", "Chromium";v="91"DNT: 1sec-ch-ua-mobile: ?0User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.114 Safari/537.36Accept: image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8Sec-Fetch-Site: same-originSec-Fetch-Mode: no-corsSec-Fetch-Dest: imageReferer: http://localhost:12345/mAccept-Encoding: gzip, deflate, brAccept-Language: zh-CN,zh;q=0.9,en;q=0.8sec-gpc: 1content-length: 0
Response return:
HTTP/1.1 400
复制代码

Have Fun ~ Tester !

FunTester,一群有趣的灵魂,腾讯云 &Boss 认证作者,GDevOps 官方合作媒体。




点击阅读阅文,查看 FunTester 历史原创集合

发布于: 2 小时前阅读数: 4
用户头像

FunTester

关注

公众号:FunTester,Have Fun, Tester! 2020.10.20 加入

Have Fun,Tester!

评论

发布
暂无评论
基于docker的分布式性能测试框架功能验证(三)