接口自动化测试-Python+Requests+Pytest+YAML+Allure配套撸码(详细)

news2025/1/8 13:50:34

目录:导读

    • 前言
    • 一、Python编程入门到精通
    • 二、接口自动化项目实战
    • 三、Web自动化项目实战
    • 四、App自动化项目实战
    • 五、一线大厂简历
    • 六、测试开发DevOps体系
    • 七、常用自动化测试工具
    • 八、JMeter性能测试
    • 九、总结(尾部小惊喜)


前言

接口自动化框架:Python+Requests+Pytest+YAML+Allure

通过 Python+Requests 来发送和处理HTTP协议的请求接口,使用 Pytest 作为测试执行器,使用 YAML 来管理测试数据,使用 Allure 来生成测试报告。

框架结构

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、接着,在编写测试用例的时候,直接调用关键字来进行测试,这时就可以拿到关键字返回的结果,那么断言的时候,就可以直接对关键字返回结果进行断言。

测试用例层

1、根据用例名分配测试数据
测试数据位于 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)`

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

@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")` 

3、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):

测试报告效果展示

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

# 需要提前配置allure环境,才可以直接使用命令行
allure serve ./report`
下面是我整理的2023年最全的软件测试工程师学习知识架构体系图

一、Python编程入门到精通

请添加图片描述

二、接口自动化项目实战

请添加图片描述

三、Web自动化项目实战

请添加图片描述

四、App自动化项目实战

请添加图片描述

五、一线大厂简历

请添加图片描述

六、测试开发DevOps体系

请添加图片描述

七、常用自动化测试工具

请添加图片描述

八、JMeter性能测试

请添加图片描述

九、总结(尾部小惊喜)

在追逐梦想的路上,不要畏惧困难与挫折,坚持不懈地奋斗,只有拼搏,才能超越自我,创造属于自己的辉煌。相信自己的能力,勇往直前,每一次努力都是一次进步,每一次奋斗都是一次成长。

不论前路多么艰难,只要你心怀梦想,勇往直前,坚持不懈地奋斗,就能超越自我,创造属于自己的辉煌。相信自己的能力,勇敢追求,每一次努力都是一次进步,每一次奋斗都是一次蜕变。

每个人都有属于自己的光芒,只要努力奋斗,勇敢面对困难,坚持追求,就能绽放璀璨,实现梦想,让生命在奋斗中闪耀出绚丽的色彩。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/787596.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

软件测试/测试开发丨Pytest测试框架学习笔记

Pytest 参数化用例 测试登录场景 测试登录成功,登录失败(账号错误,密码错误)*创建多种账号: 中⽂文账号,英⽂文账号*普通测试用例方法Copy 多份代码 or 读⼊入参数?*一次性执⾏多个输⼊入参数* def test_param_login_ok():# 登录成功user…

解决分类任务中数据倾斜问题

大家好,在处理文本分类任务时,基准测试流行的自然语言处理架构的性能是建立对可用选项的理解的重要步骤。在这里,本文将深入探讨与分类相关的最常见的挑战之一——数据倾斜。如果你曾经将机器学习(ML)应用于真实世界的…

selenium---滑动框验证码破解

前言 目前常见的验证码有很多种,比如数字验证码,滑动验证码,以及滑动补全图像验证码等,关于验证码的操作属于我们在UI自动化很大的一个障碍,今天安静来介绍下如何通过python来实现我们滑动验证码 滑动验证码 先来一…

MySQL之全文索引二三事

全文索引 MySQL全文索引是一种用于快速搜索文本字符串的索引,在MySQL数据库中,它可以用来提高文本搜索的效率。全文索引不同于普通索引,普通索引只是对列值进行排序,而全文索引则会对列的内容进行分词,并且对每个分词…

RocketMQ重复消费的解决方案::分布式锁直击面试!

文章目录 场景分析方法的幂等分布式锁Redis实现分布式锁抢锁的设计思路 分布式锁案例 直击面试rocketmq什么时候重复消费消息丢失的问题消息在哪里丢失发送端确保发送成功并且配合失败的业务处理消费端确保消息不丢失rocketmq 主从同步刷盘 场景分析 分布式系统架构中,队列是分…

go-zero学习 第六章 分布式事务dtm

go-zero学习 第六章 分布式事务dtm 1 参考文档2 官方示例3 go-zero使用dtm参考代码3.1 go-zero支持dtm 代码操作步骤※3.2 gozerodtm 代码操作步骤 4 注意事项4.1 grpc接口地址※4.2 动态调用过程4.3 dtm的回滚补偿4.4 barrier的空补偿、悬挂等4.5 barrier在rpc中本地事务 1 参…

多媒体工作中用到的小工具

安利下嵌入式多媒体用到的各种小工具 下面是同事们推荐的 以下是对这些软件的简要介绍: ocenaudio:ocenaudio是一款跨平台的音频编辑软件,它提供了直观的界面和丰富的功能,可以帮助用户进行音频剪辑、修复、转码等操作。 MKVToolNix:MKVToolNix是一款开源的多媒体容器格…

web-vim信息泄露

(1)知识补充 vim 交换文件名 在使用vim时会创建临时缓存文件,关闭vim时缓存文件则会被删除,当vim异常退出后,因为未处理缓存文件,导致可以通过缓存文件恢复原始文件内容   以 index.php 为例&#xff1…

Redis一主二从三哨兵模式

文章目录 Redis一主二从三哨兵模式环境配置实践配置主从配置哨兵模式 测试主从复制测试模拟master宕机恢复master Redis一主二从三哨兵模式 当你使用Redis作为主从复制的架构,并且希望在出现主节点故障时自动进行故障转移时,适用于一主而从三哨兵模式。…

android 面试题目之handler消息机制

Handler消息机制是Android里面很基础的东西,基本上属于必考题 一般会从如下几个方面来考查 实现原理,Handler/Message/MessageQueue/Looper 几个类的实现流程,Handler导致的内存泄露怎么处理主线程的Looper是什么时候创建的;如果…

3. Spring 更简单的读取和存储对象(五大类注解 方法注解)

目录 1. 存储 Bean 对象 1.1 配置扫描路径 1.2 添加注解存储 Bean 对象 1.2.1 Controller(控制器存储) 1.2.2 Service(服务存储) 1.2.3 Repository(仓库存储) 1.2.4 Component(组件存储&…

C语言学习笔记 Ubuntu系统下部署gcc编译工具-01

在22.04版本 ubuntu系统下: 1.进行apt工具包更新 sudo apt-get update 2.安装gcc工具 sudo apt-get install -y gcc 3.创建一下文件,并编译它输出相应的内容 touch hello.c 4.使用gcc编译c源程序并运行 格式:gcc 源文件名 -o 生成的执行文…

AcWing 1210. 连号区间数

输入样例1: 4 3 2 4 1输出样例1: 7输入样例2: 5 3 4 2 5 1输出样例2: 9样例解释 第一个用例中,有 77 个连号区间分别是:[1,1],[1,2],[1,3],[1,4],[2,2],[3,3],[4,4][1,1],[1,2],[1,3],[1,4],[2,2],[3,3…

记一次vscode配置CMake编译task的坑

事情经过是这样的,博主在一个项目中需要使用交叉编译链进行项目编译,但是在CMake中有一个自定义的编译选项,在vscode中配置task任务后,编译发现终端报静态库.a文件格式错误,如下图所示: 但是如果在CMakeLis…

python与深度学习(七):CNN和fashion_mnist

目录 1. 说明2. fashion_mnist实战2.1 导入相关库2.2 加载数据2.3 数据预处理2.4 数据处理2.5 构建网络模型2.6 模型编译2.7 模型训练2.8 模型保存2.9 模型评价2.10 模型测试2.11 模型训练结果的可视化 3. fashion_mnist的CNN模型可视化结果图4. 完整代码 1. 说明 本篇文章是C…

Install the Chinese input method on Linux

Open terminal and input: sudo -i apt install fcitx fcitx-googlepinyinWait for it to finish. Search fcitx: "设置"-->"输入法": Finally, we get the following result: Ctrl Space:Switch the input method. The test …

Redis追本溯源(三)内核:线程模型、网络IO模型、过期策略与淘汰机制、持久化

文章目录 一、Redis线程模型演化1.Redis4.0之前2.Redis4.0之后单线程、多线程对比3.redis 6.0之后 二、Redis的网络IO模型1.基于事件驱动的Reactor模型2.什么是事件驱动,事件驱动的Reactor模型和Java中的AIO有什么区别3.异步非阻塞底层实现原理 三、Redis过期策略1.…

印刷和数字设计的页面布局软件 QuarkXPress 2023 Crack

QuarkXPress 2023 用于印刷 和数字设计的页面布局软件,使用 QuarkXPress 释放您的创造力并最大限度地提高生产力 图形设计和桌面出版流程早就应该进行创新和颠覆,所以 QuarkXPress 就来了。自 1987 年首次亮相市场以来,成千上万的创意专业人士…

RocketMQ教程-(5)-功能特性-事务消息

事务消息为 Apache RocketMQ 中的高级特性消息,本文为您介绍事务消息的应用场景、功能原理、使用限制、使用方法和使用建议。 事务消息为 Apache RocketMQ 中的高级特性消息,本文为您介绍事务消息的应用场景、功能原理、使用限制、使用方法和使用建议。…

FFmpeg AVFilter的原理(三)- filter是如何被驱动的

1、下面是一个avfilter的graph 上图是ffmpeg中doc/examples中filtering_video.c案例的示意图。 本章节主要查看avfilter中的数据是怎么进入的,然后又是怎么出来的。 主要考察两个函数: av_buffersrc_add_frame_flags()av_buffers…