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

简介

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

用途:

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

语法规则:

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

数据组成

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

数据类型:

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

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

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

读取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

配置yaml

安装

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

2、在Settings下搜索安装
Pytest系列-YAML格式测试用例(8)_第1张图片
Pytest系列-YAML格式测试用例(8)_第2张图片

基本使用

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

例一:

- name: 张三
- age: 14
# 输出:[{'name': '张三'}, {'age': 14}]
 
- name
- age
# 输出:['name', 'age']

例二:
info.yaml 文件
Pytest系列-YAML格式测试用例(8)_第3张图片
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)

执行结果

 {
  '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)]
  }

锚点

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

语法:

  • 设置锚点

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

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

info.yaml 文件
Pytest系列-YAML格式测试用例(8)_第4张图片

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)

执行结果

 {
 '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}]
 }

操作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)

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)

3、清空

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

总结

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

parametrize 结合yaml实现自动化测试

1、写一个yaml文件:long.yaml
Pytest系列-YAML格式测试用例(8)_第5张图片

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'))

执行结果

[
	{
		'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'
	}
]

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

request 源码
Pytest系列-YAML格式测试用例(8)_第6张图片

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

你可能感兴趣的:(pytest,pytest,python)