get请求方式:
参数用params,请求头用headers
'''接口自动化测试:导入requests库
requests.request
requests.get
底层调用的都是同一个请求
'''
import requests,json
'''接口1:论坛项目 获取主题首页'''
1.requests模块里面的request方法,发起http请求,2.接收http响应
requests.request('请求方法','接口地址')
res1=requests.request('get',
'http://1.13.5.210:3000/api/v1/topics')
'''get类参数1.直接拼接在url
2.通过params传参'''
p={
"limit":1,
"tab":"share"
} #参数定义成一个字典
res1=requests.request('get',
'http://1.13.5.210:3000/api/v1/topics',params=p)
res2=requests.request(url='http://1.13.5.210:3000/api/v1/topics',method='get',)
#res3=requests.get('http://1.13.5.210:3000/api/v1/topics')
3.响应体res1(状态码,响应值,响应头信息)
print('状态码',res1.status_code) #状态码
print('响应值',type(res1.text),res1.text,) #响应值,text方法获得的是字符串
print('响应值',type(res1.content),res1.content) #响应值,bytes字节类型
print('响应值',type(res1.json()),res1.json()) #响应值,获取的是字典类型
print(json.dumps(respone,indent=4,ensure_ascii=False)) #等于把显示在一行的字典,放bejson格式化校验
respone=res1.json() #响应值respone,字典类型
respone=json.dumps(respone) #把respone字典转化为json字符串
respone=json.loads(respone) #把json字符串转化为字典
print('转化之后',type(respone))
print('响应头信息',res1.headers) #响应头信息:接口返回给前端的头信息(返回的数据类型)
'''接口2:获取用户信息'''
h={"token":"qingfengtest"} #定义的一个请求头,字典类型
p={"limit":1}#定义的参数,字典类型
res=requests.request(method='get',
url='http://127.0.0.1:7001/api/qingfeng/users',
params=p,
headers=h)
print(res.status_code)
print(res.json())
'''接口3:12306'''
h={
"Cookie":"_uab_collina=163171289127393441288275; JSESSIONID=A480B7E51DB427E671A9EAB429E0BF57; _jc_save_wfdc_flag=dc; _jc_save_fromStation=%u4E0A%u6D77%2CSHH; _jc_save_toStation=%u957F%u6C99%2CCSQ; BIGipServerotn=1173357066.50210.0000; BIGipServerpool_passport=233046538.50215.0000; guidesStatus=off; highContrastMode=defaltMode; cursorStatus=off; RAIL_EXPIRATION=1643100119736; RAIL_DEVICEID=sNfoLXTkSZyQ1Tk8feRzN3lS3MxlI5FBh2gCXgv5KRsU_DY4muckz0RS4M3FSq0NQVgclu6vPWcf_iS5q99UOyf58Px-VxHptormzrtjDPtelGTqyEtNunOscPbFFI6Zgs2IqJsx_X3JEaQ-z7RfDQ-T78O2LGDb; route=6f50b51faa11b987e576cdb301e545c4; _jc_save_toDate=2022-01-22; _jc_save_fromDate=2022-01-25"
}
res=requests.get(url='https://kyfw.12306.cn/otn/leftTicket/queryA?leftTicketDTO.train_date=2022-01-25&leftTicketDTO.'
'from_station=SHH&leftTicketDTO.to_station=CSQ&purpose_codes=ADULT',
headers=h)
print(res.text)
print(res.content)
print(res.json())
post请求:
参数用data或json,请求头用headers
用data参数提交数据时,
1.参数为str时,request headers里面的content-type,默认为text/plain
request.body的内容则为原str,
2.参数为dict时
content-type,request headers里面的,默认为application/x-www-form-urlencoded
request.body的内容则为a=1&b=2的这种形式,
3.data参数默认支持content-type为text,form表单类型
如果想要请求content-type为json类型的,
1.需要指定headers 为json
2.把参数 ,从字典转化为json字符串 d=json.dumps(d)
用json参数提交数据时,
content-type,request headers里面的,默认为application/json
request.body的内容则为'{"a": 1, "b": 2}'的这种形式
'''reeuqes进行post 类型的请求
post:
请求数据类型为form表单,或者text文件,通过data传参
请求数据类型为json类型,通过json传参
request.body请求参数
'''
import json
import requests
d={
"userid":1,
} #参数定义成一个字典
url_form_data='http://127.0.0.1:5000/api/qingfeng/formdata'
res=requests.request(method='post',url=url_form_data,data=d)
print('res.request.body',res.request.body)
print(res.status_code)
print(res.json())
'''第二个接口'''
url_text='http://127.0.0.1:5000/api/qingfeng/text'
d='qingfengtest'
res=requests.request(method='post',url=url_text,data=d)
print('res.request.body',res.request.body)
print(res.status_code)
print(res.json())
'''第三个接口'''
url_json='http://127.0.0.1:5000/api/qingfeng/user'
d={
"username":"qingfeng",
"phone":123455667
} #字典
res=requests.request(method='post',url=url_json,json=d)
print('res.request.body',res.request.body)
print(res.status_code)
print(res.json())
#
'''第四个接口:json'''
url_json='http://127.0.0.1:5000/api/qingfeng/user'
d={
"username":"qingfeng",
"phone":123455667
} #字典
h={
"content-type":"application/json"
} #字典
#字典转化json
d=json.dumps(d)
res=requests.request(method='post',url=url_json,data=d,headers=h) #res响应体
print('请求头信息headers',res.request.headers)
print('请求的参数res.request.body',res.request.body)
print(res.status_code)
print('响应头信息headers',res.headers)
print(res.json())
#
#
用session保持会话
'''session:跨请求保持某些参数'''
h={
"Token":"qingfengtest",
#"Authorization":"Basic {}".format(users)
}
url_users='http://127.0.0.1:7001/api/qingfeng/users'
url_one='http://127.0.0.1:7001/api/qingfeng/user/1'
'''通过requests模块里面的request方法,俩次请求完全独立'''
# res1=requests.request(method='get',url=url_users,headers=h)
# print(res1.status_code)
# print(res1.json())
#
# res2=requests.request(method='get',url=url_one,headers=h)
# print(res2.status_code)
# print(res2.json())
'''通过session会话'''
s=requests.session()#定义一个session对象 s
s.headers.update(
h
) #会话统一设置headers,update并不是把现有的header的替换掉,而是去新增字段。如果字段以存在,就替换
s.headers.update({"cookie":"cookietest"})
s.auth=('admin','123456')
res1=s.request(method='get',url=url_users,)
res2=s.request(method='get',url=url_one,)
res3=s.request(method='post',url=url_auth,json=d)
接口自动化测试用例编写步骤:
1.定义测试类
2.定义类夹具,创建一个会话,统一设置headers参数self.s=requests.session()
self.s.auth = ('admin', '123456') self.s.headers.update({"Token":"qingfengtest"})
3.写测试用例:
(1)浏览器地址:
url_json='http://127.0.0.1:7001/api/qingfeng/user'
(2)定义参数:
d={ "username":"qingfeng", "phone":123455667
(3)发送请求,获取响应值:
res=self.s.request(method='post',url=url_json,json=d)
(4)断言:
respone=res.json() #{'code': '000', 'data': 'qingfengtest'}
self.assertEqual(res.status_code,200) #实际结果,是否等于预期结果 self.assertEqual(respone['code'],'000')
import unittest
from ddt import ddt,data,unpack
'''假设性原则:所有的用例都需要加上auth认证
@ddt #1代表这个类里面的测试用例需要用到ddt数据驱动
class Test(unittest.TestCase):
'''测试用例类:本地服务接口项目'''
@classmethod
def setUpClass(self) -> None:
'''所有用例的前置操作:创建一个会话,统一设置headers参数'''
self.s=requests.session()
self.s.auth = ('admin', '123456')
self.s.headers.update({"Token":"qingfengtest"})
def test01(self):
'''测试用例1'''
url_text='http://127.0.0.1:7001/api/qingfeng/text'
d='qingfengtest'
#res=requests.request(method='post',url=url_text,data=d)
res=self.s.request(method='post',url=url_text,data=d)
print(res.request.headers)
respone=res.json() #{'code': '000', 'data': 'qingfengtest'}
'''断言'''
self.assertEqual(res.status_code,200) #实际结果,是否等于预期结果
self.assertEqual(respone['code'],'000')
def test02(self):
url_json='http://127.0.0.1:7001/api/qingfeng/user'
d={
"username":"qingfeng",
"phone":123455667
} #字典
res=self.s.request(method='post',url=url_json,json=d)
print(res.request.headers)
print(res.status_code)
print(res.json())
def test03(self):
url_auth = 'http://127.0.0.1:7001/api/qingfeng/auth'
d = {
"id": 123456789
}
res = self.s.request(method='post', url=url_auth, json=d)
print(res.request.headers)
print(res.json())
# ddt数据驱动
#2.作为参数化的数据,逗号隔开的代表一个用例,
@data(('admin', '123456','111'), ('adminxxx', '123456xxx','111'))
@unpack
def test04(self,username,pwd): #3定义变量接收数据
url_login='http://127.0.0.1:7001/api/qingfeng/login'
res=self.s.request(url=url_login,method='post',json=users)
print(res.json())
respone=res.json()
self.assertEqual(res.status_code, 200) # 实际结果,是否等于预期结果
self.assertEqual(respone['code'], '000')
if __name__ == '__main__':
unittest.main()
ddt使用方法:
1.测试数据为多个字典的list类型
2.测试类前加修饰@ddt
3.case前加修饰@data(逗号隔开的代表一个数据)
4.case方法添加参数接收数据