自动化测试-ddt数据驱动yaml文件实战(详细)

前言

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 列表结构
以 - 开头的行表示构成一个数组


# 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连接,最后使用+代表时区

2、实例详细

pip install pyyaml

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

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

A1


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}

}]

"""

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

A2

 

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":{}}

----------------------------------------------------------------------

"""

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

A3

 

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

"""

最后感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:

这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值