找回密码
 立即注册

推荐阅读

  • 便民服务
  • 关注我们
  • 社区新手
一、什么是Requests?
Requests是用Python语言编写的简单易用的HTTP库,用来做接口测试的库。

在python中有哪些库可以做接口自动化?
requests,urllib,http.clint
HttpClint===在java里面做接口自动化的库
-------------------------------------------------------------------------------------------------------------------------------------
二、安装requests库
1.按住Windows标志+r,在运行窗口输入cmd,输入pip install requests进行安装。
-------------------------------------------------------------------------------------------------------------------------------------
三、接口测试的流程:
1、问开发人员要到接口文档(或者通过fiddler和chrome浏览器抓包)
2、查看当前接口是用什么请求发送的
3、添加对应的请求参数
4、在IDE工具中右键点击run,运行py文件,发送接口请求,查看返回结果,对返回结果进行校验看是否正确
-------------------------------------------------------------------------------------------------------------------------------------
四、组建接口的三种方式:
r = requests.post(url=url,data=data,json=json)
r = requests.request("post",url=url,data = data)
r = requests.Session() #使用session保持上下文管理,可以保持会话的状态
~·~·~·~·~·~·~·~·~·~·~·~·~·~·~·~·~·~·~
注意点:
1、如果请求类型为'application/x-www-form-urlencoded',那么在post请求里面用data=
2、如果请求类型为'application/json',那么在post请求里面用json=
3、verify,如果请求的接口协议是https,那么在做接口测试时需要关闭tls和ssl证书校验,代码如下:
response = requests.post(verify=False)
4、get请求用params=参数
-------------------------------------------------------------------------------------------------------------------------------------
五、组建get和post请求
第一种:r = requests.post(url=url,data=data,json=json)
1)组建get请求:
import requests {导入requests库}
url='http://192.168.254.141:8080/cms/manage/loginJump.do'
params={'userAccount':'admin','loginPwd':123456}
headers={'Content-Type':'application/x-www-form-urlencoded'}

get请求可以不传headers参数
v=requests.get(url=url,params=params,headers=headers)
test=v.json()
print(test)
print(type(test))

第二种断言方式
assert test['msg']=='登录成功!'
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2)组建post请求
组建请求的要素:请求方式、url、接口的入参、headers
url='http://192.168.254.141:8080/cms/manage/loginJump.do'
data={'userAccount':'admin','loginPwd':123456}
headers={'Content-Type':'application/x-www-form-urlencoded'}

接下来就是发送接口的请求 ===相当于在postman点击一下send
response= requests.post(url=url,data=data,headers=headers)
print(response)    <Response [200]>
print(response.text)    {"code":"200","msg":"登录成功!","model":{}}
print(type(response.text))   <class 'str'>
print(response.json())   {'code': '200', 'msg': '登录成功!', 'model': {}}

通过json()函数把接口的响应结果转换为字典 === 用来断言
print(type(response.json()))
print(response.url)   输出请求url:http://192.168.254.141:8080/cms/manage/loginJump.do
print(response.headers)  
响应头:{'Server': 'Apache-Coyote/1.1', 'Set-Cookie': 'JSESSIONID=9AB6B342DFECD41EF5CF51BE6B12B890; Path=/cms/; HttpOnly', 'Content-Type': 'application/json;charset=UTF-8', 'Transfer-Encoding': 'chunked', 'Date': 'Wed, 19 May 2021 02:00:26 GMT'}
print(response.status_code) 响应码:200
print(response.cookies) 9AB6B342DFECD41EF5CF51BE6B12B890

第一种断言方式:
if response.json()['msg']=='登录成功!':
    print('接口调试成功')
else:

    print('接口调试失败')

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
第二种:response = requests.request(method='post',url=url,data=data)
login_url='http://192.168.254.141:8080/cms/manage/loginJump.do'
login_params={'userAccount':'admin','loginPwd':123456}
headers={'Content-Type':'application/x-www-form-urlencoded'}
v=requests.request('get',url=login_url,params=login_params)
print(v.text)
print(v.json())

i=requests.request('post',url=login_url,data=login_params,headers=headers)
print(i.json())
接口直接返回的json对象是字符串格式的,如果在python(在代码)里面进行处理的话,
要使用json()函数进行转换,转换为字典格式进行处理
import requests
import re
login_url='http://192.168.254.141:8080/cms/manage/loginJump.do'
login_params={'userAccount':'admin','loginPwd':123456}
headers={'Content-Type':'application/x-www-form-urlencoded'}
v=requests.request('post',url=login_url,data=login_params,headers=headers)
print(v.json())
login_cookie=v.cookies
print(login_cookie)
str1=str(login_cookie)
print(str1)
c=re.findall('<Cookie (.+) for',str1)
print(c)

