查看我们request库是否存在
第一种:
rep =requests.get(参数)
rep =requests.post(参数)
第二种:
rep =requests.request(post,参数)
rep =requests.request(get,参数)
第三种:
session =requests.Session()#创建一个session对象,作用就是保持会话和关联
rep =session.get()
rep =session.post()
1、第一种方法:
rep =requests.get(参数)
rep =requests.post(参数)
1.1 post 请求
import requests
url ='http://cms.duoceshi.cn/cms/manage/loginJump.do'
data1={'userAccount':'admin','loginPwd': 123456}
headers1 ={'Content-Type':'application/x-www-form-urlencoded'}
dl_rep =requests.post(url=url,data=data1,json=headers1)
print (dl_rep.text)#{"code":"200","msg":"登录成功!","model":{}}
1.2 get请求
import requests
url ='http://cms.duoceshi.cn/cms/manage/loginJump.do'
data1={'userAccount':'admin','loginPwd': 123456}
headers1 ={'Content-Type':'application/x-www-form-urlencoded'}
dl_rep =requests.get(url=url,params=data1,json=headers1)
print (dl_rep.text)#{"code":"200","msg":"登录成功!","model":{}}
2、第二种方法:
2.1post方法
re=request.request(method="post",url=url,data=data1,json=headers1)
import requests
url ='http://cms.duoceshi.cn/cms/manage/loginJump.do'
data1={'userAccount':'admin','loginPwd': 123456}
headers1 ={'Content-Type': 'application/x-www-form-urlencoded'}
dl_rep =requests.request(method="post",url=url,data=data1,json=headers1)
print (dl_rep.text)#{"code":"200","msg":"登录成功!","model":{}}
2.2get方法
3、第三种方法:
使用session可以解决接口依赖关系
session= requests.Session() # 创建一session对象来保持上下接口的关联uerlist_rep=session.post(url=uerlist_url,data=uerlist_data,json=uerlist_headers)
import requests #到入 接口库 session= requests.Session() # 创建一session对象来保持上下接口的关联 class Cms_api: def __init__(self): pass def cms_dl(self): #定义一个登录 url ='http://cms.duoceshi.cn/cms/manage/loginJump.do' data={'userAccount': 'admin','loginPwd': 123456} headers ={'Content-Type': 'application/x-www-form-urlencoded'} # dl_rep=requests.post(url=url,data=data,json=headers) dl_rep =session.post(url=url,data=data,json=headers) print (dl_rep.text)#{"code":"200","msg":"登录成功!","model":{}} def cms_yhgl(self): #定义一个用户管理接口 uerlist_url='http://cms.duoceshi.cn/cms/manage/queryUserList.do' uerlist_data={'startCreateDate': '','endCreateDate': '','searchValue': '', 'page': 1} uerlist_headers={'Content-Type': 'application/x-www-form-urlencoded'} # uerlist_rep=requests.post(url=uerlist_url,data=uerlist_data,json=uerlist_headers) uerlist_rep=session.post(url=uerlist_url,data=uerlist_data,json=uerlist_headers) print (uerlist_rep.text) #{"code":"200","msg":"登录成功!","model":{}} if __name__ == '__main__': a=Cms_api() a.cms_dl() a.cms_yhgl()
==============================================================
通过cookie来进行接口依赖关系
# # # 通过拿到登录接口的cookie当中下个接口的类型来进行关联操作 import requests#导入接口测试库用来做接口 class Cms_api: def __init__(self): pass def loing_cms(self):#登录接口 url ='http://cms.duoceshi.cn/cms/manage/loginJump.do' data={'userAccount': 'admin','loginPwd': 123456} header={'Content-Type': 'application/x-www-form-urlencoded'} rep =requests.post(url=url,data=data,json=header) # print rep.content #显示文本信息 print (rep.text) #显示文本信息 # print rep.cookies #<RequestsCookieJar[<Cookie JSESSIONID=28512418A3FD7E9123D664A70AF9D2B5 for 192.168.254.129/cms/>]> self.Cookie=str(rep.cookies).split(' ')[1] '''在类中self定义的全局变量,能够被当前类中所有的方法引用''' # 将cookies转换成为字符串然后通过分割函数将空格分割,然后通过索引来取对应索引的具体值 def list_cms(self):#用户管理接口 l_url='http://cms.duoceshi.cn/cms/manage/queryUserList.do' l_data={'startCreateDate':'' ,'endCreateDate':'', 'searchValue':'' ,'page': 1} headers={'Content-Type': 'application/x-www-form-urlencoded', 'Cookie':self.Cookie} rep =requests.post(url=l_url,data=l_data,headers=headers) print (rep.text) if __name__ == '__main__': C=Cms_api() C.loing_cms() # C.list_cms()
断言:if案例
import requests url="http://cms.duoceshi.cn/cms/manage/loginJump.do" data={"userAccount":"admin","loginPwd":123456} headers="Content-Type: application/x-www-form-urlencoded" r=requests.post(url=url,params=data,json=headers) print(r.text) js=r.json() if js["msg"]=="登录成功!": print("接口ok") else: print("接口no")
2.assert断言
2.1assert成功断言
import requests url="http://cms.duoceshi.cn/cms/manage/loginJump.do" data={"userAccount":"admin","loginPwd":123456} headers="Content-Type: application/x-www-form-urlencoded" r=requests.post(url=url,params=data,json=headers) print(r.text) js=r.json() assert js["msg"]=="登录成功!"
2.2assert失败断言
import requests url="http://cms.duoceshi.cn/cms/manage/loginJump.do" data={"userAccount":"admin","loginPwd":123456} headers="Content-Type: application/x-www-form-urlencoded" r=requests.post(url=url,params=data,json=headers) print(r.text) js=r.json() assert js["msg"]=="登录成
import requests class Cms_api: def __init__(self,url,data,headers): self.url=url self.data=data self.headers=headers def fun(self): rep =requests.post(url=self.url,data=self.data,json=self.headers) js=rep.json() #为了断言需要转换格式 return js def fun1(self): a=self.fun() #方法传递 assert a['msg']=="登录成功!" #断言方法 if a['msg']=="登录成功!": #断言方法 print('OK') else: print('NO') if __name__ == '__main__': Cms =Cms_api(url='http://cms.duoceshi.cn/cms/manage/loginJump.do', data={'userAccount': 'admin','loginPwd': 123456}, headers={'Content-Type': 'application/x-www-form-urlencoded'}) Cms.fun1()
unittest做接口测试
import unittest #导入单元测试框架 import requests #导入接口库 import time from requester.HTMLTestRunner3 import HTMLTestRunner#导入生成报告类 class Cms_api(unittest.TestCase): #定义一个类继承单元测试框架中的testcase类 @classmethod def setUpClass(cls): # cls的类的方法 cls.session=requests.Session()#session是一个全局的变量作用是保持上下接口的会话和关联 @classmethod def tearDownClass(cls): print ('类的结束') def setUp(self): print ('方法的开始') def test01(self): #定义一个用例 用例名称要用test '''登录接口''' url ='http://cms.duoceshi.cn/cms/manage/loginJump.do' data={'userAccount': 'admin','loginPwd': 123456} header={'Content-Type': 'application/x-www-form-urlencoded'} # rep =requests.post(url=url,data=data,json=header) rep =self.session.post(url=url,data=data,json=header) print (rep.text) #打印登录接口的结果 def test02(self):#定义一个用例用户管理接口 urlist_url='http://cms.duoceshi.cn/cms/manage/queryUserList.do' urlist_data={'startCreateDate':'', 'endCreateDate':'' ,'searchValue':'', 'page': 1} urlist_he={'Content-Type': 'application/x-www-form-urlencoded'} ur_rep=self.session.post(url=urlist_url,data=urlist_data,json=urlist_he) print (ur_rep.text) #打印用户管理接口的结果 def tearDown(self): print ('方法的结束') def urits(): #创建一个普通函数 作用是容器存放用例 us =unittest.TestSuite() #容器 us.addTest(Cms_api('test01')) #单个执行用例 #us.addTests([Cms_api('test01'),Cms_api('test02')])#执行多条 return us if __name__ == '__main__': # unittest.main() # 第一种方法调用所有 # r=unittest.TextTestRunner() #第二种方法,调用条件中的用例 # r.run(urits()) # start_dir = r'C:\Users\Administrator\PycharmProjects\untitled1\requester' #项目路径 # discover = unittest.defaultTestLoader.discover(start_dir=start_dir, pattern='request001*.py') # 中间* 是通配符 # runner = unittest.TextTestRunner() # runner.run(discover) #三种方法 # runner.run(discover) # # #四:自动化搜索+生成测试报告 start_dir = r'C:\Users\Administrator\PycharmProjects\untitled1\requester' discover = unittest.defaultTestLoader.discover(start_dir=start_dir, pattern='request001*.py') # 中间* 是通配符 # 1.定义生成的测试报告的名称 path= r'C:\Users\Administrator\PycharmProjects\untitled1\api' # ##报告生成在我们当前路径,copy本地路径 now = time.strftime('%Y-%m-%d-%H-%M-%S') filename = r'C:\Users\Administrator\PycharmProjects\untitled1\requester' + "\\" + str(now) + 'api_report.html' ###.html'表示 # # print(filename) f = open(filename, 'bw') # 以二进制的方式在...ui.html文件中写入报告模板和测试结果 # ##w 是写,b 是表示二进制方式写入, runner = HTMLTestRunner(stream=f, title='接口自动化测试报告', description='用例执行情况如下:') runner.run(discover)# f.close() # 释放资源、关闭文件
得到的接口测试报告:
1、关联接口
通过正则去提取json内容
# 把省份接口当做城市接口的入参来调用 import requests import re class C: def sf(self): #省份接口 Province_url='http://www.webxml.com.cn/WebServices/WeatherWebService.asmx/getSupportProvince' Province_headers={'Content-Type': 'application/x-www-form-urlencoded'} rep =requests.post(url=Province_url,json=Province_headers) # print(rep.text) a =re.findall('<string>(.+?)</string>',rep.text) return a def cs(self): #城市接口 c=self.sf() #省份接口 portCity_url='http://www.webxml.com.cn/WebServices/WeatherWebService.asmx/getSupportCity' portCity_data={'byProvinceName':c[16]} portCity_headers={'Content-Type': 'application/x-www-form-urlencoded'} rep =requests.post(url=portCity_url,data=portCity_data,json=portCity_headers) print(rep.text) if __name__ == '__main__': c=C() # c.sf() c.cs()