首页 > 其他分享 >关键字 开发-02 关键字驱动执行yaml用例

关键字 开发-02 关键字驱动执行yaml用例

时间:2023-11-24 11:49:07浏览次数:55  
标签:02 __ yaml url self 关键字 base print

1. 封装request运行方法

我们将测试数据写到yaml文件中,通常会使用pytest框架parametrize参数化的方式读取yaml文件数据生成测试用例,于是我们可以根据这个思路来开发。

# utils/request_session.py
import requests
import re
from requests import Response

class ParserError(Exception):
    pass

class HttpSession(requests.Session):

    def __init__(self, base_url: str=None, timeout=10):
        super().__init__()
        self.base_url = base_url
        self.timeout = timeout

    @staticmethod
    def check_url(base_url: str, url: str) -> str:
        """ 拼接base_url 和 url 地址"""
        if re.compile(r"(http)(s?)(://)").match(url):
            return url
        elif base_url:
            if re.compile(r"(http)(s?)(://)").match(base_url):
                return f"{base_url.rstrip('/')}/{url.lstrip('/')}"
        else:
            raise ParserError("base url do yo mean http:// or https://!")

    def send_request(self, method, url, base_url=None, **kwargs) -> Response:
        """判断是否有传base_url, 没有则用公共的base_url"""
        url = self.check_url(base_url, url) if base_url else self.check_url(self.base_url, url)
        return self.request(method, url, timeout=self.timeout, verify=False, **kwargs)
# 获取yaml文件的模块,utils/read_file.py
import yaml
from pathlib import Path

def read_yaml(file_path: Path):
    """
    读取 yaml 数据,转 python 类型
    :param file_path:
    :return: dict
    """
    with open(file_path, 'r', encoding='utf-8') as fp:
        data = yaml.safe_load(fp)
    return data

if __name__ == '__main__':
    file_path = Path(__file__).parent.parent.joinpath('data', 'login.yml')
    res = read_yaml(file_path)
    print(res.items())
    print(type(res))  # -->dict

1.1 配置base_url

通常我们不会将base_url写进yaml文件中,yaml文件中也只是放url的相对路径。
全局环境地址切换使用 base_url 来实现,先安装插件:> pip install pytest-base-url
项目根目录新增 pytest.ini 文件,写入以下内容:

[pytest]
filterwarnings =
ignore::DeprecationWarning
ignore::urllib3.exceptions.InsecureRequestWarning
base_url=http://124.20.143.221:8201

2. 根据关键字运行用例

如何根据关键字去运行用例呢,这里的核心思想就是使用反射机制来运行关键字。

2.1 什么是反射

反射的本质是通过字符串去调用某对对象的方法/属性,或者调用模块中的函数等。python中提供了四个重要的方法.

  • getattr获取对象属性/对象方法
  • hasattr判断对象是否有对应的属性及方法
  • delattr删除指定的属性
  • setattr为对象设置内容

2.2 getattr获取对象属性/方法

如下代码块,里面有属性和方法,我们正常调用是先实例化再调用对象和方法。

class Page:
  name = "hello"
  des = "world"
  
  def click():
    print("click button")
  
  def clear(self):
    print("clear")

  def fill(self, text):
    print(f"input text: {text}")
if __name__ == '__main__':
  p = Page()
  print(p.name)
  print(p.click())

当我们想批量操作的时候,比如只需要知道关键字"click","clear","fill" 就可以调用对应的方法了.

p = Page()
# 获取对象属性
name = getattr(p, "name")
print(name)
# 调用对象方法
getattr(p, "click")()
# 方法带参数
getattr(p, "fill")("hello world")

我们在调用之前事先不知道有对应方法,所以先判断后调用,hasattr判断对象是否有对应的属性及方法。

p = Page()
# 先判断后调用
if hasattr(p, "click"):
  getattr(p, "click")()