queryUserList_url='http://192.168.254.141:8080/cms/manage/queryUserList.do'
queryUserList_headers={'Content-Type':'application/x-www-form-urlencoded',
                       'Cookie':c[0]}
queryUserList_data={'startCreateDate':'',
                    'endCreateDate':'',
                    'searchValue':'',
                    'page': 1}

i=requests.request('post',url=queryUserList_url,headers=queryUserList_headers,data=queryUserList_data)
print(i.text)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~第三种:session = requests.session() #使用到session方法来保持上下文requests库里面的session对象能够帮助跨请求的保持某些参数(例如:会话的cookie)处理cookie保持在同一个会话里面import requestsclass Api:    def __init__(self):        self.s=requests.session()    def login(self):        login_url = 'http://192.168.254.141:8080/cms/manage/loginJump.do'        login_params = {'userAccount': 'admin', 'loginPwd': 123456}        headers = {'Content-Type': 'application/x-www-form-urlencoded'}        v = self.s.request('post', url=login_url, data=login_params, headers=headers)        test01=v.json()        if test01['msg'] == '登录成功!':            print('登陆接口调试成功')        else:            print('登陆接口调试失败')    def queryUserList(self):        queryUserList_url = 'http://192.168.254.141:8080/cms/manage/queryUserList.do'        queryUserList_headers = {'Content-Type': 'application/x-www-form-urlencoded'}        queryUserList_data = {'startCreateDate': '',                              'endCreateDate': '',                              'searchValue': '',                              'page': 1}        i = self.s.request('post', url=queryUserList_url, headers=queryUserList_headers, data=queryUserList_data)        test02=i.json()        if test02['msg']=='查询用户成功!':            print('登陆接口调试成功')        else:            print('登录接口调试失败')if __name__ == '__main__':    c=Api()    c.login()    c.queryUserList()
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
使用unittest框架信息接口自动化封装
import unittest
import requests

class Cms_Api(unittest.TestCase):

    @classmethod
    def setUpClass(cls):
        cls.s=requests.session()


    def test_login(self):
        login_url = 'http://192.168.254.142:8080/cms/manage/loginJump.do'
        login_params = {'userAccount': 'admin', 'loginPwd': 123456}
        headers = {'Content-Type': 'application/x-www-form-urlencoded'}
        v = self.s.request('post', url=login_url, data=login_params, headers=headers)
        test01 = v.json()
        if test01['msg'] == '登录成功!':
            print('登陆接口调试成功')
        else:
            print('登陆接口调试失败')


    def test_select(self):
        queryUserList_url = 'http://192.168.254.142:8080/cms/manage/queryUserList.do'
        queryUserList_headers = {'Content-Type': 'application/x-www-form-urlencoded'}
        queryUserList_data = {'startCreateDate': '',
                              'endCreateDate': '',
                              'searchValue': '',
                              'page': 1}
        i = self.s.request('post', url=queryUserList_url, headers=queryUserList_headers, data=queryUserList_data)
        test02 = i.json()
        if test02['msg'] == '查询用户成功!':
            print('登陆接口调试成功')
        else:
            print('登录接口调试失败')

