ddt函數(shù)內(nèi)部邏輯說明:
1、調(diào)用ddt這個函數(shù)時會把測試類當(dāng)成參數(shù)傳入進(jìn)來
2、獲取測試的所有屬性和方法,進(jìn)行遍歷
3节仿、判斷遍歷出來的屬性或方法有沒有設(shè)置標(biāo)記的屬性(可以使用測試數(shù)據(jù)字段標(biāo)記,并將測試數(shù)據(jù)設(shè)置成屬性值)
4掉蔬、如果有則說明這個方法用data裝飾器裝飾過
5廊宪、通過屬性值獲取所有的用例數(shù)據(jù)進(jìn)行遍歷
6、每遍歷出來一條數(shù)據(jù)女轿,生成一個用例方法名箭启, 再動態(tài)的給測試類添加用例方法
7、遍歷完所有用例數(shù)據(jù)之后蛉迹,刪除測試類原來定義的測試方法
8傅寡、最后返回測試類
def ddt(cls):
# 1、獲取到cls的所有屬性和方法
attrs = list(cls.__dict__.items())
# 2北救、遍歷所有屬性和方法
for FuncName, FuncValue in attrs:
# 3荐操、判斷是否被標(biāo)記
if hasattr(FuncValue, "params"):
# 4、獲取到測試用例數(shù)據(jù)
case_datas = FuncValue.params
# 5珍策、遍歷測試數(shù)據(jù)托启,拿到每組數(shù)據(jù)和對應(yīng)的下標(biāo)
for index, case_data in enumerate(case_datas, 1):
# 6、修改根據(jù)下標(biāo)后新的測試用例方法名
latestMethodName = "{}_{}".format(FuncName, index)
# 7攘宙、拿到改寫后方法
latestMethod = rewrite_method(FuncValue, case_data)
# 8屯耸、給這個類新增方法
setattr(cls, latestMethodName, latestMethod)
else:
# 9、刪除初始不需要執(zhí)行的用例方法
delattr(cls, FuncName)
return cls
def data(datas):
def mark_method(func):
# 給測試用例方法加個params標(biāo)記
func.params = datas
return func
return mark_method
# 改寫測試用例方法蹭劈,可以接收測試數(shù)據(jù)
# 傳入方法和對應(yīng)的方法數(shù)據(jù)
def rewrite_method(test_method, case_datas):
def lock_data(self):
# 改寫方法設(shè)置疗绣,可以傳入一個參數(shù)
test_method(self, case_datas)
return lock_data