性能工具之 Locust 工具 Get 与 Post 请求

简介: 【4月更文挑战第7天】性能工具之 Locust 工具 Get 与 Post 请求

2000元阿里云代金券免费领取,2核4G云服务器仅664元/3年,新老用户都有优惠,立即抢购>>>


阿里云采购季(云主机223元/3年)活动入口:请点击进入>>>,


阿里云学生服务器(9.5元/月)购买入口:请点击进入>>>,

前言

最近在学习 Locust 性能工具,发现 Locust 性能工具脚本需要 python 基础才能写脚本,但是对于性能测试人员来说 python 是基本功夫。

脚本示例

在 Locust 中 get 脚本怎么写,为了方便直接在代码运行调试,采用关闭 web 模式,通过参考官方文档自己实验 get/post 代码,参考代码如:

    @task(1)
    def get_7dTest(self):
        # 定义请求头
        header = {
   
            "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36"}
        response = self.client.get("/7d/", headers=header, verify=False)
        # print("Response status code:", response.status_code)
        if response.status_code == 200:
            print("successful")
            # print("Response text:", response.json())
        else:
            print('failure')

Post请求写法如下:

     # 登陆
    @task(1)
    def get_login(self):
        response = self.client.post("/login", {
   "userName": "7d", "passWord": "123456"})
        print("Response json:", response.json())

结果:

# 结果:
[2021-04-24 21:36:49,495] liwen.local/INFO/locust.main: Run time limit set to 1 seconds
[2021-04-24 21:36:49,495] liwen.local/INFO/locust.main: Starting Locust 1.4.4
[2021-04-24 21:36:49,496] liwen.local/INFO/locust.runners: Spawning 1 users at the rate 1 users/s (0 users already running)...
[2021-04-24 21:36:49,496] liwen.local/INFO/locust.runners: All users spawned: webTestDunShan: 1 (1 total running)
[2021-04-24 21:36:49,496] liwen.local/INFO/root: Terminal was not a tty. Keyboard input disabled
 Name                                                          # reqs      # fails  |     Avg     Min     Max  Median  |   req/s failures/s
--------------------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------------------------
 Aggregated                                                         0     0(0.00%)  |       0       0       0       0  |    0.00    0.00

Response json: {
   'msg': 'success', 'code': 0, 'data': '登陆成功'}
successful
Response json: {
   'msg': 'success', 'code': 0, 'data': '登陆成功'}
Response json: {
   'msg': 'success', 'code': 0, 'data': '登陆成功'}
Response json: {
   'msg': 'success', 'code': 0, 'data': '登陆成功'}
Response json: {
   'msg': 'success', 'code': 0, 'data': '登陆成功'}

post 请求 json 请求写法:

    @task(1)
    def get_login_json(self):
        jsonData = {
   "userName": "7d", "passWord": "123456"}
        response = self.client.post("/login/json", json=json.dumps(jsonData))
        print("Response json:", response.json())

        # 结果
        Response json: {
   'msg': 'success', 'code': 0, 'data': '登陆成功'}

实验请求资源代码:


    @GetMapping("/7d")
    @ResponseBody
    public R indexPage() {
   
        HashMap<String, Object> map = new HashMap<>();
        map.put("success", "欢迎来到性能实战课堂");
        map.put("Data", new Date());
        return R.ok().put("data", map);
    }


    /**
     * 登陆
     *
     * @param memberEntity
     * @return
     */

    @PostMapping("/login")
    @ResponseBody
    public R login(MemberEntity memberEntity) {
   

        if ("7d".equals(memberEntity.getUserName()) && "123456".equals(memberEntity.getPassWord())) {
   
            return R.ok().put("data", "登陆成功");
        }
        return R.error().put("data", "用户名或者密码失败");
    }


    /**
     * 登陆
     *
     * @param requestBody
     * @return
     */

    @PostMapping(value = "/login/json", produces = "application/json")
    @ResponseBody
    public R login_json(@RequestBody String requestBody) {
   
        log.info("json数据:{}", requestBody);
        Object parse = JSON.parse(requestBody);
        MemberEntity memberEntity = JSON.parseObject(parse.toString(), MemberEntity.class);
        if ("7d".equals(memberEntity.getUserName()) && "123456".equals(memberEntity.getPassWord())) {
   
            return R.ok().put("data", "登陆成功");
        }
        return R.error().put("data", "用户名或者密码失败");
    }

Locust 直接在 Python 代码调试代码关闭web页面,这样调试很方便,参考如下命令:

os.system("locust -f demoLcou.py --host=http://127.0.0.1:8080 --headless -u 1 -r 1 -t 1s")
# –no-web 表示不使用Web界面运行测试。
# -c 设置虚拟用户数。
# -r 设置每秒启动虚拟用户数。
# -t 设置设置运行时间。

# 结果参考:
[2021-04-24 22:23:59,688] liwen.local/INFO/locust.main: Run time limit set to 1 seconds
[2021-04-24 22:23:59,688] liwen.local/INFO/locust.main: Starting Locust 1.4.4
[2021-04-24 22:23:59,688] liwen.local/INFO/locust.runners: Spawning 1 users at the rate 1 users/s (0 users already running)...
[2021-04-24 22:23:59,688] liwen.local/INFO/locust.runners: All users spawned: webTestDunShan: 1 (1 total running)
[2021-04-24 22:23:59,689] liwen.local/INFO/root: Terminal was not a tty. Keyboard input disabled
 Name                                                          # reqs      # fails  |     Avg     Min     Max  Median  |   req/s failures/s