if __name__ == '__main__':
    unittest.main()
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~关联接口:两个接口本身是存在关联的关系的用正则获取上个接口的返回值import requestsimport reimport randomclass Api:        封装查询所有省份的接口    def getSupportProvince(self):        url='http://www.webxml.com.cn/WebServices/WeatherWebService.asmx/getSupportProvince'        r=requests.get(url=url)        # print(r)        # print(r.text)        result=r.text        values=re.findall('<string>(.+)</string>',result)        # print(values)        value=random.choice(values)        return value      封装查询某个省份的城市接口    def getSupportCity(self):        url='http://www.webxml.com.cn/WebServices/WeatherWebService.asmx/getSupportCity'        params={'byProvinceName':self.getSupportProvince()}        r=requests.get(url=url,params=params)        print(r.text)if __name__ == '__main__':    a=Api()    a.getSupportProvince()    a.getSupportCity()
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~课堂练习:封装银行卡信息,目标是返回响应体import requestsclass P2p_Api:     def p2p_login(self):         url='http://test.duoceshi.cn/duoceshi_p2p/user/login'         data={'username':15366667777,             'password':'qweqwe123',             'signUuid':'a3280f9c-1a55-4e19-92a1-f2934460e637',             'signCode':8888}         headers = {'Content-Type': 'application/x-www-form-urlencoded'}         r=requests.request('post',url=url,headers=headers,data=data)         # print(r.json())         dict1=r.json()         return dict1['token']     def p2p_Bank(self):         Bank_url='http://test.duoceshi.cn/duoceshi_p2p/bankCardInfo/findBankInfoByUsername'         Bank_data={'username': 'xiaowang'}         Bank_headers={'Content-Type': 'application/x-www-form-urlencoded','token':self.p2p_login()}         r=requests.post(url=Bank_url,data=Bank_data,headers=Bank_headers)         return r.textif __name__ == '__main__':        a=P2p_Api()        a.p2p_login()        print(a.p2p_Bank())
-------------------------------------------------------------------------------------------------------------------------------------深拷贝和浅拷贝深浅拷贝的相同点:拷贝出来的新对象的地址和原有的对象地址是不一样的不同点:浅拷贝时,新对象里面的可变元素(如列表)是可以发生改变的      深拷贝时,新对象是完全不与原有对象存在关系      浅拷贝出来新对象里面的可变元素和原有的对象地址是一样的      浅拷贝出来新对象里面的可变元素和原有的对象地址是不一样的通俗一点的理解:深拷贝是完全跟原来的对象没有关系,原来的对象发生改变的时候,是不影响当前深拷贝对象浅拷贝外部元素是和原来的对象一样的,内部的可变元素是一样的,外部元素互不影响,内部元素相互影响python中的可变元素:列表,字典         不可变元素:字符串,元组,int整型~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~import copy #导入拷贝模块list1=[1,2,3,['dcs',28]] #定义一个二维数组list2=list1  #赋值,直接做了变量的引用copy1=copy.copy(list1) #浅拷贝deepcpoy1=copy.deepcopy(list1) #深拷贝list1.append('A')print(list1) #从[1, 2, 3, ['dcs', 28]]变成[1, 2, 3, ['dcs', 28], 'A']print(list2) #完全和list1一样,因为是直接引用的print(copy1) #浅拷贝没有发生改变print(deepcpoy1) #深拷贝也没有发生改变list1[3].append('66666')print(list1)print(list2)print(copy1) #[1, 2, 3, ['dcs', 28, '66666']]print(deepcpoy1) #[1, 2, 3, ['dcs', 28]]print(id(list1)) #2253665184264print(id(list2)) #2253665184264print(id(copy1)) #2253665335240print(id(deepcpoy1)) #2253665335304print(id(list1)) #2253665184264print(id(list2)) #2253665184264print(id(copy1)) #2253665335240print(id(deepcpoy1)) #2253665335304print(id(list1[3])) #1679910306376print(id(copy1[3])) #1679910306376print(id(deepcpoy1[3])) #1679910434568copy1[3].append('p')print(list1)print(copy1)
-------------------------------------------------------------------------------------------------------------------------------------xlrdxlwt模块往excel表格写入数据最新版本的xlrd模块是支持xls格式的文件,旧版的支持xls格式和xlsx格式
安装xlrd:pip install xlrdimport xlrd 导入xlrdbook=xlrd.open_workbook('c:\data.xls') #打开一个excel表格,并且赋值为bookall_sheet=book.sheet_names()# print(all_sheet,type(all_sheet))'''生成一个表格对象'''table=book.sheet_by_name('Sheet1')'''获取表格中有效的行数'''rows=table.nrows# print(rows) #4,因为这个表中有4行数数据'''获取表格中的有效列数'''cols=table.ncols# print(cols) #3,因为表中有3列数据'''获取表中第n行的内容'''rowvalues=table.row_values(0) #0代表第一行# print(rowvalues)'''获取表中第n列的内容'''colvalues=table.col_values(1)# print(colvalues[1])# print(type(str(int(colvalues[1]))))'''获取表格中某个单元格的数据(第N行和第M列)'''value=table.cell_value(1,2) #第二行第三列的数据# print(value)'''获取所有的行内容'''for i in range(table.nrows):    all_rows=table.row_values(i)    print(all_rows)



分享至 : QQ空间
收藏

0 个回复

您需要登录后才可以回帖 登录 | 立即注册