Python+Requests+Pytest+YAML+Allure实现接口自动化

2023-11-09

本项目实现接口自动化的技术选型:Python+Requests+Pytest+YAML+Allure ,主要是针对之前开发的一个接口项目来进行学习,通过 Python+Requests 来发送和处理HTTP协议的请求接口,使用 Pytest 作为测试执行器,使用 YAML 来管理测试数据,使用 Allure 来生成测试报告

一、项目说明

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

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

当然,如果感兴趣的话,还可以再对接口自动化进行Jenkins持续集成

GitHub项目源码地址:
https://github.com/wintests/pytestDemo

二、项目结构

api ====>> 接口封装层,如封装HTTP接口为Python接口

common ====>> 各种工具类
core ====>> requests请求方法封装、关键字返回结果类
config ====>> 配置文件
data ====>> 测试数据文件管理
operation ====>> 关键字封装层,如把多个Python接口封装为关键字
pytest.ini ====>> pytest配置文件
requirements.txt ====>> 相关依赖包文件
testcases ====>> 测试用例

三、请求方法封装

在 core/rest_client.py 文件中,对 Requests 库下一些常见的请求方法进行了简单封装,以便调用起来更加方便。

 
class RestClient():
 
    def __init__(self, api_root_url):
        self.api_root_url = api_root_url
        self.session = requests.session()
 
    def get(self, url, **kwargs):
        return self.request(url, "GET", **kwargs)
 
    def post(self, url, data=None, json=None, **kwargs):
        return self.request(url, "POST", data, json, **kwargs)
 
    def put(self, url, data=None, **kwargs):
        return self.request(url, "PUT", data, **kwargs)
 
    def delete(self, url, **kwargs):
        return self.request(url, "DELETE", **kwargs)
 
    def patch(self, url, data=None, **kwargs):
        return self.request(url, "PATCH", data, **kwargs)
 
    def request(self, url, method, data=None, json=None, **kwargs):
        url = self.api_root_url + url
        headers = dict(**kwargs).get("headers")
        params = dict(**kwargs).get("params")
        files = dict(**kwargs).get("params")
        cookies = dict(**kwargs).get("params")
        self.request_log(url, method, data, json, params, headers, files, cookies)
        if method == "GET":
            return self.session.get(url, **kwargs)
        if method == "POST":
            return requests.post(url, data, json, **kwargs)
        if method == "PUT":
            if json:
                # PUT 和 PATCH 中没有提供直接使用json参数的方法,因此需要用data来传入
                data = complexjson.dumps(json)
            return self.session.put(url, data, **kwargs)
        if method == "DELETE":
            return self.session.delete(url, **kwargs)
        if method == "PATCH":
            if json:
                data = complexjson.dumps(json)
            return self.session.patch(url, data, **kwargs)

四、HTTP接口 封装为 Python接口

在 api/user.py 文件中,将上面封装好的HTTP接口,再次封装为不同的Python接口。不同的Python接口,会处理不同URL下的请求。

class User(RestClient):
 
    def __init__(self, api_root_url, **kwargs):
        super(User, self).__init__(api_root_url, **kwargs)
 
    def list_all_users(self, **kwargs):
        return self.get("/users", **kwargs)
 
    def list_one_user(self, username, **kwargs):
        return self.get("/users/{}".format(username), **kwargs)
 
    def register(self, **kwargs):
        return self.post("/register", **kwargs)
 
    def login(self, **kwargs):
        return self.post("/login", **kwargs)
 
    def update(self, user_id, **kwargs):
        return self.put("/update/user/{}".format(user_id), **kwargs)
 
    def delete(self, name, **kwargs):
        return self.post("/delete/user/{}".format(name), **kwargs)

五、关键字返回结果类

在 core/result_base.py 下,定义了一个空类 ResultBase ,该类主要用于自定义关键字返回结果。

class ResultBase():
    pass
 
