当前位置: 首页 > news >正文

接口自动化框架---升级版(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】🌏 🙆目的与景愿:旨在于能帮助更多的测试行业人员提升软硬技能&#xf…...

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…...

变量 varablie 声明- Rust 变量 let mut 声明与 C/C++ 变量声明对比分析

一、变量声明设计:let 与 mut 的哲学解析 Rust 采用 let 声明变量并通过 mut 显式标记可变性,这种设计体现了语言的核心哲学。以下是深度解析: 1.1 设计理念剖析 安全优先原则:默认不可变强制开发者明确声明意图 let x 5; …...

日语AI面试高效通关秘籍:专业解读与青柚面试智能助攻

在如今就业市场竞争日益激烈的背景下,越来越多的求职者将目光投向了日本及中日双语岗位。但是,一场日语面试往往让许多人感到步履维艰。你是否也曾因为面试官抛出的“刁钻问题”而心生畏惧?面对生疏的日语交流环境,即便提前恶补了…...

Flask RESTful 示例

目录 1. 环境准备2. 安装依赖3. 修改main.py4. 运行应用5. API使用示例获取所有任务获取单个任务创建新任务更新任务删除任务 中文乱码问题: 下面创建一个简单的Flask RESTful API示例。首先,我们需要创建环境,安装必要的依赖,然后…...

python打卡day49

知识点回顾: 通道注意力模块复习空间注意力模块CBAM的定义 作业:尝试对今天的模型检查参数数目,并用tensorboard查看训练过程 import torch import torch.nn as nn# 定义通道注意力 class ChannelAttention(nn.Module):def __init__(self,…...

从零实现富文本编辑器#5-编辑器选区模型的状态结构表达

先前我们总结了浏览器选区模型的交互策略,并且实现了基本的选区操作,还调研了自绘选区的实现。那么相对的,我们还需要设计编辑器的选区表达,也可以称为模型选区。编辑器中应用变更时的操作范围,就是以模型选区为基准来…...

智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql

智慧工地管理云平台系统,智慧工地全套源码,java版智慧工地源码,支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求,提供“平台网络终端”的整体解决方案,提供劳务管理、视频管理、智能监测、绿色施工、安全管…...

centos 7 部署awstats 网站访问检测

一、基础环境准备(两种安装方式都要做) bash # 安装必要依赖 yum install -y httpd perl mod_perl perl-Time-HiRes perl-DateTime systemctl enable httpd # 设置 Apache 开机自启 systemctl start httpd # 启动 Apache二、安装 AWStats&#xff0…...

全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比

目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...

如何在网页里填写 PDF 表格?

有时候,你可能希望用户能在你的网站上填写 PDF 表单。然而,这件事并不简单,因为 PDF 并不是一种原生的网页格式。虽然浏览器可以显示 PDF 文件,但原生并不支持编辑或填写它们。更糟的是,如果你想收集表单数据&#xff…...

Hive 存储格式深度解析:从 TextFile 到 ORC,如何选对数据存储方案?

在大数据处理领域,Hive 作为 Hadoop 生态中重要的数据仓库工具,其存储格式的选择直接影响数据存储成本、查询效率和计算资源消耗。面对 TextFile、SequenceFile、Parquet、RCFile、ORC 等多种存储格式,很多开发者常常陷入选择困境。本文将从底…...