pytest+yaml实现接口自动化框架

news2024/11/25 23:29:47

目录

前言

项目结构设计

yaml格式的用例

运行用例

总结:


前言

httprunner 用 yaml 文件实现接口自动化框架很好用,最近在看 pytest 框架,于是参考 httprunner的用例格式,写了一个差不多的 pytest 版的简易框架

项目结构设计

项目结构完全符合 pytest 的项目结构,pytest 是查找 test_.py 文件,我这里是查找 test_.yml 文件,唯一不同的就是这个地方
以前写test_*.py 的测试用例,现在完全不用写了,全部写yaml 文件就行,项目结构参考

只需在 conftest.py 即可实现,代码量超级少
pytest 7.x最新版

def pytest_collect_file(parent, file_path):
    # 获取文件.yml 文件,匹配规则
    if file_path.suffix == ".yml" and file_path.name.startswith("test"):
        return YamlFile.from_parent(parent, path=file_path)

pytest 5.x以上版本

import pytest
import requests


def pytest_collect_file(parent, path):
    # 获取文件.yml 文件,匹配规则
    if path.ext == ".yml" and path.basename.startswith("test"):
        # print(path)
        # print(parent)
        # return YamlFile(path, parent)
        return YamlFile.from_parent(parent, fspath=path)


class YamlFile(pytest.File):
    # 读取文件内容
    def collect(self):
        import yaml
        raw = yaml.safe_load(self.fspath.open(encoding='utf-8'))
        for yaml_case in raw:
            name = yaml_case["test"]["name"]
            values = yaml_case["test"]
            yield YamlTest.from_parent(self, name=name, values=values)

class YamlTest(pytest.Item):
    def __init__(self, name, parent, values):
        super(YamlTest, self).__init__(name, parent)
        self.name = name
        self.values = values
        self.request = self.values.get("request")
        self.validate = self.values.get("validate")
        self.s = requests.session()

    def runtest(self):
        # 运行用例
        request_data = self.values["request"]
        # print(request_data)
        response = self.s.request(**request_data)
        print("\n", response.text)
        # 断言
        self.assert_response(response, self.validate)

    def assert_response(self, response, validate):
        '''设置断言'''
        import jsonpath
        for i in validate:
            if "eq" in i.keys():
                yaml_result = i.get("eq")[0]
                actual_result = jsonpath.jsonpath(response.json(), yaml_result)
                expect_result = i.get("eq")[1]
                print("实际结果:%s" % actual_result)
                print("期望结果:%s" % expect_result)
                assert actual_result[0] == expect_result

pytest 4.x 以下版本

import pytest
import requests
# 作者-上海悠悠 QQ交流群:717225969
# blog地址 https://www.cnblogs.com/yoyoketang/


def pytest_collect_file(parent, path):
    # 获取文件.yml 文件,匹配规则
    if path.ext == ".yml" and path.basename.startswith("test"):
        # print(path)
        # print(parent)
        return YamlFile(path, parent)



class YamlFile(pytest.File):
    # 读取文件内容
    def collect(self):
        import yaml
        raw = yaml.safe_load(self.fspath.open(encoding='utf-8'))
        for yaml_case in raw:
            name = yaml_case["test"]["name"]
            values = yaml_case["test"]
            yield YamlTest(name, self, values)


class YamlTest(pytest.Item):
    def __init__(self, name, parent, values):
        super(YamlTest, self).__init__(name, parent)
        self.name = name
        self.values = values
        self.request = self.values.get("request")
        self.validate = self.values.get("validate")
        self.s = requests.session()

    def runtest(self):
        # 运行用例
        request_data = self.values["request"]
        # print(request_data)
        response = self.s.request(**request_data)
        print("\n", response.text)
        # 断言
        self.assert_response(response, self.validate)

    def assert_response(self, response, validate):
        '''设置断言'''
        import jsonpath
        for i in validate:
            if "eq" in i.keys():
                yaml_result = i.get("eq")[0]
                actual_result = jsonpath.jsonpath(response.json(), yaml_result)
                expect_result = i.get("eq")[1]
                print("实际结果:%s" % actual_result)
                print("期望结果:%s" % expect_result)
                assert actual_result[0] == expect_result

断言这部分,目前只写了判断相等,仅供参考,支持jsonpath来提取json数据

yaml格式的用例

在项目的任意目录,只要是符合test_开头的yml文件,我们就认为是测试用例
test_login.yml的内容如下

- test:
    name: login case1
    request:
        url: http://49.235.x.x:7000/api/v1/login/
        method: POST
        headers:
            Content-Type: application/json
            User-Agent: python-requests/2.18.4
        json:
            username: test
            password: 123456
    validate:
        - eq: [$.msg, login success!]
        - eq: [$.code, 0]


