自动化测试之 ddt 驱动 yaml/yml 文件
一、上篇文章我们使用了 unittest + ddt 驱动 json 文件做数据驱动测试,本篇文章我们采用 unittest + ddt 驱动 yaml/yml 文件来实现数据驱动测试,话不多说上源码。。。
- ddt.file_data:装饰测试方法,参数是文件名。文件可以是 json 或者 yaml 类型。
-
注意:如果文件是以 “.yml”或者".yaml" 结尾,ddt 会作为 yaml 类型处理,其他文件都会作为 json 文件处理。
-
如果文件是列表,列表的值会作为测试用例参数,同时,会作为测试用例方法名后缀显示。
- 如果文件是字典,字典的 key 会作为测试用例方法的后缀显示,字典的 value 会作为测试用例参数。
-
二、yaml 文件基础格式要求
- 基础语法
- 大小写敏感
- 使用缩进表示层级关系
- 缩进不允许使用 tab,只允许空格
- 缩进的空格数不重要,只要相同层级的元素左对齐即可
- '#' 表示注释
- YAML 支持以下几种数据类型:
- 对象:键值对的集合,又称为映射(mapping)/ 哈希(hashes) / 字典(dictionary)
- 数组:一组按次序排列的值,又称为序列(sequence) / 列表(list)
- 纯量(scalars):单个的、不可再分的值
- yaml 列表结构
- 以 - 开头的行表示构成一个数组
# data.yaml 文件内容 - data1 - data2 - data3
import yaml f = open("data", encoding="utf8") v = yaml.load(f) print(v) print(type(v)) f.close() # 结果如下 ['data1', 'data2', 'data3'] <class 'list'>
- yaml 多维列表结构
# data.yaml 文件内容 - - data1 - data2 - data3
import yaml f = open("data", encoding="utf8") v = yaml.load(f) print(v) print(type(v)) f.close() # 结果如下 [['data1', 'data2'], 'data3'] <class 'list'>
- yaml 字典结构
- 字典结构没有 -
- 冒号前为键,冒号后为值
- 冒号后面一定要空格
# data.yaml 文件内容 username : admin password : "123456"
import yaml f = open("data", encoding="utf8") v = yaml.load(f) print(v) print(type(v)) f.close() # 结果如下 {'username': 'admin', 'password': '123456'} <class 'dict'>
- yaml 多维字典结构
# data.yaml 文件内容 data : username: admin password: "123456" code : "0000" msg : "登录成功!"
import yaml f = open("data", encoding="utf8") v = yaml.load(f) print(v) print(type(v)) f.close() # 结果如下 {'data': {'username': 'admin', 'password': '123456'}, 'code': '0000', 'msg': '登录成功!'} <class 'dict'>
- 列表 + 字典,复杂结构
# data.yaml 文件内容 - username : admin password : "123456" - username : Evan password : xxxxxx
import yaml f = open("data", encoding="utf8") v = yaml.load(f) print(v) print(type(v)) f.close() # 结果如下 [{'username': 'admin', 'password': '123456'}, {'username': 'Evan', 'password': 'xxxxxx'}] <class 'list'>
- yaml 纯量
- 字符串
- 布尔值
- 整数
- 浮点数
- Null
- 时间
- 日期
boolean: - TRUE #true,True都可以 - FALSE #false,False都可以 float: - 3.14 - 6.8523015e+5 #可以使用科学计数法 int: - 123 - 0b1010_0111_0100_1010_1110 #二进制表示 null: nodeName: 'node' parent: ~ #使用~表示null string: - 哈哈 - 'Hello world' #可以使用双引号或者单引号包裹特殊字符 - newline newline2 #字符串可以拆成多行,每一行会被转化成一个空格 date: - 2018-02-17 #日期必须使用ISO 8601格式,即yyyy-MM-dd datetime: - 2018-02-17T15:02:31+08:00 #时间使用ISO 8601格式,时间和日期之间使用T连接,最后使用+代表时区
三、实例如下
- pip install pyyaml
- 注意:安装的包名为 pyyaml,但是导入的是 yaml
- yaml 文件可以通过 open 函数来读取,然后通过 load() 方法转换成字典
- 如下图实例
import yaml f = open("ddt_data.yaml", encoding="utf8") print(yaml.load(f)) f.close() # 运行结果如下 """ [{ 'url': 'http://cms.duoceshi.cn/xxx/xxxx/xxxxx', 'method': 'post', 'header': {'Content-Type': 'application/x-www-form-urlencoded'}, 'params': {'userAccount': 'admin', 'loginPwd': 123456} }] """
- 如下图为我的数据文件,且文件中数据类型为字典
import requests import unittest from ddt import ddt, file_data @ddt class CmsLogin(unittest.TestCase): @file_data("ddt_data.yaml") def testcase(self, method, url, header, params): res = requests.request(method, url, headers=header, data=params) print(res.text) if __name__ == '__main__': unittest.main() # 运行结果如下 """ Ran 2 tests in 0.215s .. {"code":"200","msg":"登录成功!","model":{}} {"code":"400","msg":"登录帐号不存在!","model":{}} ---------------------------------------------------------------------- """
- 如下图为我的数据文件,且文件中数据类型为列表
import yaml from ddt import ddt, data, unpack def get_yml_data(yml_file): with open(yml_file, encoding="utf8") as f: return yaml.load(f) @ddt class CmsLogin(unittest.TestCase): @data(*get_yml_data("ddt_data.yml")) @unpack def testcase(self, name, age): print(name + "----" + str(age)) if __name__ == '__main__': unittest.main() # 运行结果如下 """ Ran 3 tests in 0.000s ... Evan----19 Lvan----20 Alex----21 """
作者:一个老宅男
微信:ZhengYing8887
出处:https://www.cnblogs.com/ZhengYing0813/
备注:本文版权归作者所有,欢迎转载和添加作者微信探讨技术,但未经作者同意必须在文章页面给出原文链接,否则保留追究法律责任的权利。