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

Python接口自动化搭建过程,含request请求封装!

开篇碎碎念
接口测试自动化好处

显而易见的好处就是解放双手😀。

  1. 可以在短时间内自动执行大量的测试用例
  2. 通过参数化和数据驱动的方式进行测试数据的变化,提高测试覆盖范围
  3. 快速反馈测试执行结果和报告
  4. 支持持续集成和持续交付的流程
使用Requests+pytest+allure搭建测试框架的目的
  1. 简化接口测试编写

    Requests库是 Python 的一个优雅且简单的 Http库,可以很方便地发送 http 请求,接收和处理接口返回的响应数据

  2. 强大的断言和校验功能

    Pytest 是一个功能强大的测试框架,提供丰富的断言功能,用于验证接口响应的正确性。

  3. 美观的测试报告

    Allure是一个开源的测试报告生成工具,可以生成漂亮、交互式和易于理解的测试报告。

  4. 持续集成

    使用Requests+Pytest+Allure搭建的框架可以与持续集成和自动化流程集成,实现快速的接口测试。

搭建过程
环境准备
  • 安装requests、pytest、allure的方法

    pip install requests

    pip install pytest

    pip install allure-pytest

    requests、pytest 的安装很简单,这里主要讲讲如何安装 allure。

  • Windows 安装 allure

    java 安装

  1. 下载JDK

    首先我们需要下载 java 开发工具包 JDK,下载地址:www.oracle.com/java/techno…,在下载页面中根据自己的系统选择对应的版本,本文以 Window 64位系统为例:

    1.png

    下载后工具包 jdk 后根据提示进行即可,安装 jdk 的时候也会安装 jre,一并安装就可以了。安装过程中可以自定义安装路径等信息,我选择的安装目录为 D:\Program Files \

  2. 配置环境变量

    1. 安装完成后哦,搜索框输入”编辑系统环境变量“。(或"此电脑",右键后选择"属性",选择"高级系统设置"

    2. 在系统属性里,点击"环境变量"

      在系统变量中设置属性 JAVA_HOME

2.png

现在我也找了很多测试的朋友,做了一个分享技术的交流群,共享了很多我们收集的技术文档和视频教程。
如果你不想再体验自学时找不到资源,没人解答问题,坚持几天便放弃的感受
可以加入我们一起交流。而且还有很多在自动化,性能,安全,测试开发等等方面有一定建树的技术大牛
分享他们的经验,还会分享很多直播讲座和技术沙龙
可以免费学习!划重点!开源的!!!
qq群号:110685036

3. PATH 设置

```
%JAVA_HOME%\bin;
%JAVA_HOME%\jre\bin;
```

3.png

allure 命令行工具安装

allure命令行工具 allure是一个命令行工具,需要去github上下载最新版github.com/allure-fram…

下载完成后,解压,我是放在D盘

0.png

把bin目录添加到环境变量Path下

4.png

注意: cmd命令行运行 java、javac、allure可能表现安装未成功,出现这种情况时可以先选择重启试试。

框架整体结构
名称说明
apiapi
config配置文件,存放setting.ini配置文件,主要配置接口域名和mysql数据库信息
corerequest 请求方法封装、关键字返回结果类
data存放测试用例数据
log日志
report测试报告数据
testcase测试方法
utils工具类
pytest.inipytest 配置文件,为运行项目的相关参数
requirements.txt相关依赖包及版本

测试代码运用了代码分层思想,具体往后看。

  • 在testcases文件夹中,不做接口请求和返回值的操作,用一个方法A代替,参数为请求参数
  • 方法A中调用B方法,B方法接收组装好的参数(包含headers)
  • B方法调用C方法,C方法接收请求参数,参数为接口路径(不包含域名)和 **kwargs(接收B方法中组装好的参数) C方法参数为url,接口请求参数: **kwargs
测试用例

创建测试文件并编写测试方法

(1).py测试文件必须以“test ”开头(或“ test”结尾)

(2)测试方法必须以“test_”开头

(3)测试类必须以Test开头

  • 使用 Pytest 提供的装饰器 “@pytest.mark” 来标记测试用例,其中“@pytest.mark.parametrize ”用于参数化测试用例,通过装饰器可以将多个参数传递给测试函数。
  • @allure.feature("") 是Allure插件提供的一个装饰器,用于定义测试报告中的feature(敏捷开发场景)。通过使用该装饰器,可以将测试用例按照功能模块进行分类展示,提供测试报告可读性。

如下是用户登录的一个例子,test_get_token 函数被标记为参数化测试用例,通过”@pytest.mark.parametrize“传递一个参数data和对应的值。在测试函数中,可以直接使用传递的参数进行测试逻辑,验证请求接口返回是否通过,断言返回状态和登录令牌。

## test_user.py
@allure.feature("用户模块")
class TestUser:@pytest.mark.parametrize("data", get_data()['user_login'])@allure.story("登录-获得token")@allure.title("登录获取令牌测试用例")def test_get_token(self,data):result = login(data)assert result['body']['success'] is Trueassert len(result['body']['accessToken']) != 0 
发送请求和处理响应

调用requests库发送http请求,将data参数中的请求方式、参数和请求体通过调用 api_util_new.do_request()发送请求,使用response接收接口请求的响应结果,并将响应结果处理后返回。

def login(data):"""获取令牌:param json_data:return:"""response = client_api.do_request(url=data['url'], method=data['method'], json=data['data'])return process_response(response)

以下是对于接口请求响应结果的处理,使用字典ResultResponse存储处理后的response,检查请求响应状态代码以确定请求是否成功,并提取响应内容通过日志打印出来方便定位问题。

def process_response(response):ResultResponse = {}if response.status_code == 200 or response.status_code == 201:ResultResponse['success'] = TrueResultResponse['body'] = response.json()else:ResultResponse['success'] = Falselogger.info("请求状态异常")logger.info("响应内容>>>:" + json.dumps(response.json(), ensure_ascii=False))return ResultResponse

封装 HTTP 请求的类 "RestClient",在类方法 do_request() 中,使用 request() 方法接收接口url,接口请求 method 和可选的其他关键字参数。在 request() 方法中,传入的 method(GET、POST、PUT、DELETE) ,使用 requests 库发送相应的 http 请求。

class RestClient:            def do_request(self, url, method,**kwargs):return self.request(url, method, **kwargs)     def request(self, url, method, **kwargs):if method == "GET":return requests.get(self.api_root_url + url, **kwargs)if method == "POST":return requests.post(self.api_root_url + url, **kwargs)if method == "PUT":return requests.put(self.api_root_url + url, **kwargs)if method == "DELETE":return requests.delete(self.api_root_url + url, **kwargs)
client_api = RestClient()
数据驱动测试和校验
  • 通过 yaml 文件存放测试用例数据,如下user_login_body 为用户登录数据列表,其中url为api地址,method 为请求方式,data为请求参数

  • user_login_body:- url: /api/signinmethod: POSTdata: {username: userpassword: pwd}
    

    json转yaml格式的方法网上一堆,比如 bejson,而校验 yaml 书写格式的工具,可以使用 YamlLint

  • 通过装饰器 @pytest.mark.parametrize,运行测试时会获取测试用例的数据去执行测试

  • 校验接口返回结果的正确性通常使用断言来实现。根据接口返回的数据结构,可以使用适当的断言函数来校验各个字段的值是否符合预期。

    Pytest 支持使用 assert 关键字进行断言assert 函数,Pytest 提供了一些内置的断言函数

    • assertEqual(a, b)
    • assertTrue(x)
    • assertFalse(x)
    • assertIs(a, b)
    • assertIsNone(x)
    • assertIn(a, b)
    • assertNotIn(a, b)
报告生成展示

在命令行执行命令:pytest 运行用例后,会得到一个测试报告的原始文件,但这个时候还不能打开成HTML的报告,还需要在项目根目录下,执行命令启动 allure 服务。下图是个结果测试结果的展示示例。

# 需要提前配置allure环境,才可以直接使用命令行
allure serve ./report

5.png

allure测试报告框架是一个开源的测试报告生成工具,它提供了丰富的功能和灵活的配置选项,用于生成美观、可交互和易于理解的测试报告。基本过程如下:

  • 框架集成:通过与 Pytest 集成 ,利用 Pytest 框架提供的插件机制,将测试结果和相关信息收集起来。
  • 结果收集: allure 收集 Pytest 生成的测试结果数据,结果数据中包括测试用例的执行状态、断言结果、日志信息等。
  • 报告生成: allure 使用收集到的数据转换为 xml 格式,并利用报告模板和样式表定义,渲染出漂亮的 html 文件。
持续集成
  • Jenkins中安装Allure插件 Allure Jenkins Plugin

  • 添加接口自动化测试的代码

  • 触发规则我选择的是准备发布打tag 后,自动执行构建

  cd ${WORKSPACE}pytest

总结

本项目在实现过程中,把整个项目拆分成请求方法封装、HTTP接口封装、关键字封装、测试用例等模块。

首先利用Python把HTTP接口封装成Python接口,接着把这些Python接口组装成一个个的关键字,再把关键字组装成测试用例,而测试数据则通过YAML文件进行统一管理,然后再通过Pytest测试执行器来运行这些脚本,并结合Allure输出测试报告。

今天的分享就到此结束了,大家还有什么不懂的可以评论区下提问哈,如果我的文章对你有所帮助的话,可以点赞三联支持一下哈

相关文章:

Python接口自动化搭建过程,含request请求封装!

开篇碎碎念 接口测试自动化好处 显而易见的好处就是解放双手😀。 可以在短时间内自动执行大量的测试用例通过参数化和数据驱动的方式进行测试数据的变化,提高测试覆盖范围快速反馈测试执行结果和报告支持持续集成和持续交付的流程 使用Requestspytes…...

Vue3 编译原理

文章目录 一、编译流程1. 解读入口文件 packgages/vue/index.ts2. compile函数的运行流程 二、AST 解析器1. ast 的生成2. 创建ast的根节点3. 解析子节点 parseChildren(关键)4. 解析模版元素 Element模版元素解析-举例分析 一、编译流程 1. 解读入口文…...

spring boot整合Minio

MinIO 安装MinIo # 先创建minio 文件存放的位置 mkdir -p /opt/docker/minio/data# 启动并指定端口 docker run \-p 9000:9000 \-p 5001:5001 \--name minio \-v /opt/docker/minio/data:/data \-e "MINIO_ROOT_USERminioadmin" \-e "MINIO_ROOT_PASSWORDmini…...

Hadoop----Azkaban的使用与一些报错问题的解决

1.因为官方只放出源码,并没有放出其tar包,所以需要我们自己编译,通过查阅资料我们可以使用gradlew对其进行编译,还是比较简单,然后将里面需要用到的服务文件夹进行拷贝,完善其文件夹结构,通常会…...

「新房家装经验」客厅电视高度标准尺寸及客厅电视机买多大尺寸合适?

客厅电视悬挂高度标准尺寸是多少? 客厅电视悬挂高度通常在90~120厘米之间,电视挂墙高度也可以根据个人的喜好和实际情况来调整,但通常不宜过高,以坐在沙发上观看时眼睛能够平视到电视中心点或者中心稍微往下一点的位置为适宜。 客…...

ArduPilot开源飞控之AP_Baro_DroneCAN

ArduPilot开源飞控之AP_Baro_DroneCAN 1. 源由2. back-end抽象类3. 方法实现3.1 probe3.2 update3.3 subscribe_msgs3.4 handle_pressure/handle_temperature3.5 CAN port 4. 参考资料 1. 源由 鉴于ArduPilot开源飞控之AP_Baro中涉及Sensor Driver有以下总线类型: …...

Supervised Contrastive Pre-training for Mammographic Triage Screening Model

方法 品红色箭头表示将生成的孪生编码器分别迁移到单视角学习模块和双视角学习模块...

JVM技术文档--JVM优化思路以及问题定位--JVM可调整参数汇总

阿丹: 一个优秀的程序员,是因为在线上的排查以及遇到的线上、生产事故较多所以定位问题以及解决问题会比普通程序员快很多,所以一个优秀的程序员要逐渐形成自己的方法论,来完善和解决问题。 我们是如何发现问题的呢? …...

Oracle10g数据库迁移方案

试验了很多次Oracle数据库迁移才成功,贴出来给大家参考一下,我看到有的地方写迁移之后还需要重新建立temp表空间,这个还没有研究。另外说一点的是两个数据库的版本一定要一致,之前失败过一次,就是因为两个数据库的版本…...

备忘录模式:对象状态的保存与恢复

欢迎来到设计模式系列的第十八篇文章,本篇将介绍备忘录模式。备忘录模式是一种行为型设计模式,它允许在不破坏封装性的前提下捕获一个对象的内部状态,并在之后恢复该状态。这种模式通常用于需要提供撤销操作的情况。 什么是备忘录模式&#…...

C# InvokeRequired线程安全

C# InvokeRequired线程安全 为了保证新家的线程可能要对主界面的控件元素的属性发生一些改变,此时防止此操作对于主线程的影响,就提出了 InvokeRequired方法,保证主线程的安全,同时新加的线程也可以改变主页面中元素的值。 定义…...

pdf怎么转成jpg图片格式

pdf怎么转成jpg图片格式?对于大家平时在工作或者生活中的图片使用习惯,经常需要将各种格式的文件转换成易于浏览和使用的JPG格式图片以便保存。如今,因为pdf文件具有更强的稳定性和设备兼容性,PDF文件在平时的电脑使用过程中可以说…...

React +ts + babel+webpack

babel babel/preset-typescript 专门处理ts "babel/cli": "^7.17.6", "babel/core": "^7.17.8", "babel/preset-env": "^7.16.11", "babel/preset-react": "^7.16.7", "babel/preset…...

红队专题-REVERSE二进制逆向反编译

红队专题 招募六边形战士队员IDA pro安装python2加入环境变量py2安装pip安装IDA 7.0 proIDAPython: importing "site" failed. 招募六边形战士队员 一起学习 代码审计、安全开发、web攻防、逆向等。。。 私信联系 IDA pro 安装python2 python-2.7.3.msi 加入环…...

Spring技术原理之Bean生命周期原理解析

Spring技术原理之Bean生命周期原理解析 Spring作为Java领域中的优秀框架,其核心功能之一是依赖注入和生命周期管理。其中,Bean的生命周期管理是Spring框架中一个重要的概念。在本篇文章中,我们将深入探讨Spring技术原理中的Bean生命周期原理…...

Unity实现设计模式——模板方法模式

Unity实现设计模式——模板方法模式 模板模式(Template Pattern), 指在一个抽象类公开定义了执行它的方法的模板。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。 简单说, 模板方法模式定义一个操作中的算法的骨架&…...

C++实现高性能内存池(二)

文章目录 一、设计内存池二、实现MemoryPool::construct() 实现MemoryPool::deallocate() 实现MemoryPool::~MemoryPool() 实现MemoryPool::allocate() 实现三、与 std::vector 的性能对比一、设计内存池 在上节中,我们在模板链表栈中使用了默认构造器来管理栈操作中的元素内…...

沪深300期权一个点多少钱?

经中国证监会批准,深圳证券交易所于2019年12月23日上市嘉实沪深300ETF期权合约品种。该产品是以沪深300为标的物的嘉实沪深300ETF交易型指数基金为标的衍生的标准化合约,下文介绍沪深300期权一个点多少钱?本文来自:期权酱 一、沪深300期权涨…...

怎么防止重要文件夹丢失?文件夹安全如何保护?

我们在使用电脑的过程中,会将重要数据放在文件夹中,那么,我们该怎么防止重要文件夹丢失呢?下面我们就一起来了解一下。 EFS加密 EFS加密可以对于NTFS卷上的文件夹进行加密,加密后的文件夹将只允许加密时登录系统的用户…...

用于物体识别和跟踪的下游任务自监督学习-1-引言

一:引言: 图像和视频理解是计算机视觉应用中的基本问题,旨在使机器能够像人类一样解释和理解视觉数据。这些问题涉及识别图像和视频中的对象、人物、动作、事件和场景。如图1.1-(a)所示的图像识别任务包括对象检测[1]…...

式子表达ds类——多用位置/值域表示未知数+区间覆盖转区间加:CF407E

https://www.luogu.com.cn/problem/CF407E 多用位置/值域表示未知数 推出的式子中 n n n 表示长度,应该直接换成 r − l 1 r-l1 r−l1 区间覆盖转区间加 推出的式子有 m x , m n mx,mn mx,mn,朴素思路是用单调队列区间覆盖维护 那样就不能很方便…...

Python 实现秒表功能(比较好玩的题目)

以下实例使用 time 模块来实现秒表功能: import time print(按下回车开始计时,按下ctrlc停止计时) while True:input("")starttimetime.time()print(开始)try:while True:print(计时:,round(time.time()-starttime,0),秒)time.sle…...

DALL-E 3调参教程;百度新出的AI写小说神器;通义听悟看播客也太爽了;系列博文带你理解生成式AI | ShowMeAI日报

👀日报&周刊合集 | 🎡生产力工具与行业应用大全 | 🧡 点赞关注评论拜托啦! 🔥 2023年诺贝尔奖全部揭晓,一文看完6类奖项花落谁家 https://www.nobelprize.org/prizes 随着最后一项「经济学奖」的揭秘&a…...

设计模式-享元模式

概念 共享内存&#xff08;主要考虑内存&#xff0c;而非效率&#xff09;相同的数据&#xff0c;共享使用&#xff08;JS中未找到经典应用场景&#xff09; 演示 <!-- 无限下拉列表&#xff0c;将事件代理到高层节点上 --> <!-- 如果都绑定到<a>标签&#x…...

中秋时节赏明月,五子棋戏月饼趣 — Flutter中秋限定版五子棋

前言 当中秋时节来临&#xff0c;我们都期待着与亲人朋友共度这个美好的节日。这个时候&#xff0c;除了传统的赏月和品尝美味的月饼&#xff0c;我还有一个特别的建议——尝试一款有趣的Flutter五子棋游戏&#xff01;这款五子棋游戏以中秋为主题&#xff0c;游戏的棋子也可爱…...

Scala第十九章节

Scala第十九章节 scala总目录 文档资料下载 章节目标 了解Actor的相关概述掌握Actor发送和接收消息掌握WordCount案例 1. Actor介绍 Scala中的Actor并发编程模型可以用来开发比Java线程效率更高的并发程序。我们学习Scala Actor的目的主要是为后续学习Akka做准备。 1.1 Ja…...

kafka与hbase的区别

Kafka 和 HBase 是两个不同的分布式数据存储系统&#xff0c;它们可以在大数据应用中发挥不同的作用。 Kafka 是一个高吞吐量的分布式发布订阅消息系统&#xff0c;主要用于处理实时数据流。它具有以下特点&#xff1a; 高性能&#xff1a;Kafka 能够以非常高的吞吐量和低延迟…...

出栈序列的合法性

给定一个最大容量为 M 的堆栈&#xff0c;将 N 个数字按 1, 2, 3, ..., N 的顺序入栈&#xff0c;允许按任何顺序出栈&#xff0c;则哪些数字序列是不可能得到的&#xff1f;例如给定 M5、N7&#xff0c;则我们有可能得到{ 1, 2, 3, 4, 5, 6, 7 }&#xff0c;但不可能得到{ 3, …...

unity操作_刚体 c#

刚体Rigidbody 首先在场景中创建一个Plane 位置重置一下 再创建一个Cube 充值 y0.5 我们可以看出创建的Cube 和 Plane都自带碰撞器 Plane用的是网格碰撞器 我们可以通过网格世界看到不同的网格碰撞器 发生碰撞&#xff08;条件&#xff09;&#xff1a; 两个物体都有碰撞器 …...

网络编程中套接字(socket)介绍(Python示例)

网络编程中套接字&#xff08;socket&#xff09;介绍&#xff08;Python示例&#xff09; 网络编程就是同一计算机的进程间或者不同的联网计算机之间的通信&#xff08;交换数据&#xff09;。 那么&#xff0c;这两台计算机之间用什么传输数据呢&#xff1f;首先你肯定先需要…...