前言

ddt 驱动 yaml/yml 文件来实现数据驱动测试

ddt.file_data:装饰测试方法,参数是文件名。文件可以是 json 或者 yaml 类型。

注意:如果文件是以 “.yml”或者".yaml" 结尾,ddt 会作为 yaml 类型处理,其他文件都会作为 json 文件处理。

如果文件是列表,列表的值会作为测试用例参数,同时,会作为测试用例方法名后缀显示。

如果文件是字典,字典的 key 会作为测试用例方法的后缀显示,字典的 value 会作为测试用例参数。

1、yaml 文件基础格式要求

基础语法:
大小写敏感;
使用缩进表示层级关系;
缩进不允许使用 tab,只允许空格;
缩进的空格数不重要,只要相同层级的元素左对齐即可;
‘#’ 表示注释;

YAML 支持以下几种数据类型:
对象:键值对的集合,又称为映射(mapping)/ 哈希(hashes) / 字典(dictionary)  
数组:一组按次序排列的值,又称为序列(sequence) / 列表(list)  
纯量(scalars):单个的、不可再分的值  
yaml 列表结构
以 - 开头的行表示构成一个数组

  1. # data.yaml 文件内容

  2. -

  3. data1

  4. -

  5. data2

  6. -

  7. data3

  8. import yaml

  9. f = open("data", encoding="utf8")

  10. v = yaml.load(f)

  11. print(v)

  12. print(type(v))

  13. f.close()

  14. # 结果如下

  15. ['data1', 'data2', 'data3']

  16. <class 'list'>

yaml 多维列表结构

  1. # data.yaml 文件内容

  2. -

  3. - data1

  4. - data2

  5. -

  6. data3

  7. import yaml

  8. f = open("data", encoding="utf8")

  9. v = yaml.load(f)

  10. print(v)

  11. print(type(v))

  12. f.close()

  13. # 结果如下

  14. [['data1', 'data2'], 'data3']

  15. <class 'list'>

yaml 字典结构
字典结构没有 -
冒号前为键,冒号后为值
冒号后面一定要空格

  1. # data.yaml 文件内容

  2. username : admin

  3. password : "123456"

  4. import yaml

  5. f = open("data", encoding="utf8")

  6. v = yaml.load(f)

  7. print(v)

  8. print(type(v))

  9. f.close()

  10. # 结果如下

  11. {'username': 'admin', 'password': '123456'}

  12. <class 'dict'>

yaml 多维字典结构

  1. # data.yaml 文件内容

  2. data :

  3. username: admin

  4. password: "123456"

  5. code : "0000"

  6. msg : "登录成功!"

  7. import yaml

  8. f = open("data", encoding="utf8")

  9. v = yaml.load(f)

  10. print(v)

  11. print(type(v))

  12. f.close()

  13. # 结果如下

  14. {'data': {'username': 'admin', 'password': '123456'}, 'code': '0000', 'msg': '登录成功!'}

  15. <class 'dict'>

列表 + 字典,复杂结构

  1. # data.yaml 文件内容

  2. -

  3. username : admin

  4. password : "123456"

  5. -

  6. username : Evan

  7. password : xxxxxx

  8. import yaml

  9. f = open("data", encoding="utf8")

  10. v = yaml.load(f)

  11. print(v)

  12. print(type(v))

  13. f.close()

  14. # 结果如下

  15. [{'username': 'admin', 'password': '123456'}, {'username': 'Evan', 'password': 'xxxxxx'}]

  16. <class 'list'>

yaml 纯量
字符串;布尔值;整数;浮点数;Null;时间;日期

  1. boolean:

  2. - TRUE #true,True都可以

  3. - FALSE #false,False都可以

  4. float:

  5. - 3.14

  6. - 6.8523015e+5 #可以使用科学计数法

  7. int:

  8. - 123

  9. - 0b1010_0111_0100_1010_1110 #二进制表示

  10. null:

  11. nodeName: 'node'

  12. parent: ~ #使用~表示null

  13. string:

  14. - 哈哈

  15. - 'Hello world' #可以使用双引号或者单引号包裹特殊字符

  16. - newline

  17. newline2 #字符串可以拆成多行,每一行会被转化成一个空格

  18. date:

  19. - 2018-02-17 #日期必须使用ISO 8601格式,即yyyy-MM-dd

  20. datetime:

  21. - 2018-02-17T15:02:31+08:00 #时间使用ISO 8601格式,时间和日期之间

使用T连接,最后使用+代表时区

2、实例详细

pip install pyyaml

注意:安装的包名为 pyyaml,但是导入的是 yaml

yaml 文件可以通过 open 函数来读取,然后通过 load() 方法转换成字典
如下图实例

A1

  1. import yaml

  2. f = open("ddt_data.yaml", encoding="utf8")

  3. print(yaml.load(f))

  4. f.close()

  5. # 运行结果如下

  6. """

  7. [{

  8. 'url': 'http://cms.duoceshi.cn/xxx/xxxx/xxxxx',

  9. 'method': 'post',

  10. 'header': {'Content-Type': 'application/x-www-form-urlencoded'},

  11. 'params': {'userAccount': 'admin', 'loginPwd': 123456}

  12. }]

  13. """

如下图为我的数据文件,且文件中数据类型为字典

A2

  1. import requests

  2. import unittest

  3. from ddt import ddt, file_data

  4. @ddt

  5. class CmsLogin(unittest.TestCase):

  6. @file_data("ddt_data.yaml")

  7. def testcase(self, method, url, header, params):

  8. res = requests.request(method, url, headers=header, data=params)

  9. print(res.text)

  10. if __name__ == '__main__':

  11. unittest.main()

  12. # 运行结果如下

  13. """

  14. Ran 2 tests in 0.215s

  15. ..

  16. {"code":"200","msg":"登录成功!","model":{}}

  17. {"code":"400","msg":"登录帐号不存在!","model":{}}

  18. ----------------------------------------------------------------------

  19. """

如下图为我的数据文件,且文件中数据类型为列表

A3


  1. import yaml

  2. from ddt import ddt, data, unpack

  3. def get_yml_data(yml_file):

  4. with open(yml_file, encoding="utf8") as f:

  5. return yaml.load(f)

  6. @ddt

  7. class CmsLogin(unittest.TestCase):

  8. @data(*get_yml_data("ddt_data.yml"))

  9. @unpack

  10. def testcase(self, name, age):

  11. print(name + "----" + str(age))

  12. if __name__ == '__main__':

  13. unittest.main()

  14. # 运行结果如下

  15. """

  16. Ran 3 tests in 0.000s

  17. ...

  18. Evan----19

  19. Lvan----20

  20. Alex----21

  21. """

感谢每一个认真阅读我文章的人!!!

作为一位过来人也是希望大家少走一些弯路,如果你不想再体验一次学习时找不到资料,没人解答问题,坚持几天便放弃的感受的话,在这里我给大家分享一些自动化测试的学习资源,希望能给你前进的路上带来帮助。

软件测试面试文档

我们学习必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有字节大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。

 

          视频文档获取方式:
这份文档和视频资料,对于想从事【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!以上均可以分享,点下方小卡片即可自行领取

Logo

一站式 AI 云服务平台

更多推荐