Python3+requests+unittest接口自动化测试实战
myzbx 2025-03-20 16:59 37 浏览
一、Requests介绍
Requests is an elegant and simple HTTP library for Python, built for human beings.
翻译过来就是:Requests 是为人类写的一个优雅而简单的 Python HTTP 库。这个介绍很直白了,让我们先来感受一下 Requests 的威力。
import requests
# 发送请求
response = requests.get(url="http://www.baidu.com/s", params={'wd':'python'})
# 处理响应
print(response.status_code)
#返回
200
这个请求如果用 urllib 来实现,代码如下:
import urllib.parse
import urllib.request
url = "http://www.baidu.com/s"
params = urllib.parse.urlencode({'wd':'python'})
# 发送请求
response = urllib.request.urlopen('?'.join([url, params]))
# 处理响应
print(response.getcode())
#返回
200
从感官上就能看出来,使用 urllib 在 URL 、参数等方面会复杂一些。这只是冰山一角,实际使用中 Requests 还有好多方面超越 urllib ,它并不是浪得虚名,接下来的学习中你就会感受到。
二、unittest介绍
说到 Python 的单元测试框架,想必接触过 Python 的朋友脑袋里第一个想到的就是unittest。 的确,作为 Python 的标准库,它很优秀,并被广泛用于各个项目。但你知道吗?其实在 Python 众多项目中,主流的单元测试框架远不止这一个。
本系列文章将为大家介绍目前流行的 Python 的单元测试框架,讲讲它们的功能和特点并比较其异同,以让大家在面对不同场景、不同需求的时候,能够权衡利弊,选择最佳的单元测试框架。
三、Python3+requests+unittest
首先,我们可以捋一捋思路,想一想接口测试的流程
其次,选择合适的框架
流程清晰之后,我们需要选择一个合适的框架,于是选择了Python3+requests+unittest框架
Requests模块发送http的网络请求,请求类型主要包含了post,get, PUT,DELETE,HEAD
python+unittest单元测试框架构成,和测试报告生成(HTMLTestRunner)
框架详解不在此赘述
基于以上,我们来一步步搭建我们的框架。在这个过程中,我们需要做到业务和数据的分离,这样才能灵活,达到我们写框架的目的。接下来,我们来进行结构的划分。
我们的结构是这样的
data:存放自动化测试所用到的数据文档
log:存放生成的日志文件
base:存放公共的方法
report:存放生成的自动化测试报告
testcase:存放测试脚本
接下来,公共方法的开发
整体结构有了划分,接下来就该一步步的填充整个框架了,我们先来看看Base文件中的公共类或函数,这主要用于后续测试case的调用,所有公共的、一成不变的数据都可以放在这里,维护也方便
配置文档如下
[DATABASE]
data_address = ./data/
report_address = ./report/
[HTTP]
base_url = http://xxx.xx
想知道怎样从配置文档中得到或写入相应的数据吗?那继续看吧
import os
import configparser
# 获取当前py文件地址
proDir = os.path.split(os.path.realpath(__file__))[0]
# 组合config文件地址
configPath = os.path.join(proDir,"config.ini")
class ReadConfig:
def __init__(self):
#获取当前路径下的配置文件
self.cf = configparser.ConfigParser()
self.cf.read(configPath)
def get_config(self,field,key):
#获取配置文件中的key值
result = self.cf.get(field,key)
return result
def set_config(self,field,key,value):
#向配置文件中写入配置信息
fb = open(configPath,'w')
self.cf.set(field,key,value)
self.cf.write(fb)
那问题又来了,我们的测试数据放在哪里?怎么取值?怎么写入?怎么保存?。。。
别急,接着往下看
测试数据优先考虑放在excel或database中,此处以excel为例做个简单介绍
这里需要用到两个操作表格的库,xlrd数据驱动的读取,作用于excel文档,但xlrd不能写入数据,所以引入xlutils数据驱动的读取和写入
安装方法可以用pip3 install xlrd和pip3 install xlutils 来安装。
import xlrd
import xlutils.copy
from Base.readConfig import ReadConfig
import time
class ReadExcel:
def __init__(self,section,field,sheet):
# 打开工作表,并定位到sheet
data_address = ReadConfig().get_config(section,field)
workbook = xlrd.open_workbook(data_address)
self.table = workbook.sheets()[sheet]
def get_rows(self):
# 获取excel行数
rows = self.table.nrows
return rows
def get_cell(self,row,col):
# 获取单元格数据
cell_data = self.table.cell(row,col).value
return cell_data
def get_col(self,col):
# 获取整列数据
col_data = self.table.col_value(col)
return col_data
class WriteExcel:
def __init__(self,section,field,sheet):
# 打开工作表
self.address = ReadConfig().get_config(section,field)
self.workbook = xlrd.open_workbook(self.address)
self.wf = xlutils.copy.copy(self.workbook)
self.ws = self.wf.get_sheet(sheet)
def set_cell(self,row,col,value):
#设置单元格数据
self.ws.write(row,col,value)
def save_excel(self,filename,format):
#获取当前时间
self.time = time.strftime("%Y%m%d%H%M%S", time.localtime())
#生成文件的文件名及格式
self.report = filename + '_' +self.time + format
#保存文件
self.wf.save(self.report)
然后,测试脚本的编辑
一切准备就绪,下面通过一个简单的、完整的代码进行演示公共函数的调用,框架的使用及报告的生成
import unittest
import requests
from Base.readConfig import ReadConfig
from Base.readExcel import ReadExcel
from Base.readExcel import WriteExcel
#实例化
readexcel = ReadExcel('DATABASE','data_address',0)
writeexcel = WriteExcel('DATABASE','data_address',0)
class testcase(unittest.TestCase):
#初始化
def setUp(self):
#获取url
self.base_url = ReadConfig().get_config('HTTP', 'base_url')
self.url = self.base_url + readexcel.get_cell(1,1)
#获取请求头
self.headers = readexcel.get_cell(1,4)
def test_case(self):
nok = 0
ner = 0
# 循环读取excel中的测试数据,进行结果验证,并生成excel形式的测试报告
for i in range(3,readexcel.get_rows()):
#发送网络请求,得到响应值
response = requests.post(self.url, headers=self.headers, data=readexcel.get_cell(i,4).encode('utf-8'))
actualresult = response.json()
#获取excel中的预期结果
expectresult = eval(readexcel.get_cell(i,6))
# 获取需验证的数据
key = eval(readexcel.get_cell(i, 5))
keylen = len(key)
j = 0
for k in range(keylen):
aresult = 'actualresult' + key[k]
eresult = 'expectresult' + key[k]
if eval(aresult) == eval(eresult):
#预期结果和实际结果一致
j = j + 1
if j == keylen:
#测试数据执行通过
nok = nok + 1
writeexcel.set_cell(i, 8, 'SUCCESS')
else:
# 测试数据执行失败,并将实际结果写入excel
ner = ner + 1
writeexcel.set_cell(i, 8, 'FAILURE')
writeexcel.set_cell(i, 7, str(actualresult))
print('第', i + 1, '行用例执行失败:预期结果是', expectresult, '实际结果是', actualresult)
# 保存测试报告
writeexcel.save_excel('testreport', '.xls')
print('测试数据中总共', nok, '条用例执行通过', ner, '条用例执行失败')
#释放资源
def tearDown(self):
pass
if __name__ == '__main__':
#构造测试集合
suite = unittest.TestSuite()
suite.addTest(testcase('test_case'))
#创建html文件
filename = ReadConfig().get_config('DATABASE', 'report_address') + 'testreport.html'
fb = open(filename,"wb")
#执行测试并生成html测试报告
runner = HTMLTestRunner.HTMLTestRunner(stream = fb,description = '针对接口的描述信息',title = '某某的自动化测试报告')
runner.run(suite)
#关闭文件
fb.close()
最后,生成的html报告
最后:【可能给你带来帮助的教程】
这一些资料,对做【软件测试】的朋友而言应该是较为完整了,这类学习资料也陪伴我走过了最艰难的路程,希望也可以帮助到你!万事要尽早,尤其是技术行业,一定要提升技术功底。
相关推荐
- 26岁中科大教授攻克世界数学难题(中科大26岁数学家)
-
硬核研究世界顶尖数学期刊发表其研究论文“陈杲特任教授年仅26岁。他2008年入读中科大少年班,2012年赴纽约州立大学石溪分校,师从陈秀雄教授攻读博士。2017年博士毕业后历任普林斯顿高等研究院博士...
- CSP-J/S倒计时 如何做好充足准备?
-
CSP-J/S计算机软件能力认证作为信奥系列赛的首场测试,重要性也就不言而喻了。初试的题目往往是被忽略的环节,但初试是进入复试必须经过之路,成绩低的话无法晋级复试,就更别提复试奖项或者晋级NOIP...
- 信息学竞赛CSP- J/S满分小学生是怎么养成的
-
2024年四川省CSP-J的复赛中,一共有11名选手拿到400分满分,其中有一名小学生,让所有人惊讶又惊喜——嘉祥成华小学六年级学生邱明夷。大家都亲切的叫他小邱邱,因为他刚来新易元学信奥的时候是小学四...
- CSP-J/S什么情况容易得零分(csp-j/s是什么意思)
-
信息學奥赛CSP复赛啊,有这几个点不注意就很容易得0分,第一点呢就是复赛采用的是oi赛制,就是说如果结束后提交代码就无法在比赛的过程中,测试你的代码是否正确,只要有一点点错误就可能会导致0分,一定要严...
- 素数分布的解析理论:π(x)、Li(x)和J(x)的严格数学框架
-
本文从解析数论视角严格阐述素数计数函数π(x)、对数积分Li(x)及黎曼素数函数J(x)之间的数学关系。通过引入黎曼ζ函数的零点分布理论,构建了素数定理的精确表达式,并给出误差项的解析结构。一、基本定...
- 陈杲一本书三年读了三遍(陈红看一本书,三天看完)
-
【陈杲一本书三年读了三遍】14岁读大学、23岁获博士学位、26岁解出J方程和超临界厄米特—杨振宁—米尔斯方程的变形这一世界难题,用数学在相对论与量子力学间架起“新桥”。“天才”陈杲说自己“天赋是有一点...
- 数学不好能学信奥吗?要提前学数学吗?一文读懂数学与信奥的关系
-
在信奥的征途上,数学不仅是基石,更是推动孩子们不断前行的动力。然而,对于小学和初中阶段的孩子来说,如何提前布局数学学习,如何平衡数学与信奥的关系,成为了家长们普遍关心的问题。本文将从实际出发,探讨信奥...
- 手术机器人如何既准确又正确(手术机器人如何既准确又正确使用)
-
日前,北京积水潭医院矫形骨科周一新教授团队提出“臼杯矢状面角度的数学转换公式”,填补了该领域的国际空白,据此揭示了统治髋关节重建领域近50年的传统安全区(Lewinek安全区)不能成立之数学原理,并进...
- 天塌了,原来无痕内衣都是用胶粘出来的?
-
无痕内衣和轻薄贴身的夏装十分相配,它平整柔软的边缘也减少了摩擦皮肤的不适感。然而,这种内衣也有一些令人担忧的传闻。有人说无痕内衣都是用“胶水”粘出来的,有人说它稍有不慎就会开胶,甚至走在路上还会突然解...
- COD 消解器回流仪操作指南:3 步完成精准水质检测
-
化学需氧量(COD)检测是水质监测的核心指标,COD消解器回流仪作为实验室标配设备,其操作规范直接决定数据准确性。本文基于2025年最新版《水质检测设备操作规范》(HJ/T399-2025),...
- 产品图多导致页面变慢?WordPress外贸站“懒加载+CDN”一做
-
“哥,我这首页产品图很多,有灯具细节、展示效果、客户实拍,一开页面就卡得一批…”一个做户外照明出口的客户说。我看了下他站,确实首页就塞了20多张大图,图又是PNG原图,有的1MB一张我用C...
- JWT:一文搞懂现代身份验证的 "数字护照"
-
什么是JWT?先看一个生活比喻假设你去图书馆借书,管理员给你一张带盖章的借阅证,上面写着你的姓名、借阅权限和有效期。每次借书时,你只需出示这张证,管理员核对盖章无误就会放行——这就是JWT(...
- JS setTimeout 的另类用法(js中settime)
-
众所周知,JS中不消耗时间的函数一般是同步的,消耗时间的函数(比如:文件操作,网络操作)一般是异步的。JS默认是单线程的,异步是通过EventLoop来完成任务列表里的任务。当你的主线程中同步过程太...
- JVM GC诡异问题排查,k8s差点害死我……
-
前言本文将通过一个真实的生产环境案例,详细展示如何系统性地排查和解决JVM垃圾收集问题。这个案例涵盖了从问题发现、分析诊断到最终解决的完整过程,对于理解JVM调优实战具有重要的参考价值。系统背景我们的...
- 任天堂Switch 2首发评测:DLSS 3.5画质提升与Joy-Con摇杆耐久测试
-
任天堂Switch2终于来了!作为老玩家,我第一时间拿到机器,重点测试了两个大家最关心的点:DLSS3.5技术对画面的增强效果,以及Joy-Con摇杆的耐用性改进。下面用大白话聊聊实测体验,帮你避...
- 一周热门
- 最近发表
- 标签列表
-
- HTML 简介 (30)
- HTML 响应式设计 (31)
- HTML URL 编码 (32)
- HTML Web 服务器 (31)
- HTML 表单属性 (32)
- HTML 音频 (31)
- HTML5 支持 (33)
- HTML API (36)
- HTML 总结 (32)
- HTML 全局属性 (32)
- HTML 事件 (31)
- HTML 画布 (32)
- HTTP 方法 (30)
- 键盘快捷键 (30)
- CSS 语法 (35)
- CSS 选择器 (30)
- CSS 轮廓宽度 (31)
- CSS 谷歌字体 (33)
- CSS 链接 (31)
- CSS 定位 (31)
- CSS 图片库 (32)
- CSS 图像精灵 (31)
- SVG 文本 (32)
- 时钟启动 (33)
- HTML 游戏 (34)