Python 写一个性能测试工具

2023-12-18 17:23:22

国庆重新学习了一下go的gin高性能测试框架。

用JMeter来测试gin与flask接口的性能,差别很大。

为什么我自己不尝试写一个性能工具,性能工具的核心就是 并发 和 请求。

请求可以选择Python的requests库。

并发可以通过python的 进程、线程、协程模拟。

这么一想,也不是很难了,上手撸一个。

依赖库

1

2

3

requests==2.22.0

gevent==20.9.0

numpy==1.19.2

requests 大家并不陌生,HTTP请求库。

gevent是python协程库,通过协程模拟并发更节省资源,在同样配置下能模拟更多的并发。

numpy 是python的数据计算库,提供大量组数和矩阵运算,这里用它求列表的平均值。

实现脚本

好了,接下来开始上手写代码了。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

from __future__ import print_function

import time

import gevent

from gevent import monkey

monkey.patch_all()

import requests

from numpy import mean

users = 10 # 用户数

numbers = 100 # 请求次数

req_url = "http://127.0.0.1:8080/user/tom" # 请求URL

print("请求URL: {url}".format(url=req_url))

print("用户数:{},循环次数: {}".format(users, numbers))

print("============== Running ===================")

pass_number = 0

fail_number = 0

run_time_list = []

def running(url):

??global fail_number

??global pass_number

??for _ in range(numbers):

????start_time = time.time()

????r = requests.get(url)

????if r.status_code == 200:

??????pass_number = pass_number + 1

??????print(".", end="")

????else:

??????fail_number = fail_number + 1

??????print("F", end="")

????end_time = time.time()

????run_time = round(end_time - start_time, 4)

????run_time_list.append(run_time)

jobs = [gevent.spawn(running, req_url) for _url in range(users)]

gevent.wait(jobs)

print("\n============== Results ===================")

print("最大:??? {} s".format(str(max(run_time_list))))

print("最小:??? {} s".format(str(min(run_time_list))))

print("平均:??? {} s".format(str(round(mean(run_time_list), 4))))

print("请求成功", pass_number)

print("请求失败", fail_number)

print("============== end ===================")

设计思路

在JMeter中创建线程组有两个参数 线程数和 循环数,即 用户数 和请求数,设置多少个用户,每个用户用户跑多少次,用户数通过协程模拟,每次用户运行次数通过for循环实现。

至于请求就比较简单了,直接通过requests发送请求。通过判断影响的状态码是否为200来判断是否成功,通过分别计算成功和失败的请求个数。

关于请求时间统计,在每次请求前后获得当前时间戳,然后计算时间差就是单个接口的调用时间。最大,最小,平均通过计算就可轻松的得到。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

> python3 ab.py

请求URL: http://127.0.0.1:8080/user/tom

用户数:10,循环次数: 100

============== Running ===================

...............................................................................................................

...............................................................................................................

...............................................................................................................

...............................................................................................................

...............................................................................................................

...............................................................................................................

...............................................................................................................

...............................................................................................................

...............................................................................................................

.

============== Results ===================

最大:??? 0.0352 s

最小:??? 0.0036 s

平均:??? 0.0204 s

请求成功 1000

请求失败 0

============== end ===================

后续

把ab.py脚本做成 ab 命令行工具。

支持更多的请求类型(get/post/put/delete)和参数。

更多统计维度,吞吐量、吞吐率

增加启动时间,思考时间等

...

?现在我也找了很多测试的朋友,做了一个分享技术的交流群,共享了很多我们收集的技术文档和视频教程。
如果你不想再体验自学时找不到资源,没人解答问题,坚持几天便放弃的感受
可以加入我们一起交流。而且还有很多在自动化,性能,安全,测试开发等等方面有一定建树的技术大牛
分享他们的经验,还会分享很多直播讲座和技术沙龙
可以免费学习!划重点!开源的!!!
qq群号:485187702【暗号:csdn11】

最后感谢每一个认真阅读我文章的人,看着粉丝一路的上涨和关注,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走!?希望能帮助到你!【100%无套路免费领取】

文章来源:https://blog.csdn.net/m0_70669463/article/details/135064450
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。