"""
自定义示例:
result = ResultBase()
result.success = False
result.msg = res.json()["msg"]
result.response = res
"""`

在多流程的业务场景测试下,通过自定义期望保存的返回数据值,以便更好的进行断言。

六、关键字封装

关键字应该是具有一定业务意义的,在封装关键字的时候,可以通过调用多个Python接口来完成。在某些情况下,比如测试一个充值接口的时候,在充值后可能需要调用查询接口得到最新账户余额,来判断查询结果与预期结果是否一致,那么可以这样来进行测试:

1, 首先,可以把 充值-查询 的操作封装为一个关键字,在这个关键字中依次调用充值和查询的接口,并可以自定义关键字的返回结果。
2, 接着,在编写测试用例的时候,直接调用关键字来进行测试,这时就可以拿到关键字返回的结果,那么断言的时候,就可以直接对关键字返回结果进行断言。

七、测试用例层

根据用例名分配测试数据

测试数据位于 data 文件夹下,在这里使用 YAML 来管理测试数据,同时要求测试数据中第一层的名称,需要与测试用例的方法名保持一致,如 test_get_all_user_info 、test_delete_user。

test_get_all_user_info:
  # 期望结果,期望返回码,期望返回信息
  # except_result, except_code, except_msg
  - [True, 0, "查询成功"]
省略
test_delete_user:
  # 删除的用户名,期望结果,期望返回码,期望返回信息
  # username, except_result, except_code, except_msg
  - ["测试test", True, 0, "删除用户信息成功"]
  - ["wintest3", False, 3006, "该用户不允许删除"]

这里借助 fixture 方法,我们就能够通过 request.function.__name__ 自动获取到当前执行用例的函数名 testcase_name ,当我们传入测试数据 api_data 之后,接着便可以使用 api_data.get(testcase_name) 来获取到对应用例的测试数据。

import pytest
from testcases.conftest import api_data
 
@pytest.fixture(scope="function")
def testcase_data(request):
    testcase_name = request.function.__name__
    return api_data.get(testcase_name)`

数据准备和清理

在接口自动化中,为了保证用例可稳定、重复地执行,我们还需要有测试前置操作和后置操作,即数据准备和数据清理工作。

@pytest.fixture(scope="function")
def delete_register_user():
    """注册用户前,先删除数据,用例执行之后,再次删除以清理数据"""
    del_sql = base_data["init_sql"]["delete_register_user"]
    db.execute_db(del_sql)
    logger.info("注册用户操作:清理用户--准备注册新用户")
    logger.info("执行前置SQL:{}".format(del_sql))
    yield # 用于唤醒 teardown 操作
    db.execute_db(del_sql)
    logger.info("注册用户操作:删除注册的用户")
    logger.info("执行后置SQL:{}".format(del_sql))

在这里,以用户注册用例为例。对于前置操作,我们应该准备一条删除SQL,用于将数据库中已存在的相同用户删除,对于后置操作,我们应该再执行删除SQL,确保该测试数据正常完成清理工作。

在测试用例中,我们只需要在用例上传入 fixture 的函数参数名 delete_register_user ,这样就可以调用 fixture 实现测试前置及后置操作。当然,也可以使用pytest装饰器 @pytest.mark.usefixtures() 来完成,如:

@pytest.mark.usefixtures("delete_register_user")` 

Allure用例描述

在这里,我们结合 Allure 来实现输出测试报告,同时我们可以使用其装饰器来添加一些用例描述并显示到测试报告中,以便报告内容更加清晰、直观、可读。如使用 @allure.title() 自定义报告中显示的用例标题,使用 @allure.description() 自定义用例的描述内容,使用 @allure.step() 可在报告中显示操作步骤,使用 @allure.issue() 可在报告中显示缺陷及其链接等。

@allure.step("步骤1 ==>> 注册用户")
def step_1(username, password, telephone, sex, address):
    logger.info("步骤1 ==>> 注册用户 ==>> {}, {}, {}, {}, {}".format(username, password, telephone, sex, address))
 
@allure.severity(allure.severity_level.NORMAL)
@allure.epic("针对单个接口的测试")
@allure.feature("用户注册模块")
class TestUserRegister():
    """用户注册"""
    @allure.story("用例--注册用户信息")
    @allure.description("该用例是针对获取用户注册接口的测试")
    @allure.issue("https://www.cnblogs.com/wintest", name="点击,跳转到对应BUG的链接地址")
    @allure.testcase("https://www.cnblogs.com/wintest", name="点击,跳转到对应用例的链接地址")
    @allure.title(
        "测试数据:【 {username},{password},{telephone},{sex},{address},{except_result},{except_code},{except_msg}】")
    @pytest.mark.single
    @pytest.mark.parametrize("username, password, telephone, sex, address, except_result, except_code, except_msg",
                             api_data["test_register_user"])
    @pytest.mark.usefixtures("delete_register_user")
    def test_delete_user(self, login_fixture, username, except_result, except_code, except_msg):
省略

七、项目部署

首先,下载项目源码后,在根目录下找到 requirements.txt 文件,然后通过 pip 工具安装 requirements.txt 依赖,执行命令:

pip3 install -r requirements.txt` 