- test:
    name: login case2
    request:
        url: 49.235.x.x:7000/api/v1/login/
        method: POST
        headers:
            Content-Type: application/json
            User-Agent: python-requests/2.18.4
        json:
            username: test
            password: 123456
    validate:
        - eq: [$.msg, login success!]
        - eq: [$.code, 0]

YAML 复制 全屏

运行用例

运行用例,完全符合pytest的只需用例风格,支持allure报告

pytest -v

D:\soft\api_pytest_1208>pytest -v
====================== test session starts ======================
platform win32 -- Python 3.6.6, pytest-4.5.0, py-1.9.0,
cachedir: .pytest_cache
rootdir: D:\soft\api_pytest_1208
plugins: allure-pytest-2.8.6
collected 4 items

data/test_login.yml::login case1 PASSED                    [ 25%]
data/test_login.yml::login case2 PASSED                    [ 50%]
data/test_login1.yml::login case1 PASSED                   [ 75%]
data/test_login1.yml::login case2 PASSED                   [100%]

=================== 4 passed in 1.34 seconds ====================

allure报告

pytest --alluredir ./report

目前是把 yaml 文件下每个 test 当一个用例执行,后续还可以加上提取参数,参数关联更高级的功能!

 

总结:

感谢每一个认真阅读我文章的人!!!

 我个人整理了我这几年软件测试生涯整理的一些技术资料,包含:电子书,简历模块,各种工作模板,面试宝典,自学项目等。欢迎大家点击下方名片免费领取,千万不要错过哦。

   Python自动化测试学习交流群:全套自动化测试面试简历学习资料获取点击链接加入群聊【python自动化测试交流】:http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=DhOSZDNS-qzT5QKbFQMsfJ7DsrFfKpOF&authKey=eBt%2BF%2FBK81lVLcsLKaFqnvDAVA8IdNsGC7J0YV73w8V%2FJpdbby66r7vJ1rsPIifg&noverify=0&group_code=198408628

 

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

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

相关文章

【PowerDesigner】数据库建模工具记录

导入格式 最终效果 执行语句 工具(tool) -> 其他记录 执行脚本 快捷键:CtrlShiftX 工具(tool) -》Execute Commands -》 Edit/Run Script 导入脚本 快捷键:Ctrl R 数据库-》Update Model from Database 显示首选项 ODBC 数据源管理程序 Powerd…

Istio 流量管理 serviceEntry 出口流量管理

无论是vs还是dr这些都是入口的流量。对于pod来说也会有出去的流量的。 除了对进来的流量做有效的控制之外,其实也可以控制出去的流量。istio-egress是出口网关,pod出去的时候要经过egress-gateway到达外界的某个终端。 hosts: - www.baidu.com 这个是p…

腾讯云对象存储联合DataBend云数仓打通数据湖和数据仓库

随着数字化进程不断深入,数据呈大规模、多样性的爆发式增长。为满足更多样、更复杂的业务数据处理分析的诉求,湖仓一体应运而生。在Gartner发布的《Hype Cycle for Data Management 2021》中,湖仓一体(Lake house)首次…

Linux之CentOS_7.9卸载MySQL_5.7全过程实操手册

前言:接以上,前面记录了Windows和Linux环境的MySQL部署,那我们既然都部署完成验证测试那就来个卸载记录吧,便于闭环收尾。 环境: 1、CentOS-7.9-x86_64-DVD-2009.iso 2、MySQL-5.7.42-linux-glibc2.12-x86_641、关闭…

软件测试工程师生存手册

以前做传统行业时,从来没担忧过自己会因为什么事被干掉,因为觉得自己工资低。培训转行跳到IT互联网公司后,这种担忧从未消失过。 互联网公司发展迭代非常迅速。今天通过切身的感受来聊一聊,作为一名测试工程师,如何才能…

OutOfMemoryError: unable to create new native thread.

在java应用中,有时候会出现这样的错误:OutOfMemoryError: unable to create new native thread.现象1. 这种怪事是因为JVM已经被系统分配了大量的内存(比如1.5G),并且它至少要占用可用内存的一半;2. 在线程个数很多的情况下&#…

电脑便签怎么嵌入桌面使其不可移动呢?

很多人在使用电脑便签的时候,为了更方便地查看和记录事情,经常会有一种需求:将电脑便签固定在桌面底层,也就是嵌入桌面,并且让他不可移动。要想实现这种效果的话,应该如何设置才可以呢?以Window…

