目录
1、数据驱动
以数据来驱动整个测试用例的执行,也就是测试数据决定测试结果。比如我们要测试加法,我们的测试数据是1和1,测试结果就是2,如果测试数据是1和2,测试结果就是3.
1.1 特点
数据驱动技术可以将用户把关注点放在对测试数据的构建和维护上,而不是直接维护脚本,可以利用同样的过程对不同的数据输入进行测试.
数据驱动的实现要依赖参数化的技术.
1.2 传入数据的方式(测试数据的来源)
- 直接定义在测试脚本中(简单直观,但代码和数据未实现真正的分离,不方便后期维护)
- 从文件读取数据,如JSON、excel、xml、txt等格式文件
- 从数据库中读取数据
- 直接调用接口获取数据源
- 本地封装一些生成数据的方法
2、Json
2.1 Json语法规则
- 大括号保存对象
- 中括号保存数组
- 对象数组可以相互嵌套
- 数据采用键值对表示
- 多个数据由逗号分隔
2.2 JSON键
JSON的键必须是字符串类型,用英文双引号括起来
2.3 JSON值
JSON 值可以是:
数字(整数或浮点数)
字符串(在双引号中)
逻辑值(true 或 false)
数组(在中括号中)
对象(在大括号中)
null
示例:
{
"name": "tom",
"age": 18,
"isMan": true,
"school": null,
"address": {
"country": "中国",
"city": "江苏苏州",
"street": "科技园路"
},
"numbers": [2, 6, 8, 9],
"links": [
{
"name": "Baidu",
"url": "http://www.baidu.com"
},
{
"name": "TaoBao",
"url": "http://www.taobao.com"
}
]
}
2.4 JSON数据操作
2.4.1导包
import json
2.4.2JSON文件读写
读取json文件
with open('data.json', encoding='UTF-8') as f:
data = json.load(f) # 返回的数据类型为字典或列表
写入json文件
param = {'name': 'tom', 'age': 20}
with open('data2.json', 'w', encoding='UTF-8') as f:
json.dump(param, f)
注意:unit test数据最外层必须是列表,列表中的元素可以是元组或列表
# 数据最外层必须是列表,列表中的元素可以是元组或列表
@parameterized.expand(test_data)
def test_add_fun(self, x, y, expect):
result = add(x, y)
self.assertEqual(result, expect)
3、yaml数据存储文件
yaml是一种所有编程语言可用的友好的数据序列标准,语法和其他高阶语言类似,并且可以简单表达清单、散列表,标量等资料形态
3.1 PyYAML库安装
PyYAML为python解析yaml的库
安装:pip install PyYAML
3.2 文件后缀名
data.yaml data.yml
3.3 语法规则
大小写敏感,即name Name是不同的
使用缩进表示层级关系,只要相同层级的元素对其即可
3.4 支持的数据结构
对象:键值对的集合,又称为映射/字典
数组:一组按次序排列的值,又称为序列/列表
纯量:单个值(包含字符串、布尔值、整数、浮点数、空、日期)
3.5 返回值
字典(yaml文件最核心的存在)
# 1、yaml文件中每一个冒号后必须加一个空格
name: "ww"
sex: 男 # 2、不加引号也不会报错,它会自动转换为python数据类型
# ❀ 对象
info: {"name": ww, "age": 18 } # 值为python中的字典
Info: {"name": "星魂", "age": 21 }
student: # 缩进表示层级关系,相同层级元素左对齐;一个冒号一个字典,同一层次的字典会合并,从而作为上一级的值
name: '文'
age: 14 # 'student': {'name': '文', 'age': 14}
# ❀ 数组
data: # yaml文件支持列表格式
- 1
- 2
datas: ['雪女', '高渐离'] # python 列表类型
# 模拟json {"names":[{"k1":"v1"},{"k2":"v2"}]}
names:
- k1: v1
- k2: v2
# ❀ 纯量:字符串、布尔值、整数、浮点数、空、日期
# 🎈 布尔值
tr1: true # yaml文件格式
fa1: false
tr2: True # python布尔值
fa2: False
# 🎈 整数和浮点数
ind: 14
flo: 1.5
# 🎈 空
data1: ~ # None
data2: None # 'None',⚠ 不支持python的None类型
data3: # 值为空就是返回python中的None
data4: null
data5: Null
# 🎈 日期
# 年月日
date1: 2020-08-26 # ⚠ 单位数必须要补0才可以,时分秒也一样要补0
# 年月日时分秒
date2: 2020-11-11 11:11:01
# 时分秒
date3: 11:11:11 # 不能这么写,它会返回某个数字
3.6 yaml数据操作
3.6.1 yaml读写操作
yaml读取文件
import yaml
# windows 防止中文乱码,encoding='utf-8'
with open('./test_yaml.yml', encoding='utf-8') as f:
value = yaml.safe_load(f)
print(value)
test_yaml.yml:
test_001:
x: 1
y: 2
z: 3
test_002:
x: 4
y: 6
z: 10
test_003:
x: 5
y: 3
z: 8
读取结果:
{'test_002': {'x': 4, 'z': 10, 'y': 6}, 'test_001': {'x': 1, 'z': 3, 'y': 2}, 'test_003': {'x': 5, 'z': 8, 'y': 3}}
写入yaml文件
# 写入数据
import yaml
data = {
"Search_Data": {
"search_test_002": {"expect": {"value": "你好"}, "value": "你好"},
"search_test_001": {"expect": [4, 5, 6], "value": 456}
}
}
"""
Search_Data:
search_test_002:
expect:
value: "你好"
value: "你好"
search_test_001:
expect: [4, 5, 6]
value: 456
"""
# yaml写文件
# 如果写入中文时,encoding='utf-8'(指定utf-8编码), allow_unicode=True(使用Unicode编码)
with open('./data3.yml', 'w', encoding='utf-8') as f: # 此处的utf-8也要有
yaml.safe_dump(data, f, encoding='utf-8', allow_unicode=True)
示例:
@pytest.mark.parametrize('phone, password, toast_mess, exp_data', data('login.yml'))
def test_login(self, phone, password, toast_mess, exp_data):
pass