unittest測試框架之DDT數據驅動
ddt的使用
DDT數據驅動
- DDT:Data Driver Test(數據驅動測試)
- 數據驅動思想:數據和用例進行分離,通過外部數據去生成測試用例
安裝
pip install ddt
修改ddt源碼(是為了在生成的測試報告中顯示每條用例所對應的標題title)
- ddt文件中的ddt()方法
- 把原來的test_data_docstring = _get_test_data_docstring(func, v)注釋掉
- 如果數據是用對象來保存的,就添加test_data_docstring = v.title
- 如果數據使用字典來保存的,就添加test_data_docstring = v["title"]
- 修改后生成的測試報告就能把title列顯示到測試報告中
- 注意:title要是Excel表中的列名
def ddt(cls):
for name, func in list(cls.__dict__.items()):
if hasattr(func, DATA_ATTR):
for i, v in enumerate(getattr(func, DATA_ATTR)):
test_name = mk_test_name(name, getattr(v, "__name__", v), i)
# test_data_docstring = _get_test_data_docstring(func, v) # 原來的
# test_data_docstring = v.title # 數據使用對象來保存,改成這樣
test_data_docstring = v["title"] # 數據使用字典來保存,改成這樣
if hasattr(func, UNPACK_ATTR):...
else:
add_test(cls, test_name, test_data_docstring, func, v)
delattr(cls, name)
elif hasattr(func, FILE_ATTR):...
return cls
在測試類中使用ddt數據驅動獲取數據(這時一個測試用例類只需要一個測試方法就可以)
先准備一個簡單的登陸功能函數
def login(name=None, pwd=None):
if name and pwd:
if name == "desire" and pwd == "123456":
return {"code": 0, "msg": "登陸成功"}
else:
return {"code": 1, "msg": "賬號密碼錯誤"}
else:
return {"code": 1001, "msg": "不能有空值"}
准備excel測試用例表格

導入ddt模塊
from ddt import ddt, data
創建測試用例類,加上ddt裝飾器@ddt
@ddt
class LoginTestCase(unittest.TestCase):
# DATA_DIR:測試用例存放的路徑,用os模塊進行拼接excel用例表格的路徑
excel_path = os.path.join(DATA_DIR, 'cases.xlsx')
login = ReadExcel(excel_path, "login")
# 讀取數據(字典形式)
login_datas = login.read_data_dict()
# 讀取數據(類的形式)
# login_datas = login.read_data_obj()
創建測試用例方法,加上ddt裝飾器@data
@data()里面傳的參數要進行拆包,把每次的數據傳到方法里case參數
@data(*login_datas)
def test_login(self, case):
pass
第一步:准備用例數據
①:字典形式取值(使用時需要修改ddt源文件為字典形式)
# 1.參數
login_data = eval(case["data"])
# 2.預期結果
expected = eval(case["expected"])
# 3.用例序號
case_id = case["case_id"]
②:類形式取值(使用時需要修改ddt源文件為類形式)
# 1.參數
login_data = eval(case.data)
# 2.預期結果
expected = eval(case.expected)
# 3.用例序號
case_id = case.case_id
第二步:執行功能函數,獲取實際結果
result = login(*login_data)
第三步:通過斷言比對預期結果和實際結果
try:
self.assertEqual(expected, result)
except AssertionError as a:
# 把用例未通過結果寫入excel中(調用[ReadExcel](https://www.cnblogs.com/desireyang/p/12059916.html)類中的寫入方法)
self.login.write_data(row=case_id + 1, column=5, value="用例未通過")
raise a
else:
self.login.write_data(row=case_id + 1, column=5, value="用例通過")
直接可以運行測試用例類,會把自動化測試結果寫入到excel中
