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

目录:导读

    • 前言
    • 一、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.mfbz.cn/a/43793.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

vue2项目迁移到vue3中的改动——基础积累

最近在跟着大神学习vue3的内容,发现之前vue2写的代码可以直接照搬到vue3中,但是有一些需要改动的内容,下面做一下记录。 1.定义对象时,需要指定每个属性值 例如:listQuery:{} 如果使用:listQuery.Filter…

chrome查看浏览器内核日志

由于经常在网页上调试播放音视频,但是总遇到一些未知原因,导致无法正常播放,亟需查看浏览器内核日志,分析原因,做一下笔记。 (1) 查看浏览器快捷键属性 (2)在快捷键启动位置补充参数 --enable-…

LabVIEW可重入VI,VI模板和动态VI之间的差异

LabVIEW可重入VI,VI模板和动态VI之间的差异 应该在何时使用可重入VI、模板VI和动态调用VI?这三种类型之间有什么区别? 可重入VI 当想要同时运行同一VI的多个实例时,将使用可重入VI。当VI不可重入时,VI只有一个数据空…

opencv对相机进行畸变矫正,及从矫正后的图像坐标反求原来的对应坐标

1.背景 目前有个项目,需要用到热成像相机。但是这个热成像相机它的畸变比较厉害,因此需要用标定板进行标定,从而消除镜头畸变。 同时需要实现用户用鼠标点击矫正后的画面后,显示用户点击位置的像素所代表的温度。 2.难点 消除镜…

11 spring-boot的MVC配置原理

11.1 spring-boot为MVC提供的自动配置 1.ContentNegotiatingViewResolver视图解析器; 2.静态资源或者支持WebJars; 3.自动注册类型转换器:比如说前台提交user的字段,后台自动封装的意思; 4.HttpMessageConverters&…

「苹果安卓」手机搜狗输入法怎么调整字体大小及键盘高度?

手机搜狗输入法怎么调整字体大小及键盘高度? 1、在手机上准备输入文字,调起使用的搜狗输入法手机键盘; 2、点击搜狗输入法键盘左侧的图标,进入更多功能管理; 3、在搜狗输入法更多功能管理内找到定制工具栏&#xff0c…

100天精通Golang(基础入门篇)——第17天:深入解析Go语言中的指针

🌷 博主 libin9iOak带您 Go to Golang Language.✨ 🦄 个人主页——libin9iOak的博客🎐 🐳 《面试题大全》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~🌺 🌊 《I…

【MySQL】数据库基础

目录 一、什么是数据库 二、主流数据库 三、基本使用 3.1MySQL安装 3.2连接服务器 3.3服务器管理 3.4服务器,数据库,表关系 3.5使用案例 3.6数据逻辑存储 四、MySQL架构 五、SQL分类 六、存储引擎 6.1存储引擎 6.2查看存储引擎 6.3 存储引…

数学随想:轻量级算法服务。

数学随想:轻量级算法服务TOC 通常认为,数列是算法服务的基础。但是,真正用于算法服务的数列只有几个众所周知的基础数列。虽然对于不同的任务可以选择使用数列的一段用于服务,但是数列的使用还是复杂而繁重的。特别是在计算应用日…

Github上方导航栏介绍

Code Watch:相当于关注,到时候这个项目又有什么操作,就会以通知的形式提醒你。 Fork:也就是把这个项目拉到你的仓库里,之后你可以对该代码进行修改,之后你可以发起Pull Request,简称PR&#xf…

《数据分析-JiMuReport08》JiMuReport报表开发-报表列数量开发限制调整

JiMuReport报表开发列数量限制调整 1.开发列数限制 JiMuReport报表在开发的时候,需要100-200列的数据,但是在设计到一定数量的时候,水平下拉框就不能滑动了 2.报表参数调整 col: n 在application.yml文件的jmreport配置处,如果想…

【指针和数组笔试题(2)】详解指针、数组笔试题

文章目录 前言第一组题第二组题第三组题二维数组&#xff08;难点&#xff09;总结 前言 来到第二章&#xff0c;继续学习指针和数组笔试题 第一组题 #include<stdio.h> int main() {char arr[] "abcdef";//里面的放的是[a b c d e f \0]printf("%d\n&…

LeetCode45.Jump-Game-II<跳跃游戏II>

题目&#xff1a; 思路&#xff1a; 从上次大神那里获得的灵感 这题问的是次数,那么我们需要确保 1,能否跳到终点 2,得到次数. 第一次条获得的是nums[0],那么第一个数就是我们第一次能跳跃的范围.每次在范围里获得最大值.并且次数加一.然后进入下一次范围;即可得到次数; 代码…

Redis源码篇 - inset数据结构

inset是Redis中set类型的一种底层存储结构&#xff08;编码&#xff09;&#xff0c;它是基于整数数组来实现的&#xff0c;用于存储数值类型set集合数据&#xff0c;并具备长度可变、有序等特征。 有序性 为了方便查找&#xff0c;Redis会将intset中整数数据按照从小到大的顺…

电商系统架构设计系列(六):电商的「账户系统」设计要特别考虑哪些问题?

上篇文章中&#xff0c;我给你留了一个思考题&#xff1a;电商的账户系统&#xff0c;该如何设计&#xff1f; 今天这篇文章&#xff0c;我们来说一下电商的账户系统。 引言 账户系统负责记录和管理用户账户的余额&#xff0c;这个余额就是每个用户临时存在电商的钱&#xff…

Jenkins从配置到实战(二) - Jenkins如何在多台机器上自动化构建

前言 jenkins除了支持在本机上进行项目构建&#xff0c;还可以将构建任务分发到其他远程服务器上去执行&#xff0c;可以实现在不同平台和架构的机器上来完成项目的自动化构建任务&#xff0c;也能减轻jenkins服务器的压力。本文章就主要介绍下此流程。 准备工作 准备两台机…

LeetCode[剑指Offer51]数组中的逆序对

难度&#xff1a;Hard 题目&#xff1a; 在数组中的两个数字&#xff0c;如果前面一个数字大于后面的数字&#xff0c;则这两个数字组成一个逆序对。输入一个数组&#xff0c;求出这个数组中的逆序对的总数。 示例 1: 输入: [7,5,6,4] 输出: 5 限制&#xff1a; 0 < 数组…

Unity进阶--声音管理器学习笔记

文章目录 声音管理器 using System.Collections; using System.Collections.Generic; using UnityEngine;public class AudioManager : MyrSingletonBase<AudioManager> {//环境音private AudioSource enPlayer;//音效private AudioSource sePlayer;//音乐private Audio…

欧姆龙CX系列PLC串口转以太网欧姆龙cp1hplc以太网连接电脑

你是否还在为工厂设备信息采集困难而烦恼&#xff1f;捷米特JM-ETH-CX转以太网通讯处理器为你解决这个问题&#xff01; 捷米特JM-ETH-CX转以太网通讯处理器专门为满足工厂设备信息化需求而设计&#xff0c;可以用于欧姆龙多个系列PLC的太网数据采集&#xff0c;非常方便构建生…

Centos7:Flask-Apache部署

系列文章目录 RHCE第0章&#xff1a;RHCE开始前的准备 RHCE第1章&#xff1a;Web服务器&#xff08;上&#xff09; RHCE第1章&#xff1a;Web服务器&#xff08;下&#xff09; RHCE第2章&#xff1a;DNS服务 RHCE第3章&#xff1a;DHCP服务器 RHCE第4章&#xff1a;Firewall…
最新文章