• Pytest系列-YAML格式测试用例(8)


    简介

    yaml 文件是一种数据序列化语言,扩展名可以是 .yaml 和 .yml ,支持 # 注释,通过缩进表示层级关系,区分大小写;其良好的跨语言、跨平台、易于理解、格式简单而广泛应用于配置文件、数据文件、日志文件等,因为采用了缩进方式表示层级关系,在python语言中使用就显得更加亲切。

    用途:

    • 用于做配置文件,如 环境变量,数据库信息,用户名密码,日志格式等
    • 用于编写自动化测试用例:web、ui、app

    语法规则:

    • 区分大小写;
    • 通过#注释;
    • 执行时最好加上 Loader=yaml.FullLoader
    • 通过缩进表示层级关系,一般用空格,不要使用tab键;
    • 字符串可以不用写引号,也可以写单引号或者双引号,区别在于,单引号会对特殊字符进行转义;

    数据组成

    • 列表、字典、列表嵌套字典;
    • map对象:键:(空格)值对,如:“a”: “b”;
    • 使用 ‘-’ 代表列表;
    • 多组需要用 ‘-’ 开头,标注为不同组数据;
    • yaml读取出来之后是一个字典列表格式;

    数据类型:

    • 字符串
    • 整形
    • 浮点
    • 布尔
    • 日期
    • 空(null)
    • 数组

    上述类型除数组外。其他数据类型无特殊语法格式。只需要输入数据,底层会自动转换类型。
    说到数组,在yaml中想定义一个数组,需要在key值前增加一个"-"来表示数组。

    # ['张三','李四']
    # 列表 --> yaml
    - 张三
    - 李四
    
    • 1
    • 2
    • 3
    • 4
    # {'user':'123456','passwd':'123456'}
    # 字典 --> yaml
    user: test1
    passwd: 123456
    
    • 1
    • 2
    • 3
    • 4
    # [{'user':'123456','passwd':'123456'},{'user':'111111'}]
    # 列表包含字典 --> yaml
    - user: test1
      passwd: 123456
    - user: 111111
    
    • 1
    • 2
    • 3
    • 4
    • 5

    读取yaml

    import yaml
    
    # 获取项目路径
    def get_obj_path():
    	return os.path.dirname(__file__)
    	#    return os.getcwd()
    
    def read_yaml():
    	with open('yaml文件路径',mode='r',encoding='utf-8') as f:
    	value =	yaml.load(stream=f,Loader=yaml.FullLoader)
    	return value
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    配置yaml

    安装

    1、使用命令安装
    使用官方pypi源来安装 pip install ruamel.yaml
    使用豆瓣pypi源来安装(推荐)pip install -i https://pypi.douban.com/simple ruamel.yaml

    2、在Settings下搜索安装
    在这里插入图片描述
    在这里插入图片描述

    基本使用

    在项目根目录下创建 文件.yaml

    例一:

    - name: 张三
    - age: 14
    # 输出:[{'name': '张三'}, {'age': 14}]
     
    - name
    - age
    # 输出:['name', 'age']
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    例二:
    info.yaml 文件
    在这里插入图片描述
    yaml_test.py 文件读取info.py文件

    # from ruamel.yaml import YAML
    import os
    import yaml
    import pprint # 美化输出数据
    
    with open('D:/Pycharm/pythonProject1/info.yaml','r',encoding='utf-8') as f:
    	date=yaml.load(stream=f,Loader=yaml.FullLoader)
    print('\n', date)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    执行结果

     {
      'boolean': [True, False], 
      'float': [3.14, '6.8523015e_5'], 
      'int': [123, 685230], 
      'kongzhi': {'parent': None, 'olass': None},
      'string': ['哈哈', 'Hello world: from this way', '写多行'], 
      'date': [datetime.date(2018, 2, 12), datetime.datetime(2018, 2, 7, 12, 23, 34)]
      }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    锚点

    主要作用就是引用公共变量。

    语法:

    • 设置锚点

      使用 &锚点名称,建立一个锚点。可以标注锚点
      
      • 1
    • 引用锚点

      使用 *+锚点名称。可以引用锚点
      <<  锚点名称。表示将锚点追加到本数据组中,表示合并。
      
      • 1
      • 2

    info.yaml 文件
    在这里插入图片描述

    yaml_test.py 文件读取info.py文件

    with open('D:/Pycharm/pythonProject1/info.yaml','r',encoding='utf-8') as f:
    	date=yaml.load(stream=f,Loader=yaml.FullLoader)
    print('\n', date)
    
    • 1
    • 2
    • 3

    执行结果

     {
     'manager': {'name': '张三', 'age': 28, 'sex': '男'}, 
     'staff': {'name': '李彤', 'age': 22, 'sex': '女'}, 
     'department': [{'Position_m': '经理'}, {'name': '张三', 'age': 28, 'sex': '男', 'level': 10}, {'Position_s': '职员'}, {'name': '李彤', 'age': 22, 'sex': '女', 'leve': 5}]
     }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    操作yaml

    1、读取

    def get_cwd(): #获取项目根路径
    	return os.getcwd()
    
    # 读取yaml
    def read_yaml(filename):
    	# filename 文件名称
    	path = get_cwd()+'/'+filename
    	with open(path,'r',encoding='utf-8') as f:
    		return yaml.load(stream=f,Loader=yaml.FullLoader)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    2、写入(追加

    def get_cwd(): #获取项目根路径
    	return os.getcwd()
    # 写入yaml
    def write_yaml(filename,data):
    	# filename 文件名称
    	# data 写入数据
    	path = get_cwd()+'/'+filename
    	with open(path,'a',encoding='utf-8') as f:
    		# allow_unicode 允许Unicode编码格式
    		yaml.dump(data,f,allow_unicode=True)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    3、清空

    def clear_yaml(yaml_path):
        with open(yaml_path,encoding="utf-8",mode="w") as f:
            f.truncate()    
    
    • 1
    • 2
    • 3

    总结

    • yaml文件读取效率非常高
    • yaml文件相当适合存放测试数据
    • ruamel.yaml模块对yaml文件的操作进一步简化
    • yaml在自动化测试和测试开发中都有广泛应用

    parametrize 结合yaml实现自动化测试

    1、写一个yaml文件:long.yaml
    在这里插入图片描述

    2、读取yaml文件:read_yaml.py

    import os
    import yaml
    
    def get_obj_path(): # 获取项目路径
        # 使用切割方法 获取目录路径
        return os.path.dirname(__file__).split('testcase')[0]
    
    # 读取yaml文件
    def read_yaml(filename):
        path = get_obj_path()+ filename
        with open(path,'r',encoding='utf-8') as f:
            data = yaml.load(stream=f,Loader=yaml.FullLoader)
        return data
    
    if __name__ == '__main__':
        print(read_yaml('login.yaml'))
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    执行结果

    [
    	{
    		'name': '正确验证码登录', 
    		'request': {
    			'method': 'get', 'url': 'http://域名/jeecg-boot/sys/login', 
    			'headers': {'Content_Type': 'application/json'}, 
    			'data': {'captcha': 'Gkak!@#2023s', 'checkKey': 1637811815838, 'password': 123456, 'remeber_me': 2, 'username': 'admin'}
    		}, 
    		'validate': 'None'
    	}
    ]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    3、使用parametrize结合yaml 实现数据驱动 parametrize_yaml.py

    import pytest
    import requests
    from testcase.read_yaml import read_yaml
    
    class TestYaml:
    
        session = requests.session()
        @pytest.mark.parametrize('caseinfo',read_yaml('login.yaml'))
        def test_get_token(self,caseinfo):
            print('获取统一接口鉴权')
            name =caseinfo['name']
            method =caseinfo['request']['method']
            url =caseinfo['request']['url']
            data =caseinfo['request']['data']
            validate =caseinfo['validate']
            res = TestYaml.session.request(method=method,url=url,params=data)
            result = res.json()
    
            assert 'access_token' in result
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    request 源码
    在这里插入图片描述

    4、pytest 统一接口封装request_util.py

    import requests
    
    class RequestUtil:
        session = requests.Session()
    
        def send_request(self,method,url,data,**kwargs):
            method = str(method).lower()
            res = ""
            if method == "get":
                res = RequestUtil.session.request(method,url,params=data,**kwargs)
            elif method =="post":
                res = RequestUtil.session.request(method,url,json=data,**kwargs)
            return   res
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
  • 相关阅读:
    边缘计算技术
    商城接口文档
    Spring MVC 架构详解
    Photoshop利用置换滤镜制作文字人像
    JSP指令,JSP九大内置对象
    信息系统项目管理师必背核心考点(三十一)挣值管理
    利用python制作AI图片优化工具
    中远麒麟堡垒机tokensSQL注入漏洞
    itk中图像2d-3d配准整理
    休闲娱乐APP,你是否感兴趣呢
  • 原文地址:https://blog.csdn.net/m0_62091240/article/details/132922191