1 # jmeter/postman等测试工具都可以向后端服务器发起请求,并且可以参数化,可以将用例放在CSV/Excle中,使用Jmeter也可以自动生成聚合报告等都可以做 2 # 为什么还要用程序向服务端发起请求呢 3 # 工具不能满足所有场景,发起的请求中处理的逻辑过于复杂,使用Jmeter很难处理,使用程序就非常灵活,可以随心设计 4 # 工具并不智能,不能做到100%/70%/80%的自动化,还是需要手动执行,手动生成报告,设计逻辑,还要手写。使用程序,完全可以达到80%-90%的自动化,如果做回归测试,使用程序的话,效率会更高,同时程序可以和jekins形成持续集成 5 # 即使用程序拓展性更好 6 7 8 # 使用程序模拟客户端发起请求 9 import requests 10 11 # 使用测试工具jmeter/postman/fidder等是跳过前端的js/html/css发起的请求,看不到真正的页面,只能看到返回的代码 12 # 向服务器发起请求:(根据接口文档) 13 # 1.构造请求URL 14 url="http://xxxxxx.com/futureloan/mvc/api/member/register" # 注册接口的url 15 # 2.构造请求参数 16 params = { 17 "mobilephone":"18244446666", 18 "pwd":"123456", 19 "regname":"大佬" 20 } 21 22 # 可通过构建字典修改请求头信息 23 # 不一定要改请求头,如果User-Agent不规范,请求时可能无法通过,因为它会做反爬虫措施,所以有的需要自己添加合法的请求头,但大多数情况不需要修改 24 headers = { 25 "User-Agent":"Mozilla/5.0 wuyanliuse" #自定义一个User-Agent为wuyanliuse # 大多数浏览器都是基于Mozilla/5.0协议 26 } 27 28 29 # 3.向服务端发起get请求 30 # 如果给params传参,那么是以查询字符串参数的形式来传参的 31 # res = requests.get(url,params=params) # 返回的是一个Response对象,可将它当作是一个响应报文 32 res = requests.get(url,params=params, headers=headers) #url位置参数 params关键字参数 # 将修改的headers传过来 #返回的是一个Response对象,可将它当作是一个响应报文 33 print(res.status_code) # 获取响应状态码 34 print(res.text) # 获取响应报文 35 print(res.json()) # 将响应报文转换为python中的数据类型 #这里只针对于返回的是json格式的响应报文才可使用该方法,否则会报错 36 print(res.headers) # 获取响应头信息 37 print(res.headers["Content-Type"]) # 获取响应头中的Content-Type 38 print(res.request["headers"]) # 获取请求中的请求头信息 39 print(res.request["method"]) # 获取请求中的请求方法 40 print(res.cookies) # 获取cookie数据,返回的是RequestsCookieJar[]信息
1 import requests 2 3 # 向服务器发起请求:(根据接口文档) 4 # 1.构造请求URL 5 url="http://xxxxxx.com/futureloan/mvc/api/member/register" # 注册接口的url 6 # 2.构造请求参数 7 params = { 8 "mobilephone":"18244446668", 9 "pwd":"123456", 10 "regname":"大佬" 11 } 12 13 headers = { 14 "User-Agent":"Mozilla/5.0 wuyanliuse" 15 } 16 17 # 3.向服务端发起post请求 18 # 如果给params传参,那么一定是以查询字符串参数的形式来传参的 19 res = requests.post(url,params=params, headers=headers) # 返回的是一个Response对象,可将它当作是一个响应报文 20 21 # 如果给data传参,那么会以x-www-form-urlencoded的形式来传参 22 res1 = requests.post(url,data=params, headers=headers) 23 24 # 如果给json传参,那么会以json格式的字符串形式来传参 25 # 这里的params既可以是字典,也可以是json格式的字符串 26 res2 = requests.post(url,json=params, headers=headers) 27 28 # 所有的参数都转化为字典来传参就不会出错--->params/data/json都可以传;请求头如果构造成字典再进行传参也不容易出错
1 import json 2 import requests 3 4 5 class HandleRequest: 6 """ 7 处理请求 8 """ 9 def __init__(self): 10 self.one_session = requests.Session() 11 12 def to_request(self,url,method="post",data=None,is_json=False): 13 # data = '{"name":"等等"}' # json格式的字符串 14 data = "{'name':'等等'}" # 字典类型的字符串 15 if isinstance(data, str): 16 try: 17 data = json.loads(data) 18 except Exception as e: 19 print("使用日志器来记录日志") 20 data = eval(data) # 使用eval函数对参数转换,避免传的参数是单引号,这样单引号双引号就都不会报错了 21 22 method = method.lower() # 方法名统一转换为小写 23 if method == "get": 24 self.one_session.get(url,params=data) 25 elif method == "post": 26 if is_json: # 如果is_json为True,那么以json格式来传参 27 res = self.one_session.post(url, json=data) 28 else: # 如果is_json为False,那么以www-form表单形式来传参 29 res = self.one_session.post(url, data=data) 30 else: 31 res = None 32 print("不支持【()】其他方法的请求".format(method)) #也可使用日志器进行记录 33 34 def close(self): 35 self.one_session.close() 36 37 38 if __name__ == '__main__': 39 # 1.构造请求URL 40 login_url = "http://xxxxx.com/futureloan/mvc/api/member/login" # 注册接口的url 41 recharge_url = "http://xxxxx.com/futureloan/mvc/api/member/recharge" 42 # 2.创建请求参数 43 login_params = { 44 "mobilephone": "18244446668", 45 "pwd": "123456", 46 "regname": "大佬" 47 } 48 recharge_params = { 49 "mobilephone": "18244446668", 50 "amount": "50000000" 51 } 52 53 headers = { 54 "User-Agent": "Mozilla/5.0 wuyanliuse", 55 } 56 57 58 do_request = HandleRequest() # 创建HandleRequest对象 59 # 先登录 60 do_request.to_request(method='post',url=login_url,data=login_params) 61 # 再充值 62 do_request.to_request(method='post', url=recharge_url, data=recharge_params) # 默认以www-form表单形式传参 63 # 如果是以json格式传参:do_request.to_request(method='post', url=recharge_url, data=recharge_params,is_json=True)