一、介绍
requests是一个很实用的Python HTTP客户端库,编写爬虫和测试服务器响应数据时经常会用到, Requests是Python语言的第三方的库,专门用于发送HTTP请求
二、前提
在当前项目安装requests包:pip install requests
三、get请求
1.无参请求:
r = requests.get('http://www.baidu.com')
2.有参请求:
#方式一:参数和路径分开
param = {'key1':'value1','key2':'value2','key3':None}
r = requests.get('http://www.baidu.com',params=param)
#方式二:参数和路径拼接
r = requests.get('http://www.baidu.com?key1=value1&key2=value2&key3=None')
#如果请求参数为字符串类型,可以通过eval()执行一个字符串表达式,并返回表达式的值
param = eval("{'key1':'value1','key2':'value2','key3':None}")
r = requests.get('http://www.baidu.com',params=param)
四、post请求
param = {'key1':'value1','key2':'value2'}
r = requests.post("http://www.baidu.com", data=param)
五、requests的响应
r.status_code 响应状态码
r.heards 响应头
r.cookies 响应cookies
r.text 响应文本
r.json() 响应的字典类型数据
r. encoding 当前编码
r. content 以字节形式(二进制)返回
六、requests扩充
#1:添加等待时间,超过等待时间则报错
requests.get(url,timeout=1)
#2:添加请求头信息
requests.get(url,headers=headers)
#3:添加文件
requests.post(url, files=files)
#4:文件传输
url = 'http://www.baidu.com'
files = {'file': open('report.xls', 'rb')}
r = requests.post(url,files=files)
七、接口关联
- 在第一个接口中设置全局变量,在第二个接口中通过全局变量名引用
import requests,unittest
class TestClass(unittest.TestCase):
def testGet(self):
#通过eval()执行一个字符串表达式,并返回表达式的值
param=eval('{"phone":"13355571803","key":"f32c5a4a9d4356a16af2bdf1739f908e"}')
response=requests.get(url="http://apis.juhe.cn/mobile/get",params=param)
print(response.json())
#设置全局变量
global city
#断言
city=response.json()["result"]["city"]
self.assertEqual(city,"徐州")
def testPost(self):
#post请求
data=eval('{"city":city,"key":"d24affbf5b215c5de8f4182da6e8f1b6"}')
response=requests.post(url="http://apis.juhe.cn/simpleWeather/query",data=data)
print(response.json())
if __name__ == '__main__':
unittest.main()
八、读取csv/excel数据
1.csv+unittest+requests+HTMLTestRunner
①创建csv文件存入测试数据
url,param,request,code
http://apis.juhe.cn/mobile/get,"{""phone"":""1335557"",""key"":""ab6ef7f61563fd78869ab99956554a""}",get,0
http://apis.juhe.cn/mobile/get,"{""phone"":"""",""key"":""ab6ef7f61563fd78869ab99956554a""}",get,201101
http://apis.juhe.cn/mobile/get,"{""phone"":""123"",""key"":""ab6ef7f61563fd78869ab99956554a""}",get,201102
http://apis.juhe.cn/mobile/get,"{""phone"":""1335557"",""key"":""ab6ef7f61563fd78869ab9995655""}",get,10001
http://apis.juhe.cn/mobile/get,"{""phone"":""1335557"",""key"":""ab6ef7f61563fd78869ab99956554a""}",post,0
②创建读取数据的py文件,用于读取csv文件数据
# 导入csv模块
import csv
class ReadCsvClass():
def read_csv(self):
# 定义一个空列表
item = []
# 得到csv文件对象
c = csv.reader(open("../data/csvData.csv", "r"))
for csv_i in c:
# 将获取的数据添加到列表中
item.append(csv_i)
#忽略表头 可以直接删除,也可以通过切片
# item.pop(0)
item=item[1::]
return item
③编写测试用例类,通过unittest+requests将读取的数据传入开发代码进行测试
from readData.readCsv import ReadCsvClass
import requests,unittest
#读取csv文件数据
r=ReadCsvClass()
data=r.read_csv()
class TestCsvUnittestClass(unittest.TestCase):
def testRequest(self):
for i in data:
#执行一个字符串表达式,并返回表达式的值
param = eval(i[1])
#判断请求方式是否为get
if i[2]=="get":
#用get方式请求
result=requests.get(url=i[0],params=param)
#转成字典,根据key获取value值
error_code=result.json()["error_code"]
#设置断言
self.assertEqual(error_code,int(i[3]))
else:
#用post方式请求
result=requests.post(url=i[0], data=param)
#转成字典,根据key获取value值
error_code=result.json()["error_code"]
#设置断言
self.assertEqual(error_code,int(i[3]))
if __name__ == '__main__':
unittest.main()
④将HTMLTestRunner.py存到工具包下
⑤unittest+HTMLTestRunner生成测试报告
from common.HTMLTestRunner import HTMLTestRunner
from testDemo.testCsvUnittest import TestCsvUnittestClass
import unittest
class CsvHtmlClass():
def htmlMethod(self):
# 创建测试套件
suite = unittest.TestSuite()
# 创建列表储存测试用例名
testList = ["testRequest"]
for test_i in testList:
suite.addTest(TestCsvUnittestClass(test_i))
# 生成测试报告,以二进制形式写入
with open("csvUnittestReport.html", "wb") as obj:
HTMLTestRunner(
stream=obj,
title="单元测试",
description="测试一期",
verbosity=2
).run(suite) # 执行测试套件
# 实例化调用方法
c = CsvHtmlClass()
c.htmlMethod()
2.csv+pytest+requests+allure
①创建csv文件存入测试数据
②创建读取数据的py文件,用于读取csv文件数据
③编写测试用例类,通过pytest+requests+allure将读取的数据传入开发代码进行测试,并生成测试报告
- pytest自带pytest-html生成测试报告
- pytest+allure也可以生成测试报告,allure界面更加美观
from readData.readCsv import ReadCsvClass
import requests,pytest,os
#读取csv文件数据
r=ReadCsvClass()
data=r.read_csv()
class TestCsvPytestClass():
def testRequest(self):
for i in data:
#执行一个字符串表达式,并返回表达式的值
param = eval(i[1])
#判断请求方式是否为get
if i[2]=="get":
#用get方式请求
result=requests.get(url=i[0],params=param)
#转成字典,根据key获取value值
error_code=result.json()["error_code"]
#设置断言
assert error_code==int(i[3])
else:
#用post方式请求
result = requests.get(url=i[0], params=param)
#转成字典,根据key获取value值
error_code = result.json()["error_code"]
# 设置断言
assert error_code == int(i[3])
if __name__ == '__main__':
#pytest生成测试报告
#pytest.main(["--html=../testReport/csvPytestReport.html","testCsvPytest.py"])
#allure生成json类型的测试报告
pytest.main(['--alluredir', 'report/result', 'testCsvPytest.py'])
#将测试报告转为html格式
split = 'allure ' + 'generate ' + './report/result ' + '-o ' + './report/html ' + '--clean'
#system函数可以将字符串转化成命令在服务器上运行
os.system(split)
3.excel+unittest+requests+HTMLTestRunner
①本地创建excel文件存入测试数据,拖拽到PyCharm
②创建读取数据的py文件,用于读取excel文件数据
#导入加载excel工作簿的包
from openpyxl import load_workbook
class ReadExcelClass():
def readExcel(self):
#打开Excel表
workbook=load_workbook("../data/excelTest.xlsx")
#定位表单
sheet=workbook["Sheet1"]
#把所有行的数据放在列表中
row_data=[]
#行的起始索引从1开始,跳过标题行,数据起始行索引为2,由于range包左不包右,所以结束行+1
for row in range(2,sheet.max_row+1):
#把每个单元格的数据存到字典中,字典创建在循环里面是不同的地址
#若把字典创建在循环外,则字典地址相同,这一次的数据会把上一次的数据覆盖
cell_data = {}
#print(id(cell_data))
#列的起始索引从1开始,由于range包左不包右,所以结束行+1
for column in range(1,sheet.max_column+1):
#根据行和列确定单元格,把标题的单元格当做key,把数据的单元格当做value,存入字典
cell_data[sheet.cell(1,column).value] = sheet.cell(row,column).value
#把每行的字典数据存到列表中
row_data.append(cell_data)
#返回行数据
return row_data
③编写测试用例类,通过unittest+requests将读取的数据传入开发代码进行测试
from readData.readExcel import ReadExcelClass
import unittest,requests
#读取Excel文件的数据
r=ReadExcelClass()
dataList=r.readExcel()
class TestExcelUnittestClass(unittest.TestCase):
def testExcel(self):
#遍历集合中的字典
for dict in dataList:
#执行一个字符串表达式,并返回表达式的值
param=eval(dict["param"])
#根据key判断value
if dict["request"]=="get":
#用get请求接口
result=requests.get(url=dict["url"],params=param)
#通过json表达式获取值
error_code=result.json()["error_code"]
#设置断言
self.assertEqual(error_code,dict["code"])
else:
#用post请求接口
result=requests.post(url=dict["url"],data=param)
#通过json表达式获取值
error_code=result.json()["error_code"]
#设置断言
self.assertEqual(error_code,dict["code"])
if __name__ == '__main__':
unittest.main()
④将HTMLTestRunner.py存到工具包下
⑤unittest+HTMLTestRunner生成测试报告
from common.HTMLTestRunner import HTMLTestRunner
from testDemo.testExcelUnittest import TestExcelUnittestClass
import unittest
class ExcelHtmlClass():
def htmlMethod(self):
#创建测试套件
suite=unittest.TestSuite()
#创建列表,用于存储测试用例名
testList=["testExcel"]
for test_i in testList:
#将测试用例添加到测试套件中
suite.addTest(TestExcelUnittestClass(test_i))
#生成测试报告,以二进制形式写入
with open("excelUnittestReport.html", "wb") as obj:
HTMLTestRunner(
stream=obj,
title="单元测试",
description="测试一期",
verbosity=2
).run(suite) # 执行测试套件
#实例化调用
e=ExcelHtmlClass()
e.htmlMethod()
4.excel+pytest+requests+allure
①本地创建excel文件存入测试数据,拖拽到PyCharm
②创建读取数据的py文件,用于读取excel文件数据
③编写测试用例类,通过pytest+requests+allure将读取的数据传入开发代码进行测试,并生成测试报告
- pytest自带pytest-html生成测试报告
- pytest+allure也可以生成测试报告,allure界面更加美观
#读取Excel文件的数据
r=ReadExcelClass()
dataList=r.readExcel()
class TestExcelPyTestClass():
def testExcel(self):
#遍历集合中的字典
for dict in dataList:
#执行一个字符串表达式,并返回表达式的值
param=eval(dict["param"])
#根据key判断value
if dict["request"]=="get":
#用get请求接口
result = requests.get(url=dict["url"], params=param)
#通过json表达式获取值
error_code = result.json()["error_code"]
#设置断言
assert error_code==dict["code"]
else:
#用post请求接口
result = requests.post(url=dict["url"], data=param)
#通过json表达式获取值
error_code = result.json()["error_code"]
#设置断言
assert error_code==dict["code"]
if __name__ == '__main__':
#pytest生成测试报告
#pytest.main(["testExcelPytest.py","--html=../testReport/excelPytestReport.html"])
#allure生成json类型的测试报告
pytest.main(['--alluredir', 'report/result', 'testExcelPytest.py'])
#将测试报告转为html格式
split = 'allure ' + 'generate ' + './report/result ' + '-o ' + './report/html ' + '--clean'
#system函数可以将字符串转化成命令在服务器上运行
os.system(split)
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)