自动化测试之 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
"""

 

posted @ 2020-12-07 21:53  一个老宅男  阅读(442)  评论(0编辑  收藏  举报