甘肃省建设厅官网站,wordpress 改邮箱,长春网站建设手机版,广告设计需要学什么知识1、数据驱动介绍#xff1a;
ddt.ddt#xff08;类装饰器#xff0c;申明当前类使用ddt框架#xff09;ddt.data#xff08;函数装饰器#xff0c;用于给测试用例传递数据#xff09;#xff0c;支持传python所有数据类型#xff1a;数字#xff08;int#xff0c;…
1、数据驱动介绍
ddt.ddt类装饰器申明当前类使用ddt框架ddt.data函数装饰器用于给测试用例传递数据支持传python所有数据类型数字intlongfloatcompix)字符串列表1ist元组tuple集合编写阅读数据文件的函数、data入口参数加*读取ddt.unpack函致装饰器将传输的数据包解包一般作用于元组tuple和列表list、字典参数名字和个数需要与字典的键保持一致数组、字符串不需要ddt.file_data函数装饰器可直接读取yaml/json文件2、数据驱动和关键驱动的区别
Data-Driven TestsDDT即数据驱动测试可以实现不同数据运行同一个测试用例。ddt本质其实就是装饰器一组数据一个场景。关键字驱动核心把业务逻相封装成关键字login只需要调用login。3、混合驱动模式关键字驱动数据驱动 4、在进行数据驱动测试实战需要在测试类上使用ddt.ddt装饰器在测试用例上使用ddt.data装饰器。
1单一参数导包——写一个参数列表、数字、字符串-----设置ddt.data装饰器写入参数名----方法中写入形参*data----调用参数内容
2多参数的数据驱动测试(一个测试参数中含多个元素)导包——设置ddt装饰器——设置unpack解包——写入参数——形参传递——调用
3txt文件传参
4json文件传参
5yaml文件传参
6xlsx文件传参
注意Python中传递可变参数*代表顺序阅读列表类型**代表顺序阅读对象(字典)类型点击阅读可变参数部分可了解相关机制
# 1、单一参数的数据驱动# 前置步骤
# 使用语句import unittest导入测试框架
# 使用语句from ddt import ddt, data导入单一参数的数据驱动需要的包# 示例会执行三次test参数分别为666,777,888
import ddt
import unittest
ddt.ddt # 设置ddt装饰器
class BasicTestCase(unittest.TestCase):ddt.data(666, 777, 888) # 设置data装饰器并将传入参数写进括号def test(self, *data): # test入口设置形参print(数据驱动的number:, data)
# 程序会执行三次测试入口参数分别为666、777、888# 2、多参数的数据驱动
# 在单一参数包的基础上额外导入一个unpack的包from ddt import ddt, data, unpack
# 步骤导包——设置ddt装饰器——设置unpack解包——写入参数——形参传递——调用
import ddt
import unittestTestdata [{username: admin, password: 123456, excepted: {code: 200, msg: 登录成功}},{username: None, password: 1234567, excepted: {code: 400, msg: 用户名或密码不能为空}},{username: admin, password: None, excepted: {code: 400, msg: 用户名或密码不能为空}},{username: admin, password: 123456789, excepted: {code: 404, msg: 用户名或密码错误}},
]ddt.ddt
class BasicTestCase(unittest.TestCase):#方式一直接将列表放到dataddt.data([张三, 18], [李四, 19]) # 设置data装饰器并将同一组参数写进中括号[]ddt.unpack # 设置unpack装饰器顺序解包缺少解包则相当于name [张三, 18]def test(self, name, age):print(姓名:, name, 年龄:, age)
# 程序会执行两次测试入口参数分别为[张三, 18],[李四, 19]#方式二写一个列表后使用*访问列表到dataddt.data(*Testdata)ddt.unpack # 设置unpack装饰器顺序解包def test_DataDriver(self, *Data):#print(DDT数据驱动实战演示, Data)res login.login_check(Testdata[username], Testdata[password])self.assertEqual(res, Testdata[excepted])#3、 txt文件接收参数
# 新建num文件txt格式# 1单一参数按行存储777888999# 2多参数txt文件# dict文件内容(参数列表)(按行存储)# 张三18# 李四19
# 编辑阅读数据文件的函数
# 记住读取文件一定要设置编码方式否则读取的汉字可能出现乱码
import ddt
import unittest
def read_num():lis [] # 以列表形式存储数据以便传入data区域with open(num.txt, r, encodingutf-8) as file: # 以只读r,编码方式为utf-8的方式,打开文件num,并命名为filefor line in file.readlines(): # 循环按行读取文件的每一行lis.append(line.strip(\n)) #单一参数每读完一行将此行数据加入列表元素记得元素要删除/n换行符#lis.append(line.strip(\n).split(,)) # 多参驱动删除换行符根据分割后列表为[张三18, 李四19, 王五20]return lis # 将列表返回,作为data接收的内容
ddt.ddt
class BasicTestCase(unittest.TestCase):ddt.data(*read_num()) # 入口参数设定为read_num(),因为返回值是列表所以加*表示逐个读取列表元素#txt表格有多少个值设置多少个接收参数的形参def test(self, name,age):print(数据驱动的number:, name,age)# 4、JSON文件传参数据分离
# 多参数——json文件
# 步骤和单一参数类似仅需加入unpack装饰器以及多参数传参入口
# dict文件内容(参数列表)(非规范json文件格式):
# 单一参数[666,777,888]
# 多个参数[[张三, 18], [李四, 19], [王五, 20]]
# 注意json文件格式字符串用双引号
import ddt
import unittest
import json
def read_dict_json():return json.load(open(dict.json, r, encodingutf-8)) # 使用json包读取json文件并作为返回值返回
ddt.ddt
class BasicTestCase(unittest.TestCase):ddt.data(*read_dict_json())ddt.unpack # 使用unpack装饰器解包def test(self, name, age): # 因为是非规范json格式所以形参名无限制下文会解释规范json格式print(姓名:, name, 年龄:, age)# 4、JSON文件传参数据分离
# json文件三种形式:
# 1单一参数[666,777,888]
# 2多个参数[[张三, 18], [李四, 19], [王五, 20]]
# 3JSON格式读取每一组参数以对象形式存储:
# [
# {name:张三, age:18},
# {name:李四, age:19},
# {name:王五, age:20}
# ]
# 单一参数时无需使用unpack多参数需要使用unpack解包注意json文件格式字符串用双引号
import ddt
import unittest
import json#方式1非正式json格式使用
def read_dict_json():return json.load(open(dict.json, r, encodingutf-8)) # 使用json包读取json文件并作为返回值返回#方式2JSON格式读取提取已读完后的json文件(字典形式)通过遍历获取元素并返回
def read_dict_json():lis []dic json.load(open(dict.json, r, encodingutf-8))# 此处加上遍历获取语句下文yaml格式有实例方法一样for item in dic:lis.append(item)return lisddt.ddt
class BasicTestCase(unittest.TestCase):ddt.data(*read_dict_json())ddt.unpack # 使用unpack装饰器解包def test(self, name, age): # 因为是非规范json格式所以形参名无限制下文会解释规范json格式print(姓名:, name, 年龄:, age)#5、多参数yaml
# 以对象形式存储yml数据(字典)
# yaml格式文件内容
# -
# name: 张三
# age: 18
# -
# name: 李四
# age: 19
# -
# name: 王五
# age: 20
# -号之后一定要打空格
# :号之后一定要打空格# 入口参数与数据参数key命名统一即可导入
import ddt
import unittest
import yaml
ddt.ddt
class BasicTestCase(unittest.TestCase):#方式1形参入口和数据参数key命名统一ddt.file_data(./data/dict.yml)def test(self, name, age): # 设置入口参数名字与数据参数命名相同即可print(姓名是, name, 年龄为, age)#方式2入口参数与数据参数命名不统一ddt.file_data(./data/dict.yml)def test(self, **cdata): # Python中可变参数传递的知识**按对象顺序执行print(姓名是, cdata[name], 年龄为, cdata[age]) # 通过对象访问语法即可调用
例子如下
方式一测试数据直接写成列表形式使用ddt.data(*Data)传值
##2.12.2 DDT在自动化测试中的应用(传列表)import ddt
import unittest# 给4条测试数据Testdata [{username: admin, password: 123456, excepted: {code: 200, msg: 登录成功}},{username: None, password: 1234567, excepted: {code: 400, msg: 用户名或密码不能为空}},{username: admin, password: None, excepted: {code: 400, msg: 用户名或密码不能为空}},{username: admin, password: 123456789, excepted: {code: 404, msg: 用户名或密码错误}},]
ddt.ddt
class TestModules(unittest.TestCase):def setUp(self):print(testcase beaning....)def tearDown(self):print(testcase ending.....)ddt.data(*Data)def test_DataDriver(self,Data):#print(DDT数据驱动实战演示,Testdata)res login.login_check(Testdata[username], Testdata[password])self.assertEqual(res, Testdata[excepted])
if __name__ __main__:unittest.main()
方式二数据写到方法形式readData()使用ddt.data(*readData())传值
import ddt
import unittest# 给4条测试数据
def readData():Testdata [{username: admin, password: 123456, excepted: {code: 200, msg: 登录成功}},{username: None, password: 1234567, excepted: {code: 400, msg: 用户名或密码不能为空}},{username: admin, password: None, excepted: {code: 400, msg: 用户名或密码不能为空}},{username: admin, password: 123456789, excepted: {code: 404, msg: 用户名或密码错误}},]return TestDataddt.ddt
class TestModules(unittest.TestCase):def setUp(self):print(testcase beaning....)def tearDown(self):print(testcase ending.....)ddt.data(*readData())def test_DataDriver(self,Data):#print(DDT数据驱动实战演示,Testdata)res login.login_check(Testdata[username], Testdata[password])self.assertEqual(res, Testdata[excepted])
if __name__ __main__:unittest.main()