## ddt的使用步骤:
1、测试类前面使用@ddt
2、在测试方法前使用@list_data(测试数据)
3、在测试方法中定义一个参数,用于接收用例数据
ddt:DataDriverTest(数据驱动测试)
思想:把测试数据和用例代码进行分离,通过外部数据去生成测试用例,方便后期维护,以及测试数据管理
ddt底层原理:
1、保存测试数据
2、遍历测试数据,生成测试方法
import unittest
from unittestreport import ddt,list_data
import requests
cases = [
{"excepted":{"code":0, "msg":"登陆成功"},"params":{"username":"aaa", "password":"123456"}},
{"excepted":{"code":1, "msg":"登陆失败"},"params":{"username":"aaa", "password":"123"}},
{"excepted":{"code":1, "msg":"登陆失败"},"params":{"username":" ", "password":"123456"}},
]
@ddt
class TestLogin(unittest.TestCase):
@list_data(cases)
def test_login(self, item):
data = item['params']
expected = item['expected']
res = login_check(**data)
self.assertEqual(expected, res)
import openpyxl
class HandleExcel:
def __init__(self, filename, sheetname):
'''
:param filename: excel文件名字
:param sheetname: 表单名
'''
self.filename = filename
self.sheetname = sheetname
def read_data(self):
# 加载excel工作簿
workbook = openpyxl.load_workbook(self.filename)
# 选中表单
sh = workbook[self.sheetname]
# 获取所有数据
cel = list(sh.rows)
# 变量第一行数据
tital = [i.value for i in cel[0]]
cases = []
# 遍历除第一行以外的行
for item in cel[1:]:
# 获取该行的数据
data = [i.value for i in item]
# 把第一行数据和当前行数据打包成字典
dic = dict(zip(tital, data))
# 把字典添加到列表中
cases.append(dic)
return cases
def write_data(self, row, column, value):
'''
:param row: 写入行
:param column: 写入列
:param value: 写入值
:return:
'''
workbook = openpyxl.load_workbook(self.filename)
sh = workbook[self.sheetname]
sh.cell(row=row, column=column, value=value)
workbook.save(self.filename)
def close_file(self):
self.close_file(self.filename)
if __name__ == '__main__':
t = HandleExcel("cases.xlsx", "login").read_data()
print(t)
import unittest
import os
import requests
from unittestreport import ddt,list_data
from commons.handle_excel import HandleExcel
from commons.handle_path import DATAS_DIR
from commons.handle_config import conf
from commons.tools import replace_data
from commons.handle_log import log
@ddt
class TestLogin(unittest.TestCase):
excel=HandleExcel(os.path.join(DATAS_DIR,'apicases.xlsx'),'login')
cases=excel.read_data()
@list_data(cases)
def test_login(self,item):
# 1、准备数据
url=conf.get('env','base_url')+item['url']
item['data']=replace_data(item['data'],TestLogin)
params=eval(item['data'])
method=item['method'].lower()
expected=eval(item['expected'])
# 2、请求接口
response=requests.request(method=method,url=url,json=params)
res=response.json()
code = response.status_code
print('请求参数:', params)
print('预期结果:', expected)
print('实际结果:', res)
print('返回码:', code)
# 3、断言
try:
self.assertEqual(expected['code'],code)
self.assertIn(expected['msg'],res.values())
except AssertionError as e:
log.error('用例-----【{}】-----执行不通过'.format(item['title']))
log.exception(e)
raise e
else:
log.info('用例-----【{}】------执行通过'.format(item['title']))