添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

一、上篇文章我们使用了 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):单个的、不可再分的值
  • # 结果如下 { ' 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 纯量 - 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
    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)
    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