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方法,这里不再深究,有时间自己也可以研究玩下。

      

posted @ 2018-01-18 14:16  调皮的人  阅读(525)  评论(0)    收藏  举报