pytest参数化和yaml学习
一、参数化parametrize
组装测试数据,在测试前定义好测试数据,并在测试用例中使用
- 单次循环(单参数单次循环):
@pytest.mark.parametrize("a",["b"])
def test_parametrize(a):
print(a)
2.多次循环(单参数多次循环,将数组中的值分别赋值给变量,每赋值一次,运行一次):
@pytest.mark.parametrize("a",["b","c","d"])
def test_parametrize(a):
print(a)
3.多参数多次循环(值可以是数组或元组形式)
@pytest.mark.parametrize("a,b",[("c","d"),("e","f")])
def test_parametrize(a,b):
print(a,b)
4.参数值为字典形式
@pytest.mark.parametrize("hero",[{"name":"安琪拉"}])
def test_parametrize(hero):
print(hero["name"])
二、yaml(yaml语言本质是一种通用的数据串行化格式)
适用场景:
- 在脚本语言中使用,实现简单,解析成本低
- 序列化
- 在编程时写配置文件,比xml快,比ini文档功能更强
- yaml是专门用于写配置文件的语言,非常简洁和强大,比json格式方便
yaml支持的三种数据结构:
- 对象:即键值对的集合,又称为映射(mapping)/哈希(hashes)/字典(dictionary)
- 数组:一组按次序排列的值,又称为序列/列表(list)
- 纯量:单个的、不可再分的值(str、float、int)
三、yaml写法
- 对象
key:
child-key: value
child-key2: value2
等于 {"key":{"child-key":"value","child-key2":"value2"}}
2.数组
key:
- A
- B
- C
等于{"key":[A,B,C]}
3.组合
key:
- child-key: value
chile-key2: value2
等于 {"key":[{"child-key":"value","child-key2":"value2"}]}
4.数组嵌套
key:
-
- A
- B
- C
等于{"key":[[A,B,C]]}
四 、yaml中不同写法
hero1: {name: 安琪拉, age: 18,hp: 433.4}
等同于
hero:
name: 安琪拉
age: 18
hp: 433.4
五、读取yaml文件
- yaml包安装:pip3 install pyyaml(或package安装)
- 读取yaml文件内容
import yaml
def read_yaml():
f=open("../config/data.yaml",encoding="utf-8")
data=yaml.safe_load(f)
return data
if __name__ == '__main__':
result=read_yaml()
print(result)
3.复杂yaml数据读取
test:
name: login_case1
request:
url: https://xxx
method: POST
header:
Content-Type: application/json
json:
username: test
password: 123456
getdata=read_data()['test']['request']['header'](通过键获取值 )
六 、yaml在线格式校验
地址:https://www.bejson.com/validators/yaml_editor/
七、yaml+parametrize使用
(从yaml中获取,值需是数组,如getdata["heros_name"]需是数组,否则无法获取)
优缺点:使用数组无法知道每个值的含义,场景:同一个字段不同值的场景,如不通过手机号注册或登录
多个参数时建议以字段形式,不通过@pytest.mark.parametrize参数传递
1.单参数
heros_name:
- 安琪拉
- 黄忠
- 小乔
import pytest
from utils.read_data import getdata
@pytest.mark.parametrize("name",getdata["heros_name"])
def test_parametrize_yaml(name):
print(name)
2.多参数
perso:
- - zhangsan
- 18
- - lisi
- 20
或者下面的形式:
mobil_belong_get:
- [18837238983,2232342]
- [17938282888,2312313]
@pytest.mark.parametrize("name,age",getdata['perso'])
def test_parametrize_yaml(name,age):
print('我的姓名:%s'%name,',年龄:%s'%age)
#print(f'我的姓名:{name},年龄:{age}')
八、yaml使用自定义函数
data.yaml文件
person:
name: random_name()
age: 18
sex: 男
替换函数
def func_yaml(data):
if isinstance(data,dict):
for key,value in data.items():
if 'random' in str(value):
data[key]=eval(value)
return data
def func_yaml_2(data):
if isinstance(data,dict):
for key,value in data.items():
if '${' and '}' in str(value):
start=str(value).index('${')
end=str(value).index('}')
func_name=str(value)[start+2:end]
#data[key]=eval(func_name) #${random_name()}
data[key] = str(value)[0:start]+eval(func_name)+str(value)[end+1:len(str(value))] #上海-${random_name()}-测试
return data
如果方法在其他文件中,不在工具文件(yaml_util中,在 yaml_util需要引入对应函数)

浙公网安备 33010602011771号