注:这篇博客专门介绍自动化数据驱动的实现方式
一、unittest实现数据驱动(ddt)
1.1、什么是DDT?
data driver test数据驱动测试,可以完美的和unittest结合实现数据驱动
1.2、DDT中的装饰器
- @ddt:装饰类,作用是用于申明当前类使用ddt数据驱动
- @data: 装饰函数,作用是给函数传值
- @unpack:装饰函数,作用是数据解包
- @file_data:装饰函数,作用是直接读yaml、json文件
1.3、代码示例
示例一:
注意:传几个值,就会运行几次
import unittest
from ddt import ddt, data
from base.base_util import BasUtil
@ddt
class TestLogin(BasUtil):
@data("值1","值2","值3")
def test_01_login(self, args):
print(args)
if __name__ == '__main__':
unittest.main()
返回
test_login.py .值1
.值2
.值3
[100%]
============================== 3 passed in 21.43s ==============================
示例二:如果我们要传入测试数据,可以写成列表的形式传入
import unittest
from ddt import ddt, data
from base.base_util import BasUtil
@ddt
class TestLogin(BasUtil):
@data([1, "key1", "value1"], [2, "key2", "value2"])
def test_01_login(self, args):
print(args)
if __name__ == '__main__':
unittest.main()
返回:
test_login.py .[1, 'key1', 'value1']
.[2, 'key2', 'value2']
[100%]
============================== 2 passed in 19.24s ==============================
示例三:通过excel读取数据来实现数据驱动
1.将数据写入excel
2.封装读取excel的方法
from pathlib import Path
import openpyxl
class ExcelUtil(object):
def __init__(self):
# 项目目录
self.base_dir = Path(__file__).parent.parent
# openpyxl(更多用这个)、xlrd
def read_excel(self):
# 第一步:加载文件
wb = openpyxl.load_workbook('%s/data/testdata.xlsx' % self.base_dir)
# 第二步:获得sheet对象
sheet = wb['login']
# 第三步:获得excel的行数和列数
# print(sheet.max_row, sheet.max_column)
all_list = []
for rows in range(2, sheet.max_row+1): # 第二行开始,去掉行标题
temp_list = []
for cols in range(1, sheet.max_column+1):
# print(sheet.cell(rows, cols).value)
temp_list.append(sheet.cell(rows, cols).value)
all_list.append(temp_list)
# print(all_list)
return all_list
if __name__ == '__main__':
ExcelUtil().read_excel()
返回(处理后的数据)
[[1, 'a', 'aaaaaa'], [2, 'aa', 'a'], [3, 'aa', 'aaaaaa']]
在用例中传入:
import unittest
from ddt import ddt, data
from base.base_util import BasUtil
from common.excel_util import ExcelUtil
@ddt
class TestLogin(BasUtil):
@data(*ExcelUtil().read_excel()) # * 可以进行序列解包
def test_01_login(self, args):
print(args)
if __name__ == '__main__':
unittest.main()
返回:
test_login.py .[1, 'a', 'aaaaaa']
.[2, 'aa', 'a']
.[3, 'aa', 'aaaaaa']
[100%]
============================== 3 passed in 20.77s ==============================
3.@unpack数据解包后
原因:因为读取excel处理数据后,args是列表,@unpack的作用就是数据解包吗,这时,接收参数需要用解包后参数个数相同的变量来接收
代码:
import unittest
from ddt import ddt, data, unpack
from base.base_util import BasUtil
from common.excel_util import ExcelUtil
@ddt
class TestLogin(BasUtil):
@data(*ExcelUtil().read_excel()) # * 可以进行序列解包
@unpack # 作用:数据解包 (解包前args都是列表的形式)
def test_01_login(self, index, username, password): # 解包后需要与数据相同个数的参数来接收
print(index, username, password)
if __name__ == '__main__':
unittest.main()
返回:
test_login.py .1 a aaaaaa
.2 aa a
.3 aa aaaaaa
[100%]
============================== 3 passed in 21.66s ==============================
4.数据驱动测试登录
import unittest
from ddt import ddt, data, unpack
from base.base_util import BasUtil
from common.excel_util import ExcelUtil
from page_objects.login_page import LoginPage
@ddt
class TestLogin(BasUtil):
@data(*ExcelUtil().read_excel()) # * 可以进行序列解包
@unpack # 作用:数据解包 (解包前args都是列表的形式)
def test_01_login(self, index, username, password): # 解包后需要与数据相同个数的参数来接收
lp = LoginPage(self.driver)
lp.login(username, password)
if index == 1:
self.assertEqual(lp.assert_login(), "退出登录")
if __name__ == '__main__':
unittest.main()
返回
test_login.py ... [100%]
============================== 3 passed in 23.59s ==============================