接着,修改 config/setting.ini 配置文件,在Windows环境下,安装相应依赖之后,在命令行窗口执行命令:

pytest

注意:因为我这里是针对自己的接口项目进行测试,如果想直接执行我的测试用例来查看效果,需要提前部署上面提到的接口项目。

八、测试报告效果展示

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

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

最终,可以看到测试报告的效果图如下:

最后感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:

在这里插入图片描述

这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!   

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python+Requests+Pytest+YAML+Allure实现接口自动化 的相关文章

  • sklearn DeprecationWarning 数组的真值

    从文档中运行 rasa core 示例 python3 m rasa core run d models dialogue u models nlu default current 并在对话框中的每条消息后获取此错误输出 sklearn D
  • Django:将博客条目查看次数增加一。这有效率吗?

    我的索引视图中有以下代码 latest entry list Entry objects filter is published True order by date published 10 for entry in latest ent
  • 如何测试使用 XCom 的 Apache Airflow 任务

    我正在尝试找出一种测试 DAG 的方法 其中有几个任务使用 XCom 进行通信 由于控制台命令只允许我从 DAG 运行任务 有没有一种方法可以测试通信而无需通过 UI 运行 DAG Thanks 这是一种对我有用的方法 尽管 Airflow
  • 重新索引错误没有意义

    I have DataFrames大小在 100k 到 2m 之间 我正在处理这个问题的框架是如此之大 但请注意 我必须对其他框架执行相同的操作 gt gt gt len data 357451 现在这个文件是通过编译许多文件创建的 所以它
  • Python sqlite3参数化删除表

    我在 python 中删除 sqlite3 表时遇到问题 我正在使用标准sqlite3模块 self conn sqlite3 connect sql drop table self conn execute sql u table nam
  • Python grpc protobuf 存根生成问题:--grpc_out: protoc-gen-grpc: 插件失败,状态代码 1

    正如问题所说 我从源代码编译了 grpc 并且也做了sudo pip install grpcio 但是 那which grpc python plugin不返回任何内容 这是一个问题 因为route guide的grpc python示例
  • Spyder 导入模块出错

    我正在尝试在 Spyder 中使用 sklearn 一开始 当我尝试导入它时 我收到 ImportError No module named sklearn 然后我用 PYTHONPATH 管理器设置 PATH 然后使用工具菜单中的 更新模
  • 检测/删除 Python 2 + GTK 中不成对的代理字符

    在Python 2 7中我可以成功转换Unicode字符串 abc udc34xyz 转换为 UTF 8 结果是 abc xed xb0 xb4xyz 但是当我将 UTF 8 字符串传递给例如时 pango parse markup or
  • 在 vim 折叠线中语法高亮 Python

    我发现代码折叠 http en wikipedia org wiki Code folding帮助我更好地组织我的文件 因此 在我的底部 vimrc 我启用vim代码折叠 http vimdoc sourceforge net htmldo
  • Flask 中的 import 和 extends 有什么区别?

    我正在阅读 Flask Web 开发 在例4 3中 extends base html import bootstrap wtf html as wtf 我想知道 extends 和 import 有什么区别 我认为它们在用法上很相似 在什
  • 使用 python 只读取 Excel 中的可见行

    我想只读取 python 中 Excel 工作表中的可见行 输入 Excel表 所以当我过滤时 作为 python 中的输出 在本例中我将仅获得可见数据 1 行 这是我的代码 from openpyxl import load workbo
  • pandas to_sql sqlalchemy 与 secure_transport 的连接

    我正在尝试将数据发送到具有 require secure transport ON 的服务器上的 mysql 数据库 当我尝试使用以下代码连接到它时 import pandas as pd import pymysql from sqlal
  • 如何绘制多类分类器的精度和召回率?

    我正在使用 scikit learn 我想绘制精度和召回曲线 我正在使用的分类器是RandomForestClassifier scikit learn 文档中的所有资源都使用二元分类 另外 我可以绘制多类的 ROC 曲线吗 另外 我只找到
  • PyCharm - 如何挂起所有线程

    我们使用 PyCharm 5 0 1 进行多线程调试 当它在断点处停止时 只有特定线程停止 而所有其他线程继续 这使得 冻结时刻 和检查参数值以及其他线程的当前状态变得困难 当其中一个线程在断点处停止时 是否可以挂起所有线程 这在最新的 P
  • 如何测试列表中多个值的成员资格

    我想测试两个或多个值是否在列表中具有成员资格 但我得到了意外的结果 gt gt gt a b in b a foo bar a True 那么 Python 可以同时测试列表中多个值的成员资格吗 这个结果意味着什么 See also How
  • 如何使用 pygame.mixer 重复音乐?

    我创建了以下使用 pygame mixer 播放 mp3 音乐的代码 然而 音乐不会重复 有什么想法可以让音乐重复播放吗 这是代码 playlist list playlist append put music here mp3 playl
  • Pip 突然使用了错误版本的 Python

    在 os x 上使用 pip 时遇到一个奇怪的问题 据我所知 快速查看我的 bash history 似乎可以确认 我最近没有对我的配置进行任何更改 唉 pip 命令似乎突然使用了与以前不同的 python 版本 到目前为止 我使用命令 p
  • Matplotlib 中的 TwoSlopeNorm 未按预期工作

    我正在尝试创建一个具有发散颜色图的绘图 该颜色图在零附近不对称 In this https stackoverflow com a 20146989 6288682例如 DivergingNorm函数被使用并产生我想要的 然而 我使用的是更
  • VSCode无法切换matplotlib后端:ImportError:无法加载需要“qt5”交互框架的后端“Qt5Agg”

    我只想通过在 VSCode 中运行 Python 来进行绘图 但结果失败了 我无法将后端从 agg 切换到 Qt5Agg 但是 我可以在 VSCode 的终端中轻松执行此操作 VSCode集成终端中的问题如下所示 我尝试了各种解决方案但失败
  • 在至少 7 天内连续三天登录该产品的用户

    我有一个用于用户参与的数据框 df 如下所示 time stamp user id 2013 01 01 10 05 23 1 2013 01 03 16 35 23 1 2013 01 06 11 06 35 1 2013 01 10 1