--------------------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------------------------
 Aggregated                                                         0     0(0.00%)  |       0       0       0       0  |    0.00    0.00

successful
Response json: {'msg': '未知异常,请联系管理员', 'code': 500, 'data': '用户名或者密码失败'}
。。。。。中间省略。。。。
successful
[2021-04-24 22:24:00,454] liwen.local/INFO/locust.main: Time limit reached. Stopping Locust.
[2021-04-24 22:24:00,454] liwen.local/INFO/locust.runners: Stopping 1 users
[2021-04-24 22:24:00,455] liwen.local/INFO/locust.runners: 1 Users have been stopped, 0 still running
[2021-04-24 22:24:00,455] liwen.local/INFO/locust.main: Running teardowns...
[2021-04-24 22:24:00,455] liwen.local/INFO/locust.main: Shutting down (exit code 0), bye.
[2021-04-24 22:24:00,455] liwen.local/INFO/locust.main: Cleaning up runner...
 Name                                                          # reqs      # fails  |     Avg     Min     Max  Median  |   req/s failures/s
--------------------------------------------------------------------------------------------------------------------------------------------
 GET /                                                            166     0(0.00%)  |       1       1       5       2  |  216.65    0.00
 GET /7d/                                                          89     0(0.00%)  |       1       1      12       1  |  116.16    0.00
 POST /login                                                       98     0(0.00%)  |       1       1       2       1  |  127.90    0.00
 POST /login/json                                                  87     0(0.00%)  |       1       1       2       2  |  113.55    0.00
--------------------------------------------------------------------------------------------------------------------------------------------
 Aggregated                                                       440     0(0.00%)  |       1       1      12       2  |  574.26    0.00

Response time percentiles (approximated)
 Type     Name                                                              50%    66%    75%    80%    90%    95%    98%    99%  99.9% 99.99%   100% # reqs
--------|------------------------------------------------------------|---------|------|------|------|------|------|------|------|------|------|------|------|
 GET      /                                                                   2      2      2      2      2      3      3      5      6      6      6    166
 GET      /7d/                                                                1      1      1      1      2      2      2     12     12     12     12     89
 POST     /login                                                              1      1      1      1      2      2      2      2      2      2      2     98
 POST     /login/json                                                         2      2      2      2      2      2      2      3      3      3      3     87
--------|------------------------------------------------------------|---------|------|------|------|------|------|------|------|------|------|------|------|
 None     Aggregated                                                          2      2      2      2      2      2      3      3     12     12     12    440


Process finished with exit code 0

总结

Locust 官方文档还是比较详细,只要慢慢看就能掌握 Locust 工具怎么操作,但是在老师性能工程中,工具只要能发压就行。

参考资料:

目录
相关文章
|
4天前
|
编解码 测试技术 索引
性能工具之 Jmeter 使用 HTTP 请求编写 HLS 脚本
在我们简要介绍了 HLS 协议的基础知识,接下来我们详细介绍一种使用 Jmeter 编写压测 HLS 协议脚本的方法。
88 1
性能工具之 Jmeter 使用 HTTP 请求编写 HLS 脚本
|
Web App开发 消息中间件 监控
浏览器原理 39 # 页面性能工具:如何使用 Performance?
浏览器原理 39 # 页面性能工具:如何使用 Performance?
382 0
浏览器原理 39 # 页面性能工具:如何使用 Performance?
|
3天前
|
消息中间件 前端开发 JavaScript
第七篇 提升网页性能:深入解析HTTP请求优化策略(二)
第七篇 提升网页性能:深入解析HTTP请求优化策略(二)
|
4天前
|
JSON Java 测试技术
性能工具之 nGrinder Post 请求脚本
【5月更文挑战第4天】性能工具之 nGrinder Post 请求脚本
18 2
性能工具之 nGrinder Post 请求脚本
|
测试技术 Linux
三分钟搞定压力测试之http_load
本文对一个正在云服务器上运行的系统进行一个并发访问的压力测试,以此来模仿真实环境并发访问造成资源带宽不稳定出现的种种问题。
315 0
三分钟搞定压力测试之http_load
|
4天前
|
SQL JSON Java
性能工具之 nGrinder Get 请求脚本编写
【5月更文挑战第3天】性能工具之 nGrinder Get 请求脚本编写
28 8
|
4天前
|
Web App开发 测试技术 API
Postman软件基本用法:浏览器复制请求信息并导入到软件从而测试、发送请求
Postman软件基本用法:浏览器复制请求信息并导入到软件从而测试、发送请求
|
8月前
|
JSON 数据格式
wrk post lua脚本取excel参数压力测试,判断接口性能
wrk post lua脚本取excel参数压力测试,判断接口性能
158 0
|
8月前
|
数据安全/隐私保护
深入解析 curl:掌握命令行的网络传输利器
当我们使用 `curl` 进行网络请求时,了解如何有效地使用参数是非常重要的。`curl` 提供了许多参数,用于控制请求的行为和配置。在这篇博客文章中,我们将详细解释一些常用的 `curl` 参数,帮助你更好地理解如何利用这个强大的工具。
173 2
深入解析 curl:掌握命令行的网络传输利器
|
JavaScript 前端开发 测试技术
【实测】django测试平台必看:各种请求方式的利弊和适用场景
【实测】django测试平台必看:各种请求方式的利弊和适用场景
【实测】django测试平台必看:各种请求方式的利弊和适用场景
http://www.vxiaotou.com