Python3 实现性能测试的自动化
性能测试想必大家并不陌生,就是测试软件的性能指标,指标有很多,但其中有一项就是客户最关心的响应时间。性能测试的工具有很多种,常用的有Loadrunner,jmeter等,测试响应时间,多是模拟虚拟用户并发测试,这里简单说下用python多线程实现响应时间的自动化测试。
需求:
性能自动化测试,即测试人员只需要提供性能测试用例,点击运行,即可得到性能测试结果。
分析:
1.读取性能测试用例,获取到url,并发数
2.并发url请求,获取每个url请求发出到接收到服务器返回数据的时间
3.求和所有的url响应时间,取平均
4.生成性能测试报告,在性能测试用例的基础上添加实际响应时间、测试结果
在实现这个功能之前需要明白python的多线程方法,多线程顾名思义,就是多条任务同时进行,这里的同时进行其实不是严格意义上的同时进行,只是因为CPU运行速度非常快,在任务之间切换的时间很短,毫秒甚至微妙级别,给我们的感觉就是在同时进行了,比如写word,它同时会检查拼写、语法错误等,这些其实不是同一时间点完成的,二是在一段时间内(毫秒级别)多次切换运行这几种检查的代码,让我们感觉是在同时运行,多线程和单线程的详解请参考另一篇博客:http://www.cnblogs.com/znyyy/p/7999299.html
python里实现多线程很简单,代码如下:
#多线程,这里会先打印‘end’,接着1秒后同时打印0-9
import threading,time
def fun(var):
time.sleep(1)
print(var)
for i in range(10):
t=threading.Thread(target=fun,args=(i,))#创建一个多线程对象,指定函数名和参数
t.start()#启动线程
print('end')
很简单吧,但是有一个问题,子线程还没运行完成,主线程就运行完了,那子线程并发url获取响应时间前,主线程早就运行完成了,还怎么统计响应时间和写性能测试结果呢?莫慌,线程里有一个join方法,用来等子线程运行完,主线程才继续下走的概念,代码如下:
1 #join等待线程运行完,才继续往下走,这里你会发现打印顺序是a->c->b->end,也就是所有子线程运行完才会继续往下运行
2 import threading,time
3 class thread_test(object):
4 def __init__(self,sleep_time,name):
5 self.sleep_time = sleep_time
6 self.name=name
7 def output(self):
8 time.sleep(self.sleep_time)
9 print(self.name)
10 a=thread_test(1,'a')
11 b=thread_test(4,'b')
12 c=thread_test(2,'c')
13 t_list=[]
14 for method in [a,b,c]:
15 t = threading.Thread(target=method.output)
16 t_list.append(t)
17 t.start()
18 for t in t_list:#等待所有子线程都运行完,才往下走,可以尝试下把这个for循环注释掉,会发现打印顺序变成了end->a->c->b
19 t.join()#join,等待子线程运行完成
20 print('end')
了解完上述概念后就可以着手实现性能的自动化测试了,代码如下:
1 import requests,threading,time 2 res_times=[]#用list存放所有的响应时间 3 class thread_test(object): 4 def __init__(self,url): 5 self.url = url 6 def send_req(self): 7 start_time = time.time() 8 r = requests.get(self.url).text 9 end_time = time.time() 10 res_times.append(end_time-start_time) 11 url='http://10.1.130.105:7072' 12 bfs=10000 13 test=thread_test(url) 14 t_list=[] 15 for i in range(bfs): 16 t = threading.Thread(target=test.send_req) 17 t_list.append(t) 18 t.start() 19 for t in t_list: 20 t.join() 21 avg=sum(res_times)/len(res_times) 22 print(avg)
这样就可以获取到页面的并发平均响应时间了,但是离我们的需求还有一定距离,这只是原理性的阐述,其实并没那么严谨,也没做过大量的实验,深入的话,还需要先获取这个url页面有多少图片,在 send_req 的方法里,需要加上下载图片的时间,然后还要用到excel读写等python方法,这里不再深究,有时间自己也可以研究玩下。


浙公网安备 33010602011771号