delattr 删除指定的属性: delattr(p, "click") print(p.click)
setattr 为对象设置内容, 可以动态添加属性和方法: setattr(p, 'age', 22) print(getattr(p, 'age'))
`
了解了这个原理后,我们就可以来编写我们的模块

# utils/run.py

"""利用反射运行关键字"""
class RunByKey:
    def __init__(self, session):
        self.session = session

    @staticmethod
    def name(value):
        print(f'用例名称:{value}')

    def request(self, value: dict):
        print(f"执行request: {value}")
        res = self.session.send_request(**value)
        return res

    def run(self, data: dict):
        for key, value in data.items():
            if hasattr(self, key):
                res = getattr(self, key)(value)
                print(f"=========当前的key:{key}")
                if key == "request":
                    print(f"执行结果:{res.text}")
            else:
                print(f"关键字未定义: {key}")

接下来我们编写test_login.py来运行这个yaml文件中的用例。我们yaml文件中写了2条测试用例,base_url在pytest.ini中已经定义了

test_login:
  name: 登录成功
  request:
    url: /api/v1/auth/login
    method: POST
    json:
      username: "admin"
      password: "Admin@22"

test_login2:
  name: 登录失败
  request:
    url: /api/v1/auth/login
    method: POST
    json:
      username: "admin"
      password: "Admin@2233"
import pytest
from utils import read_file
from pathlib import Path
from utils.request_session import HttpSession
from utils.run import RunByKey

# 获取文件路径
file_path = Path(__file__).parent.joinpath('data', 'login.yml')

@pytest.mark.parametrize('name, value', read_file.read_yaml(file_path).items())
def test_login(name, value, base_url):
    print(f"测试用例名称: {name}")
    print(f"测试数据: {value}")  # data ---dict
    print(f"base_url: {base_url}")
    s = HttpSession(base_url=base_url)
    run = RunByKey(s)
    run.run(value)

运行结果如下图所示:

现在可以使用关键字来运行yaml文件的测试用例了,但是呢,这是各个参数都是写死的传入,如果我们需要引入变量,该怎么传入呢,后面将会解决这个问题。

标签:02,__,yaml,url,self,关键字,base,print
From: https://www.cnblogs.com/dack-zt-deng/p/17852103.html

相关文章

  • 20211314王艺达学习笔记11
    TCP/IP和网络编程TCP/IP协议互联网的基础。TCP代表传输控制协议,IP代表互联网协议。TCP/IP的组织结构分为几个层级,通常称为TCP/IP堆栈。如图所示为TCP/IP的各个层级以及每一层级的代表性组件及其功能。进程与主机之间的传输层或其上方的数据传输只是逻辑传输。实际数据传输......
  • 【2023-11-23】难得知己
    20:00发生在这个世界上的事情,只有通过我们自己对事件的诠释才能影响到我们,所以只要我们能控制自己对事件的诠释,就能控制自己的世界。                                            ......
  • 平台工程时代的 Kubernetes 揭秘:2023年生产状况报告深度剖析
    Kubernetes在生产环境中的复杂性已经成为常态,在2023年这个平台工程盛行的时代,容器管理的最大亮点可能在于其灵活性,然而在运维政策和治理等方面仍然存在诸多挑战。八年过去了,在生产环境中使用Kubernetes仍然需要面临许多挑战。 SpectroCloud刚刚与DimensionalResearch合......
  • 2W02-ASEMI小功率电源板专用圆桥2W02
    编辑:ll2W02-ASEMI小功率电源板专用圆桥2W02型号:2W02品牌:ASEMI封装:WOB-4特性:插件、整流圆桥正向电流:2A反向耐压:200V恢复时间:>2000ns引脚数量:4芯片个数:4芯片尺寸:60MIL浪涌电流:60A漏电流:10ua工作温度:-55℃~150℃包装方式:500/盘;5000/箱备受欢迎的2W02-ASEMI整流圆桥A......
  • The 2021 ICPC Asia Shenyang Regional Contest
    Preface合肥前的最后一场VP了,本来计划是我和祁神两个人打,但后面徐神还是来救场了然后这场我们过的最难的两题都是徐神切的,直接给我们抬进Au区了属于是而且徐神最后也差一点写出G(TLEon72),同时也一眼秒了D(没时间写了),看来这场让三个徐神来打感觉10题随便出线了A.ABiteofTey......
  • Ubuntu 24.04 LTS “Noble Numbat” 预计于 2024 年 4 月 25 日发布
    导读Canonical今天宣布了下一个Ubuntu版本的代号,Ubuntu24.04LTS,代号“NobleNumbat”,计划于明年的4月25日发布。这个即将发布的版本预计将搭载GNOME46桌面环境。Ubuntu24.04LTS“NobleNumbat”将是Canonical的第40个Ubuntu发行版和第10个LTS(长......
  • 2023版 STM32实战6 输出比较(PWM)包含F407/F103方式
    输出比较简介和特性-1-只有通用/高级定时器才能输出PWM-2-占空比就是高电平所占的比例-3-输出比较就是输出不同占空比的信号 工作方式说明 -1-1-PWM工作模式  -1-2-有效/无效电平 有效电平可以设置为高或低电平,是自己配置的 周期选择与计算 周期=重装载......
  • 【接口自动化测试实战】python+requests+Pytest+yaml+Allure
    前言一、先来了解下pytest二、需要具备的基础知识三、开发环境准备四、接口自动化实战(设计项目目录)五、方法封装六、编写自动化用例脚本七、持续集成八、其他自动化框架......
  • http重定向302不同端的处理方式
    当浏览器向后台发起请求时,后台返回302,此时浏览器因为请求的发起方式不同,处理302的方式也不同,下面列举常见的处理方式:参考博客:[1]关于http重定向(302)的实验https://blog.csdn.net/u010476739/article/details/115719565......
  • #2023-2024-1 20231308 《计算机基础与程序设计》第九周学习总结
    2023-2024-120231308《计算机基础与程序设计》第九周学习总结作业信息这个作业属于哪个课程2023-2024-1-计算机基础与程序设计这个作业要求在哪里2023-2024-1计算机基础与程序设计第九周作业这个作业的目标计算机科学概论第10,11章《C语言程序设计》第8章并完成......