kettle/spoon工具的表输入/输出组件更新数据很慢

看了很多关于表输出速度慢的博客感觉有两条对我有作用。 我的问题是表输出(insert)速度很快,但是插入/更新组件的速度特别忙。 表输出速度慢 mysql表输出的时候出现减速的原因可能是因为网络链接的属性设置 在数据库连接里添加参数&#xf…

ModaHub魔搭社区:如何安装、部署和使用 Milvus Lite?

目录 如何安装、部署和使用 Milvus Lite? 总结 如何安装、部署和使用 Milvus Lite? 准备工作 在正式安装 Milvus Lite 以前,需要做足以下准备: 安装 Python 3.7 或更高版本。 使用下述任何一个经过验证的操作系统:Ubuntu > 20.04 …

【MySQL入门到精通-黑马程序员】MySQL基础篇-概述及MySQL环境配置

文章目录 前言一、MySQL概述1.1 数据库相关概念1.2 MySQL数据库 二、数据模型三、总结 前言 本专栏文章为观看黑马程序员《MySQL入门到精通》所做笔记,课程地址在这。如有侵权,立即删除。 一、MySQL概述 1.1 数据库相关概念 数据库(DataBas…

FreeRTOS实时操作系统(十一)队列集

系列文章目录 文章目录 系列文章目录队列集简介相关API函数队列集创建函数队列集中移除函数队列集中获取有消息的队列 实验测试: 队列集简介 队列只允许传递一种数据类型,队列集可以传递多种消息。 作用:用于对多个队列或信号量进行“监听”…

PicoNeo neo入门教程2 SDK

目前在使用的是Unity XR SDK V2.x, 当前版本2.2.0版本 查看文档,有更新日志。 api接口:API 接口函数 - PICO 开发者平台

Pytorch TensorRT 安装使用流程

1.安装GPU驱动与Cudnn(注意版本对应) 2.安装TensorRT 安装流程1 安装流程2 3. 权值.pth文件转为Onnx 3.Onnx 文件本地化 .engine 文件(与本机算力有关) 执行命令: trtexec --onnx./resnet.onnx --saveEngineresn…

MongoDB【MongoDB应用实战】(四)-全面详解(学习总结---从入门到深化)

目录 MongoDB应用实战 多键索引 多键索引用于为数组中的元素创建索引 先创建集合inventory,使用下面的数据来创建多键索引 [{ _id: 5, type: "food", item: "aaa", ratings:[ 5, 8, 9 ] }, { _id: 6, type: "food", item: "b…

2023年7月4日 星期二 linux驱动作业

Linux内核驱动开发板的灯的实验 头文件 #ifndef __HEAD_H__ #define __HEAD_H__#define PHY_LED1_MODER 0X50006000 #define PHY_LED1_ODR 0X50006014 #define PHY_RCC 0X50000A28#define PHY_LED2_MODER 0X50007000 #define PHY_LED2_ODR 0x50007014#define PHY_LED…

LK409.最长回文字符串

题目描述 给定一个包含大写字母和小写字母的字符串 s ,返回 通过这些字母构造成的 最长的回文串 。 在构造过程中,请注意 区分大小写 。比如 “Aa” 不能当做一个回文字符串。 解题思路 有两种情况可以构成回文字符串: 1.全部字符呈偶数对出现 2.一…

simulink 仿真时间 求解器 数据类型 delay模块

仿真时间,模型运行的时长 显示数据类型,改完数据类型后要run一次才能正常显示更改后的类型 delay模块,延时步长 综合训练 搭建一个累加器,每次调用1 //c语言 static int a 0; a;

一次搞懂ArrayBuffer和Unit8Array(TypedArray)和Array!

实现入职第三天,用到了公司自研框架里面的网络请求,返回的数据会被自动改成ArrayBuffer类型,研究了半天没明白ArrayBuffer怎么转成字符串数据,看了mentor发来的示例代码,经过一番研究也是明白了ArrayBuffer和它相关的东…

Python基础教程:读写文件IO操作

Python 是一门优秀的开发语言,它不仅是一种动态的脚本语言,还支持多种应用场景。在 Python 中,我们可以使用文件和 I/O 操作来读取和写入文件。它比起其他编程语言,使用更加方便。 1.读写文本文件 在 Python 中,读写…

【轴承RUL预测代码】基于DRSN(深度残差收缩网络)

DRSN(深度残差收缩网络)和完整Transformer(encoderdecoder) DRSN(深度残差收缩网络)模型的代码模型的打印训练与预测训练集的可视化:测试集的可视化: DRSN-TCN的效果 DRSN&#xff0…