响应时间的获取方式
聚合报告中响应时间是怎么获取的?
下面这段代码会计算出进入首页的响应时间。
class kodcloud:
def __init__(self):
# self.session = requests.session()
self.access_token = ''
def Home_page(self):
start_time = int(time.time() * 1000)
resp = requests.get("http://127.0.0.1/index.php?user/login")
end_time = int(time.time() * 1000)
print("登陆的响应时间:%d毫秒"%(end_time-start_time))
print(resp)
if __name__=='__main__':
cd = kodcloud()
cd.Home_page()
响应时间只是请求处理前后的时间差。jmeter原理就是用时间差来计算响应的时间的。
但是我们会发现这样计算得来的时间很短,和我们手动打开首页的时间不太吻合,那是什么原因呢?
记住测试要模拟真实场景,我们的真实场景是不是只是发送个请求获取响应这么简单吗?
真实场景下的实现逻辑
真实场景下会加载界面所有的元素主要图片,首页不仅仅只有一个get请求,这些元素的加载也是需要时间的,真实的用户场景下这些时间也是要算在响应时间的。
可以看到首页有很多请求。
所以这个响应时间应该要包括界面元素缓存所消耗的时间。
获取界面信息
import requests
class webpage_download():
def __init__(self):
self.session = requests.session()
def home(self):
resp = self.session.get("http://127.0.0.1/index.php?user/login")
print(resp.text)
if __name__ == '__main__':
web = webpage_download()
web.home()
依据获取的界面可以用正则表达式来获取所有图片等需要缓存资源的URL路径,将图片缓存在内存中,第二次不用重新缓存:
import requests,re
from zhuanshiq_2 import monitor
cache_list = []
class webpage_download():
def __init__(self):
self.session = requests.session()
self.resp = self.home()
def home(self):
resp = self.session.get("http://127.0.0.1/index.php?user/login")
# self.download(resp.text)
# print(resp.text)
return resp.text
@monitor
def download_url(self):
list = []
list+=(re.findall('href="\.(.+?)" rel=',self.resp))
list+=(re.findall('src="\.(.+?)"/>',self.resp))
list+=(re.findall("url\('\.(.+?)'\);",self.resp))
global cache_list #global声明已有定义的值
for item in list:
if not item in cache_list:
if item.startswith("/"):
url = "http://127.0.0.1/" + item
elif item.startswith("http"):
url = item
else:
url = "http://127.0.0.1/" + item
self.session.get(url) #下载到内存
cache_list.append(item)
def start(self):
self.download_url()
if __name__ == '__main__':
web = webpage_download()
web.start()
得到:
请求:download_url 的响应时间为:23 毫秒
请求:download_url 的响应时间为:0 毫秒
依据获取的界面可以用正则表达式来获取所有图片等需要缓存资源的URL路径,将图片直接保存在硬盘中,第二次不用再下载
import requests,re,os,glob
from zhuanshiq_2 import monitor
cache_list = []
class webpage_download():
def __init__(self):
self.session = requests.session()
self.resp = self.home()
def home(self):
resp = self.session.get("http://127.0.0.1/index.php?user/login")
# self.download(resp.text)
# print(resp.text)
return resp.text
@monitor
def download_url(self):
list = []
list+=(re.findall('href="\.(.+?)" rel=',self.resp))
list+=(re.findall('src="\.(.+?)"/>',self.resp))
list+=(re.findall("url\('\.(.+?)'\);",self.resp))
# 读取download目录下的资源文件。
download_list = os.listdir("./download")
# download_list = glob.glob("./download/*") #发现不同
# download_list = glob.glob("./download/*ing")
# path = os.path.abspath('.') #获取绝对路径
for item in list:
if not item.replace('/','_').replace('=','_').replace('.','_').split("?")[0] in download_list:
if item.startswith("/"):
url = "http://127.0.0.1/" + item
elif item.startswith("http"):
url = item
else:
url = "http://127.0.0.1/" + item
resp = self.session.get(url) #下载到内存
file_name = item.replace('/','_').replace('=','_').replace('.','_').split("?")[0]
# 下载到硬盘
with open("./download/" + file_name,"wb") as file:
file.write(resp.content)
def start(self):
self.download_url()
if __name__ == '__main__':
web = webpage_download()
web.start()
请求:download_url 的响应时间为:0 毫秒
从获取响应时间顺便说一下装饰器的用法
写好装饰器
import time,requests
def monitor(func): #参数为要装饰的函数的名字,自动获取
def inner(*args): #要装饰的函数的参数,自动获取
start_time = int(time.time()*1000)
func(*args) #被装饰的方法
end_time = int(time.time()*1000)
print("请求:%s 的响应时间为:%d 毫秒"%(func.__name__,end_time-start_time))
return inner
# 给装饰器本身传参数
# 装饰器需要参数时,需要三层
def outer(args1,args2): #装饰器本身的参数
def wreaapr(func): #要装饰的函数的名字,自动获取
def inner(*args): #要装饰的函数的参数,自动获取
print("开始运行outer装饰器需要装饰的函数")
print(func.__name__+"是%s, %s时间总和"%(args1,args2))
start_time = int(time.time()*1000)
func(*args)
end_time = int(time.time() * 1000)
print(func.__name__+"是%s, %s时间总和"%(args1,args2) + "总共耗时是%d毫秒"%(end_time-start_time))
return inner
return wreaapr
调用装饰器装饰函数。可以将每个函数都有的动作置于装饰器中完成。
from zhuanshiq_2 import monitor,outer
import time
@monitor
def lunch_time():
time.sleep(5)
@monitor
def dinner_time():
time.sleep(3)
@outer("睡觉","下班")
def free_time():
time.sleep(8)
lunch_time()
dinner_time()
free_time()
最终运行结果为:
请求:lunch_time 的响应时间为:5000 毫秒
请求:dinner_time 的响应时间为:3000 毫秒
开始运行outer装饰器需要装饰的函数
free_time是睡觉, 下班时间总和
free_time是睡觉, 下班时间总和总共耗时是8001毫秒
jmeter中如何获取真实的响应时间呢?
1)在线程组中添加Sampler在请求界面上点击Advanced,勾选“从HTML文件获取所有内含的资源”复选框就能轻松实现。