接口自动化

 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方法添加参数接收数据

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值