接口自动化框架---升级版(Pytest+request+Allure)
目录:导读
一、简单介绍
二、目录介绍
三、代码分析
写在最后
接口自动化是指模拟程序接口层面的自动化,由于接口不易变更,维护成本更小,所以深受各大公司的喜爱。
第一版入口:接口自动化框架(Pytest+request+Allure)
本次版本做了一些升级,增加了自动生成testcase等,一起来看看吧!~~
一、简单介绍
环境:Mac+Python 3+Pytest+Allure+Request
流程:Charles导出接口数据-自动生成测试用例-修改测试用例-执行测试用例-生成Allure报告
开源: 点击这里,跳转到github
备注⚠️:Charles导出接口应选择文件类型为JSON Session File(.chlsj)
重要模块介绍:
1、writeCase.py :自动读取新的Charles文件,并自动生成测试用例
2、apiMethod.py:封装request方法,可以支持多协议扩展(get\post\put)
3、checkResult.py:封装验证response方法
4、setupMain.py: 核心代码,定义并执行用例集,生成报告
二、目录介绍
三、代码分析
1、测试数据yml(自动生成的yml文件)
# 用例基本信息
test_info:# 用例标题,在报告中作为一级目录显示title: blogpost# 用例IDid: test_reco_01# 请求的域名,可写死,也可写成模板关联host配置文件host: ${host}$# 请求地址 选填(此处不填,每条用例必填)address: /api/v2/recomm/blogpost/reco# 前置条件,case之前需关联的接口
premise:# 测试用例
test_case:- test_name: reco_1# 第一条case,info可不填info: reco# 请求协议http_type: https# 请求类型request_type: POST# 参数类型parameter_type: application/json# 请求地址address: /api/v2/recomm/blogpost/reco# 请求头headers:# parameter为文件路径时parameter: reco.json# 是否需要获取cookiecookies: False# 是否为上传文件的接口file: false# 超时时间timeout: 20# 校验列表 list or dict# 不校验时 expected_code, expected_request 均可不填check:expected_request: result_reco.jsoncheck_type: only_check_statusexpected_code: 503# 关联键relevance:
2、测试case(自动生成的case.py)
@allure.feature(case_dict["test_info"]["title"])
class TestReco:@pytest.mark.parametrize("case_data", case_dict["test_case"], ids=[])@allure.story("reco")@pytest.mark.flaky(reruns=3, reruns_delay=3)def test_reco(self, case_data):""":param case_data: 测试用例:return:"""self.init_relevance = ini_request(case_dict, PATH)# 发送测试请求api_send_check(case_data, case_dict, self.init_relevance, PATH)
3、writeCase.py (封装方法:自动生成测试case)
def write_case(_path):yml_list = write_case_yml(_path)project_path = str(os.path.abspath('.').split('/bin')[0])test_path = project_path+'/aff/testcase/'src = test_path+'Template.py'for case in yml_list:yml_path = case.split('/')[0]yml_name = case.split('/')[1]case_name = 'test_' + yml_name + '.py'new_case = test_path + yml_path + '/' + case_namemk_dir(test_path + yml_path)if case_name in os.listdir(test_path + yml_path):passelse:shutil.copyfile(src, new_case)with open(new_case, 'r') as fw:source = fw.readlines()n = 0with open(new_case, 'w') as f:for line in source:if 'PATH = setupMain.PATH' in line:line = line.replace("/aff/page/offer", "/aff/page/%s" % yml_path)f.write(line)n = n+1elif 'case_dict = ini_case' in line:line = line.replace("Template", yml_name)f.write(line)n = n + 1elif 'class TestTemplate' in line:line = line.replace("TestTemplate", "Test%s" % yml_name.title().replace("_", ""))f.write(line)n = n + 1elif '@allure.story' in line:line = line.replace("Template", yml_name)f.write(line)n = n + 1elif 'def test_template' in line:line = line.replace("template", yml_name.lower())f.write(line)n = n + 1else:f.write(line)n += 1for i in range(n, len(source)):f.write(source[i])
4、apiMethod.py(封装方法:http多协议)
def post(header, address, request_parameter_type, timeout=8, data=None, files=None):"""post请求:param header: 请求头:param address: 请求地址:param request_parameter_type: 请求参数格式(form_data,raw):param timeout: 超时时间:param data: 请求参数:param files: 文件路径:return:"""if 'form_data' in request_parameter_type:for i in files:value = files[i]if '/' in value:file_parm = ifiles[file_parm] = (os.path.basename(value), open(value, 'rb'))enc = MultipartEncoder(fields=files,boundary='--------------' + str(random.randint(1e28, 1e29 - 1)))header['Content-Type'] = enc.content_typeresponse = requests.post(url=address, data=enc, headers=header, timeout=timeout)else:response = requests.post(url=address, data=data, headers=header, timeout=timeout, files=files)try:if response.status_code != 200:return response.status_code, response.textelse:return response.status_code, response.json()except json.decoder.JSONDecodeError:return response.status_code, ''except simplejson.errors.JSONDecodeError:return response.status_code, ''except Exception as e:logging.exception('ERROR')logging.error(e)raise
5、checkResult.py(封装方法:校验response结果)
def check_result(test_name, case, code, data, _path, relevance=None):"""校验测试结果:param test_name: 测试名称:param case: 测试用例:param code: HTTP状态:param data: 返回的接口json数据:param relevance: 关联值对象:param _path: case路径:return:"""# 不校验结果if case["check_type"] == 'no_check':with allure.step("不校验结果"):pass# json格式校验elif case["check_type"] == 'json':expected_request = case["expected_request"]if isinstance(case["expected_request"], str):expected_request = readExpectedResult.read_json(test_name, expected_request, _path, relevance)with allure.step("JSON格式校验"):allure.attach("期望code", str(case["expected_code"]))allure.attach('期望data', str(expected_request))allure.attach("实际code", str(code))allure.attach('实际data', str(data))if int(code) == case["expected_code"]:if not data:data = "{}"check_json(expected_request, data)else:raise Exception("http状态码错误!\n %s != %s" % (code, case["expected_code"]))# 只校验状态码elif case["check_type"] == 'only_check_status':with allure.step("校验HTTP状态"):allure.attach("期望code", str(case["expected_code"]))allure.attach("实际code", str(code))allure.attach('实际data', str(data))if int(code) == case["expected_code"]:passelse:raise Exception("http状态码错误!\n %s != %s" % (code, case["expected_code"]))# 完全校验elif case["check_type"] == 'entirely_check':expected_request = case["expected_request"]if isinstance(case["expected_request"], str):expected_request = readExpectedResult.read_json(test_name, expected_request, _path, relevance)with allure.step("完全校验"):allure.attach("期望code", str(case["expected_code"]))allure.attach('期望data', str(expected_request))allure.attach("实际code", str(code))allure.attach('实际data', str(data))if int(code) == case["expected_code"]:result = operator.eq(expected_request, data)if result:passelse:raise Exception("完全校验失败! %s ! = %s" % (expected_request, data))else:raise Exception("http状态码错误!\n %s != %s" % (code, case["expected_code"]))# 正则校验elif case["check_type"] == 'Regular_check':if int(code) == case["expected_code"]:try:result = ""if isinstance(case["expected_request"], list):for i in case[""]:result = re.findall(i.replace("\"","\""), str(data))allure.attach('校验完成结果\n',str(result))else:result = re.findall(case["expected_request"].replace("\"", "\'"), str(data))with allure.step("正则校验"):allure.attach("期望code", str(case["expected_code"]))allure.attach('正则表达式', str(case["expected_request"]).replace("\'", "\""))allure.attach("实际code", str(code))allure.attach('实际data', str(data))allure.attach(case["expected_request"].replace("\"", "\'") + '校验完成结果',str(result).replace("\'", "\""))if not result:raise Exception("正则未校验到内容! %s" % case["expected_request"])except KeyError:raise Exception("正则校验执行失败! %s\n正则表达式为空时" % case["expected_request"])else:raise Exception("http状态码错误!\n %s != %s" % (code, case["expected_code"]))else:raise Exception("无该校验方式%s" % case["check_type"])
6、setupMain.py(执行用例集,生成测试报告)
def invoke(md):output, errors = subprocess.Popen(md, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE).communicate()o = output.decode("utf-8")return oif __name__ == '__main__':LogConfig(PATH)write_case(har_path)args = ['-s', '-q', '--alluredir', xml_report_path]pytest.main(args)cmd = 'allure generate %s -o %s' % (xml_report_path, html_report_path)invoke(cmd)
7、测试报告
写在最后
如果你觉得文章还不错,请大家 点赞、分享、留言 下,因为这将是我持续输出更多优质文章的最强动力!
看到这篇文章的人有觉得我的理解有误的地方,也欢迎评论和探讨~
你也可以加入下方的的群聊去和同行大神交流切磋
相关文章:
接口自动化框架---升级版(Pytest+request+Allure)
目录:导读 一、简单介绍 二、目录介绍 三、代码分析 写在最后 接口自动化是指模拟程序接口层面的自动化,由于接口不易变更,维护成本更小,所以深受各大公司的喜爱。 第一版入口:接口自动化框架(PytestrequestAllure…...
C语言循环语句简述
C 循环 有的时候,我们可能需要多次执行同一块代码。一般情况下,语句是按顺序执行的:函数中的第一个语句先执行,接着是第二个语句,依此类推。 编程语言提供了更为复杂执行路径的多种控制结构。 循环语句允许我们多次…...
STM32开发(16)----CubeMX配置DMA
CubeMX配置DMA前言一、什么是DMA?二、实验过程1.CubeMX配置2.代码实现3.实验结果总结前言 本章介绍使用STM32CubeMX对DMA进行配置的方法,DMA的原理、概念和特点,配置各个步骤的功能,并通过串口DMA传输实验方式验证。 一、什么是…...
让物流园区可视可控,顺丰供应链与亚马逊云科技的供应链新解法
导读:物流园区如何破解供应链断点?在物流园区附近,我们经常看到周边道路停满了集装箱卡车。这是物流园区的一个典型痛点,由于园区内部业务情况的不可见性,司机们往往到了园区才被告知业务繁忙,需要长时间排…...
2023年3月北京/西安/广州/深圳DAMA-CDGA/CDGP数据治理认证报名
DAMA认证为数据管理专业人士提供职业目标晋升规划,彰显了职业发展里程碑及发展阶梯定义,帮助数据管理从业人士获得企业数字化转型战略下的必备职业能力,促进开展工作实践应用及实际问题解决,形成企业所需的新数字经济下的核心职业…...
「TCG 规范解读」TCG 主规范-设计原则
可信计算组织(Ttrusted Computing Group,TCG)是一个非盈利的工业标准组织,它的宗旨是加强在相异计算机平台上的计算环境的安全性。TCG于2003年春成立,并采纳了由可信计算平台联盟(the Trusted Computing Platform Alliance,TCPA)所开发的规范。现在的规范都不是最终稿,都…...
【Spring源码】Spring AOP的核心概念
废话版什么是AOP关于什么是AOP,这里还是要简单介绍下AOP,Aspect Oriented Programming,面向切面编程,通过预编译和运行期间提供动态代理的方式实现程序功能的统一维护,使用AOP可以降低各个部分的耦合度,提高…...
华为OD机试用Python实现 -【任务混部】(2023-Q1 新题)
华为OD机试题 华为OD机试300题大纲任务混部题目输入输出示例一输入输出说明示例二输入输出说明备注Code代码编写思路华为OD机试300题大纲 参加华为od机试,一定要注意不要完全背诵代码,需要理解之后模仿写出,通过率才会高。 华为 OD 清单查看地址:blog.csdn.net/hihell/ca…...
Linux yum 命令
yum( Yellow dog Updater, Modified)是一个在 Fedora 和 RedHat 以及 SUSE 中的 Shell 前端软件包管理器。 基于 RPM 包管理,能够从指定的服务器自动下载 RPM 包并且安装,可以自动处理依赖性关系,并且一次安装所有依赖…...
package.json 字段配置
文章目录环境导入相关main 和 modulewebpack resolve.mainFieldsbrowserexports定义其他模块根据导入语句导出嵌套环境导出vue中 exports 用法自定义运行环境环境导入相关 main 和 module 根据导入模块时不同的模块规范语句查找不同的入口文件 "main": "dist…...
springboot中集成redis,二次封装成工具类
大家好,我是雄雄,欢迎关注微信公众号:** 雄雄的小课堂 ** 现在是:2023年2月28日11:01:56 前言 redis大家应该都不陌生,我们在好多场景下都会使用,最近在面试别人的时候,也会问一些关于redis的…...
Linux Vim 简介
文章目录01. 编辑器 Gedit 介绍02. 什么是 Vi(Vim)03. vim工作模式4.1 命令模式4.2 编辑模式4.3 末行模式04. vim教程05. vim基本操作06. vim实用操作7.1 命令模式下的操作7.2 末行模式下的操作01. 编辑器 Gedit 介绍 gedit 是一个 GNOME 桌面环境下兼容 UTF-8 的 文本编辑器。…...
软件测试面试题 —— 整理与解析(2)
😏作者简介:博主是一位测试管理者,同时也是一名对外企业兼职讲师。 📡主页地址:🌎【Austin_zhai】🌏 🙆目的与景愿:旨在于能帮助更多的测试行业人员提升软硬技能…...
HashMap与Hashtable的这九个区别,你知道吗
Hashtable Hashtable是原始的java.util的一部分,属于一代集合类,是一个Dictionary具体的实现 。Java1.2重构的Hashtable实现了Map接口,因此,Hashtable现在集成到了集合框架中。它和HashMap类很相似。 Hashtable与HashMap的区别 …...
Java奠基】掌握Java基础知识
目录 常见字面量 特殊字面量 数据类型 标识符 键盘录入 常见字面量 字面量就是数据在程序中的书写格式,字面量的分类如下: 字面量类型说明举例整数类型不带小数点的数字12,25小数类型带小数点的数字3.14,-5,20…...
Hive窗口函数-lead/lag函数
前面我们学习的first_value和last_value 取的是排序后的数据截止当前行的第一行数据和最后一行数据 Lag和Lead分析函数可以在一次查询中取出当前行后N行和前N行的数据,虽然可以不用排序,但是往往只有在排序的场景下取前面或者后面N 行数据才有意义 这种…...
2023JAVA面试题全集超全面超系统超实用!早做准备早上岸
2022年我凭借一份《Java面试核心知识点》成功拿下了阿里、字节、小米等大厂的offer,两年的时间,为了完成我给自己立的flag(拿下一线互联网企业offer大满贯),即使在职也一直在不断的学习与备战面试中!——或…...
FreeRTOS入门(05):事件组
文章目录目的基础说明相关函数使用演示总结目的 事件组是RTOS中相对常用的用于任务间交互的功能,这篇文章将对相关内容做个介绍。 本文代码测试环境见前面的文章:《FreeRTOS入门(01):基础说明与使用演示》 基础说明…...
【API网关】Kong安装和基本操作
文章目录前言一、API网关选型和Kong的安装1. 什么是API网关2. API网关技术选型3. 安装postgresql和migrations4. 安装kong5. 安装konga二、基本的路由转发配置1. kong的8001、8000和1337端口号的关系2. 基本的路由转发配置3. kong集成consul实现服务发现和负载均衡4. kong配置j…...
git --- stash用法
1 git stash命令介绍 // 保存当前分支的修改,回到上个版本的状态 git stash // 保存当前分支的修改,回到上个版本的状态,msg是保存当前修改的说明 git stash save "msg" // 用来展示所有保存的列表 git stash list // 用来展示某一保存记录所修改的操作 gi…...
【星海出品】VScode安装配置
安装VScode最好在官方网站上下载。 例如 https://code.visualstudio.com/Download 不知道自己的windows版本的话,可以命令行WINR 运行 输入: systeminfo | find "OS" //获取OS的版本信息。 systeminfo | find "系统类型" //获取系统…...
docker 基础命令备忘录
1. 官方安装docker curl -fsSL https://get.docker.com -o get-docker.sh && sh get-docker.shcurl -L "https://github.com/docker/compose/releases/download/v2.16.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose chmod x…...
华为OD机试 - 创建二叉树(Java JS Python)
题目描述 请按下列描述构建一颗二叉树,并返回该树的根节点: 1、先创建值为-1的根结点,根节点在第0层; 2、然后根据operations依次添加节点: operations[i] = [height, index] 表示对第 height 层的第index 个节点node, 添加值为 i 的子节点: 若node 无「左子节点」,则…...
服务案例|基于IT事件管理,提升业务连续性
数字化经济时代,IT架构复杂性越来越高,业务连续性成为很多行业或企业最核心的任务。业务连续性管理是一个不断提升的过程,围绕事件“发现-响应-定位处理-降低发生”的事件处理思路,结合平台化运维,助力业务快速提升。 …...
你说下HashMap的工作原理?
我在网上看了很多文章 ,各种长篇大论 ,原理细节、实在看不下去了,所以着重讲一下,HashMap 面试会问到的点 说人话, 你们公司的集合 不会自研吧, 假如 你们叫 锤子科技 ,那老板也不会要求你去写一…...
k8s 配置ingress 并做一个demo
需求:k8s 配置好之后除了 nodeport 以外都是对集群内部的行为使用nodeport 并不是很友好,要自己处理很多的端口管理使用ingress 可以更好的整合配置服务进程:下载ingress-nginx 的yaml 文件https://github.com/kubernetes/ingress-nginx/blob…...
【手把手一起学习】(七) Altium Designer 20常用PCB设计规则
1 常用PCB设计规则 PCB规则设计是PCB设计中至关重要的环节,它约束了电气要求、布线方式、器件摆放位置等,为后续的手动布局、布线提供依据。完善的PCB规则设计,可以减少设计中的错误,提高PCB设计效率。 1.1 PCB设计规则管理器 …...
(01)Unity 中使用 HDRP
概述Unity在2019.2版本中推出HDRP(高清渲染管线),目的是为了提高图形质量,实现从照片写实到风格化的图像。先看一下官方对HDRP的概述:高清渲染管线 (HDRP) 是由 Unity 构建的高保真脚本化渲染管…...
使用cmake在win10编译yolov5+tensorRT+cuda+cudnn+protobuf代码进行混合编译
这里进行之前需要把protobuf在win10下编译,可以参考这篇文章从Linux下载下来的工程代码,这里建议直接使用vs系列打开不要用vscode打开,vscode对win下的cmake不友好,主要体现在报错机制无法直接定位,题主的环境是vs2022…...
《C++ Primer Plus》第17章:输入、输出和文件(7)
编程练习 编写一个程序计算输入流中第一个$之前的字符数目,并将$留在输入流中。 #include<iostream>int main() {int ct 0;while(std::cin.peek()!$){ct;std::cin.get();}std::cout << "num: " << ct << std::endl;return 0; }答…...
网站建设找单/网站建设外包
sencha的前身就是Extjs了,sencha 框架是世界上第一个基于HTML5的Mobile App框架 那么何谓框架,传统软件工程对于库和框架的区分主要着眼于对应用运行流程的控制权,框架提供架构,控制运行流程,让开发者在合适的地方书写…...
可以做ppt的网站有哪些/网店运营的工作内容
在项目中经常遇到要动态生成控件,动态显示指定的控件或者隐藏,这就要涉及到查找控件的问题。 下面介绍下Winform中使用控件名来查找窗体或者容器中的控件的方法,代码如下: /// <summary> /// 通过控件名获取控件…...
wordpress主题开发文档/怎样创建网站平台
ROUND(A1*0.75,0)转载于:https://www.cnblogs.com/Ph-one/p/5501320.html...
上海网站建设网页设计/舆情系统
有木有小伙伴经常纳闷,为什么明明大家拿到的都是同样的数据,但是别人做出来的图表就是特别好看呢?有时候绞尽脑汁花了好长时间做出来的图表还不如别人花三分钟做出来的图表,太挫败了有木有!别急!小编今天就…...
做网站的生产方式/外贸网站建设公司哪家好
2021.9.5 很多地方有改动,添加了自己的理解!!! 0 前言 用Chisel编写的CPU,比如Rocket-Chip、RISCV-Mini等,都有一个特点,就是可以用一个配置文件来裁剪电路,其实它就使用到了我们说…...
网站源码下载插件/杭州10大软件开发公司
昨晚安全新闻爆出一个“PHP任意文件上传漏洞”,CVE编号为:CVE-2015-2348。当时楼主正准备收拾东西回家,看到这个新闻心里一惊:失传江湖多年的0字符截断上传漏洞又重现了?而且还影响这么多版本!如果漏洞属实…...