随机推荐

  • HTTP的8种请求方法和用途

    一 什么是HTTP 超文本传输协议 Hyper Text Transfer Protocol HTTP 是一个简单的请求 响应协议 它通 常运行在TCP之上 它指定了客户端可能发送给服务器什么样的消息以及得到什么样的响应 请求 和响应消息的
  • 2023.8.31题目小记

    1 费解的开关 1208 翻硬币 AcWing题库 1 使用位进制优化 2 由于第一行如果已经确定下来则后面的每一行都可以确定 可以将第一行的所有方法全部记录下来PS 32的二进制为100000一共六位 而此就已经可以使用位运算将五位开关全
  • 哪些数组操作会影响vue视图的更新?改变数组本身的方法有哪些?附面试题1

    多选题 在vue中 下列哪些选项对数组的操作触发视图更新 A push B shift C concat D reverse 先独立思考 正确答案 A B D 解析 c选项 concat 返回的是一个新的数组 需要用新数组替换原数组才能实现
  • 乐高选择亚马逊云科技 为客户创造卓越体验

    近日 亚马逊云科技宣布 全球知名玩具制造商乐高集团 the LEGO Group 选择亚马逊云科技作为首选云服务提供商 加速推进数字化战略 打造充满创意 乐趣和互动性的玩乐新体验 基于亚马逊云科技全球一致的基础设施 以及计算 存储 数据库
  • Win7上搭建Linux环境

    自制编程语言的环境搭建 一 C编译器 Windows环境下使用MinGW Minimalist GNU for Windows 安装完成后可以在Windows的命令行窗口中进行测试 并编译C语言代码 下载地址 点击下载 解压安装 并记录下安
  • 数码管循环显示数字

    文章目录 一 前言 二 芯片使用 1 74hc245 2 74ls138译码器 三 硬件连接 四 软件代码 五 效果展示 六 代码链接 一 前言 数码管进行显示成功后 可根据自己的想法进行改进 本设计采用八位数码管进行循环显示0 f 其中涉
  • Jenkins配置Git构建SpringBoot项目

    目录 介绍 环境变量配置 配置jdk 配置git 配置maven 下载jenkins brew下载 war包下载 配置jenkins 配置环境 Jenkins从Git拉取代码构建SpringBoot项目 项目配置 General 源码管理
  • 500 Internal Server Error 原因及解决方案

    服务迁移之后接口响应变慢 而且还有报错 500 Internal Server Error 端上请求报错日志 原因初步分析 数据包比较大的时候 比如参数多 大的对象 或者图片base64等格式之间往服务端发送请求时 1 前后端服务连接超时
  • memset和memcpy函数

    memset函数 原型 void memset void s int ch size t n 作用 将s所指向的内存中的前n个字节的内容全部设置为ch指定的ASCII值 这个函数通常为新申请的内存做初始化工作 一般用于结构体和数组的初始化
  • 如何用eachart来做一个全国地图撒点的效果

  • Thinkphp5.1开发钉钉应用:企业免登陆_移动端demo

    config gt base php
  • Python的应用场景及优越性能

    你是否正在寻找一种能够在各种应用场景中广泛应用的编程语言 你是否希望能够使用一种易学易用 功能丰富 生态系统完善的语言进行开发工作 那么 Python就是你的不二选择 Python已成为广大开发者和企业的首选编程语言之一 其在各个领域的应用
  • Android下拉刷新完全解析,教你如何一分钟实现下拉刷新功能

    转载请注明出处 http blog csdn net guolin blog article details 9255575 最近项目中需要用到ListView下拉刷新的功能 一开始想图省事 在网上直接找一个现成的 可是尝试了网上多个版本的
  • 我第一次面试自动化测试就被diss了,人生惨遭滑铁卢…

    如果你恰好刚刚进入一家新公司 领导一上来就让你开展自动化测试 作为一名初出茅庐的测试新人 除了手足无措 你只能默默慨叹自己能力尚欠 眼前只会出现一个又一个无从下手的问题 作为手工测试 如何营造机会和环境解决我们自身提升的瓶颈 好慌 以为自己
  • 广州面试题------万欣科技

    部分答案 4 Unchecked Exception 指得是程序的逻辑错误 程序的疵瑕 并且运行的时候无法恢复 包括Error以及RuntimeException及其子类 如 OutOfMemoryError Checked Excepti
  • 【计算机毕业设计】基于微信小程序的校园生活服务系统 校园生活微信小程序

    毕设帮助 技术解答 源码交流 联系方式见文末 一 系统概述 智慧校园建设近年来发展迅猛 校园生活也是社会生活的一部分 完善校园生活线上产品是便利师生生活的必然趋势 高校也积极上线各类信息化系统代替原本的人工操作 目前很多高等院校的智慧校园系
  • 十四Spark ALS协同过滤java

    API http spark apache org docs 1 6 2 api java index html 机器学习里面包含两个包 org apache spark ml 输入是dataframe sql org apache spa
  • VRF技术

    VRF技术白皮书 1 原理简介 近年来网络VPN技术方兴未艾 日益成为业界关注的焦点 根据VPN实现的技术特点 可以把VPN技术分为以下三类 传统VPN FR和ATM CPE based VPN L2TP和IPSec等 Provider P
  • Unity如何判断对象是否已被Destroy

    熟悉了cocos语法的都知道cc isValid这个api可以判断节点 组件是否可用 是否已被销毁 而Unity中却没有这样的API 往往使用 null来进行判断 那么 null到底如何来判断呢 Part 1 public int numT
  • Python+Requests+Pytest+YAML+Allure实现接口自动化

    本项目实现接口自动化的技术选型 Python Requests Pytest YAML Allure 主要是针对之前开发的一个接口项目来进行学习 通过 Python Requests 来发送和处理HTTP协议的请求接口 使用 Pytest