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

x33g5p2x  于2022-01-09 转载在 其他  
字(6.1k)|赞(0)|评价(0)|浏览(610)

前言

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

脚本示例

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

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

Post请求写法如下:

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

结果:

  1. # 结果:
  2. [2021-04-24 21:36:49,495] liwen.local/INFO/locust.main: Run time limit set to 1 seconds
  3. [2021-04-24 21:36:49,495] liwen.local/INFO/locust.main: Starting Locust 1.4.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)...
  5. [2021-04-24 21:36:49,496] liwen.local/INFO/locust.runners: All users spawned: webTestDunShan: 1 (1 total running)
  6. [2021-04-24 21:36:49,496] liwen.local/INFO/root: Terminal was not a tty. Keyboard input disabled
  7. Name # reqs # fails | Avg Min Max Median | req/s failures/s
  8. --------------------------------------------------------------------------------------------------------------------------------------------
  9. --------------------------------------------------------------------------------------------------------------------------------------------
  10. Aggregated 0 0(0.00%) | 0 0 0 0 | 0.00 0.00
  11. Response json: {'msg': 'success', 'code': 0, 'data': '登陆成功'}
  12. successful
  13. Response json: {'msg': 'success', 'code': 0, 'data': '登陆成功'}
  14. Response json: {'msg': 'success', 'code': 0, 'data': '登陆成功'}
  15. Response json: {'msg': 'success', 'code': 0, 'data': '登陆成功'}
  16. Response json: {'msg': 'success', 'code': 0, 'data': '登陆成功'}

post 请求 json 请求写法:

  1. @task(1)
  2. def get_login_json(self):
  3. jsonData = {"userName": "7d", "passWord": "123456"}
  4. response = self.client.post("/login/json", json=json.dumps(jsonData))
  5. print("Response json:", response.json())
  6. # 结果
  7. Response json: {'msg': 'success', 'code': 0, 'data': '登陆成功'}

实验请求资源代码:

  1. @GetMapping("/7d")
  2. @ResponseBody
  3. public R indexPage() {
  4. HashMap<String, Object> map = new HashMap<>();
  5. map.put("success", "欢迎来到性能实战课堂");
  6. map.put("Data", new Date());
  7. return R.ok().put("data", map);
  8. }
  9. /**
  10. * 登陆
  11. *
  12. * @param memberEntity
  13. * @return
  14. */
  15. @PostMapping("/login")
  16. @ResponseBody
  17. public R login(MemberEntity memberEntity) {
  18. if ("7d".equals(memberEntity.getUserName()) && "123456".equals(memberEntity.getPassWord())) {
  19. return R.ok().put("data", "登陆成功");
  20. }
  21. return R.error().put("data", "用户名或者密码失败");
  22. }
  23. /**
  24. * 登陆
  25. *
  26. * @param requestBody
  27. * @return
  28. */
  29. @PostMapping(value = "/login/json", produces = "application/json")
  30. @ResponseBody
  31. public R login_json(@RequestBody String requestBody) {
  32. log.info("json数据:{}", requestBody);
  33. Object parse = JSON.parse(requestBody);
  34. MemberEntity memberEntity = JSON.parseObject(parse.toString(), MemberEntity.class);
  35. if ("7d".equals(memberEntity.getUserName()) && "123456".equals(memberEntity.getPassWord())) {
  36. return R.ok().put("data", "登陆成功");
  37. }
  38. return R.error().put("data", "用户名或者密码失败");
  39. }

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

  1. os.system("locust -f demoLcou.py --host=http://127.0.0.1:8080 --headless -u 1 -r 1 -t 1s")
  2. # –no-web 表示不使用Web界面运行测试。
  3. # -c 设置虚拟用户数。
  4. # -r 设置每秒启动虚拟用户数。
  5. # -t 设置设置运行时间。
  6. # 结果参考:
  7. [2021-04-24 22:23:59,688] liwen.local/INFO/locust.main: Run time limit set to 1 seconds
  8. [2021-04-24 22:23:59,688] liwen.local/INFO/locust.main: Starting Locust 1.4.4
  9. [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)...
  10. [2021-04-24 22:23:59,688] liwen.local/INFO/locust.runners: All users spawned: webTestDunShan: 1 (1 total running)
  11. [2021-04-24 22:23:59,689] liwen.local/INFO/root: Terminal was not a tty. Keyboard input disabled
  12. Name # reqs # fails | Avg Min Max Median | req/s failures/s
  13. --------------------------------------------------------------------------------------------------------------------------------------------
  14. --------------------------------------------------------------------------------------------------------------------------------------------
  15. Aggregated 0 0(0.00%) | 0 0 0 0 | 0.00 0.00
  16. successful
  17. Response json: {'msg': '未知异常,请联系管理员', 'code': 500, 'data': '用户名或者密码失败'}
  18. 。。。。。中间省略。。。。
  19. successful
  20. [2021-04-24 22:24:00,454] liwen.local/INFO/locust.main: Time limit reached. Stopping Locust.
  21. [2021-04-24 22:24:00,454] liwen.local/INFO/locust.runners: Stopping 1 users
  22. [2021-04-24 22:24:00,455] liwen.local/INFO/locust.runners: 1 Users have been stopped, 0 still running
  23. [2021-04-24 22:24:00,455] liwen.local/INFO/locust.main: Running teardowns...
  24. [2021-04-24 22:24:00,455] liwen.local/INFO/locust.main: Shutting down (exit code 0), bye.
  25. [2021-04-24 22:24:00,455] liwen.local/INFO/locust.main: Cleaning up runner...
  26. Name # reqs # fails | Avg Min Max Median | req/s failures/s
  27. --------------------------------------------------------------------------------------------------------------------------------------------
  28. GET / 166 0(0.00%) | 1 1 5 2 | 216.65 0.00
  29. GET /7d/ 89 0(0.00%) | 1 1 12 1 | 116.16 0.00
  30. POST /login 98 0(0.00%) | 1 1 2 1 | 127.90 0.00
  31. POST /login/json 87 0(0.00%) | 1 1 2 2 | 113.55 0.00
  32. --------------------------------------------------------------------------------------------------------------------------------------------
  33. Aggregated 440 0(0.00%) | 1 1 12 2 | 574.26 0.00
  34. Response time percentiles (approximated)
  35. Type Name 50% 66% 75% 80% 90% 95% 98% 99% 99.9% 99.99% 100% # reqs
  36. --------|------------------------------------------------------------|---------|------|------|------|------|------|------|------|------|------|------|------|
  37. GET / 2 2 2 2 2 3 3 5 6 6 6 166
  38. GET /7d/ 1 1 1 1 2 2 2 12 12 12 12 89
  39. POST /login 1 1 1 1 2 2 2 2 2 2 2 98
  40. POST /login/json 2 2 2 2 2 2 2 3 3 3 3 87
  41. --------|------------------------------------------------------------|---------|------|------|------|------|------|------|------|------|------|------|------|
  42. None Aggregated 2 2 2 2 2 2 3 3 12 12 12 440
  43. Process finished with exit code 0

总结

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

参考资料:

  • 官方文档:https://docs.locust.io/en/latest/index.html

相关文章