pytest框架之yaml详解以及Parametrize数据驱动

发布时间 2024-01-08 14:46:12作者: 万溪汇海

1. YAML语法详解

yaml是一个完全类似于json数据序列化格式

重点:

  • yaml完全兼容json
  • yaml和json,都是数据,不是语句
  • 序列化:将内存中的对象,转为文件
  • 反序列化:将文件内容,转为内存中的对象
  • 文本文件(可以使用记事本进行创建,编辑,修改)

优点:

  1. 结构更加清晰
  2. 语法高级,支持注释
  3. 和python语法相似

1.1 序列化:将Python转为yaml

1.1.1 把python转为json

 1 import json
 2 
 3 data={
 4     "数字": [1,2,3,4,5,6,7,-1,-2],
 5 "字符串": ["1","2"],
 6     "布尔值": [True,False],
 7     "空值": None,
 8     "列表": [[1,2,3],[-1,-2,-3]],
 9     "字典":[{"a":1},{"b":2,"c":3}]
10 }
11 
12 with open("data.json","w",encoding="utf-8") as f:
13     s=json.dumps(data)
14     print(s)
15     f.write(s)

1.1.2 把python转为yaml

 pip install pyyaml

 1 import yaml
 2 
 3 data={
 4     "数字": [1,2,3,4,5,6,7,-1,-2],
 5 "字符串": ["1","2"],
 6     "布尔值": [True,False],
 7     "空值": None,
 8     "列表": [[1,2,3],[-1,-2,-3]],
 9     "字典":[{"a":1},{"b":2,"c":3}]
10 }
11 
12 with open("data.yaml","w",encoding="utf-8") as f:
13     s=yaml.safe_dump(data)
14     print(s)
15     f.write(s)

1.2 反序列化:将yaml转换为Python

 1 import yaml
 2 
 3 with open("data.json",encoding="utf-8") as f:
 4     s_json=f.read()
 5 
 6 
 7 with open("data.yaml",encoding="utf-8") as f:
 8     s_ytaml=f.read()
 9 
10 d_json=yaml.safe_load(s_json)
11 d_yaml=yaml.safe_load(s_ytaml)
12 
13 print(d_json)
14 print(d_yaml)

1.3 yaml语法特色

  • docker-compose
  • github action
  • springcloud application.yml
  • k8s
列表:  [[1,2,3],[-1,-2,-3]]
#这是字段
字典:
- a: 1
- b: 2
  c: 3
字符串:
- '1'
- '2'
布尔值:
- true
- false
数字: [1, 2, 3, 4, 5, 6, 7, -1, -2]
空值: null
层级:
  a:
    b:
      c: 2
变量类型: !!int '1'
变量类型2: !!str 2
变量类型3: !!str 2024-1-7
  1. 完全兼容json
  2. 执行注释,使用#,和python完全一致
  3. 成员通过换行表示:
    1. “-”:表示列表的成员
    2.  “:”:表示字典的成员
  4. 层级通过缩进表示,和python完全一致
  5. 变量类型
    1. 变量类型3: !!str 2024-1-7

yaml(或者json)存在文件中的字符串

一旦进入Python,只会按照Python的数据结构来使用

2. pytest+yaml实现数据驱动测试

数据驱动测试=参数化测试(pytest)+数据文件(yaml、json、excel等)

2.1 参数化测试用例

 1 import pytest
 2 
 3 
 4 def add(a, b):
 5     try:
 6         return a + b
 7     except Exception:
 8         return None
 9 
10 @pytest.mark.parametrize(
11     "a,b,c",
12     [
13         (1, 1, 2),
14         ('1', '1', '11'),
15         ('1', 1, None),
16         (True, False, 1),
17         (1,False,1),
18         ("1", None, None)
19     ]
20 )
21 def test_add(a, b, c):
22     assert add(a, b) == c