1、生成(多個)對測試函數的參數化調用。實際上與裝飾器pytest.mark.parametrize()作用一樣(代碼很挫,垃圾回收很滑稽)
def pytest_generate_tests(metafunc): """ 根據測試配置或定義測試函數的類或模塊中指定的值生成測試用例, 在測試用例參數化收集前調用此鈎子函數 :param metafunc:共有五個屬性值 metafunc.fixturenames:參數化收集時的參數名稱 metafunc.module:使用參數名稱進行參數化的測試用例所在的模塊d對象 metafunc.config:測試用例會話 metafunc.function:測試用例對象,即函數或方法對象 metafunc.cls: 測試用例所屬的類的類對象 :return: none """ #print(metafunc.fixturenames) # 測試用例中有casename、caserequest、caseexpect這三個fixture時,開始為測試用例設置參數化 if __GetRegionCoutry_testdata: return if all(list(filter(is_in_fixturename, metafunc.fixturenames))) and (list(filter(is_in_fixturename, metafunc.fixturenames))): # 所有測試函數的參數化的測試數據(測試用例名字、測試用例的測試數據、測試用例的預期結果) all_case_parametrize = [] case_parametrize = [] # 正在運行的測試函數的函數名或方法名 current_function_name = metafunc.function.__qualname__ # 正在檢測的測試函數所在模塊的名字 current_function_in_module_name = metafunc.module # 從yaml中取出測試用例的測試數據 testdata_dict = __GetRegionCoutry_testdata #print(testdata_dict.keys()) # 從模塊中提取不需要參數化的測試函數名字 testcase = current_function_in_module_name.__dict__ del testcase[current_function_name] if not testcase: raise NameError("testcase字典為空") not_parametrize_testcase = [key for key in testcase.keys() if "Rightrequest" in key] # 不需要參數化的測試函數所需的測試數據 #__GetRegionCoutry_testdata = [dict((i, testdata_dict[i])) for i in not_parametrize_testcase if i in testdata_dict.keys()] if not not_parametrize_testcase: raise NameError("not_parametrize_testcase字典為空") # print(not_parametrize_testcase) for i in not_parametrize_testcase: if i in testdata_dict.keys(): # 不需要參數化的測試數據 #print(i) __GetRegionCoutry_testdata[i] = copy.deepcopy(testdata_dict[i]) # 需要參數化的測試數據 del testdata_dict[i] #print(__GetRegionCoutry_testdata.keys()) #print("----------") #print(testdata_dict.keys()) for key, value in testdata_dict.items(): case_parametrize.clear() case_parametrize.append(key) case_parametrize.append(value["request"]) case_parametrize.append(value["expect"]) all_case_parametrize.append(tuple(case_parametrize)) else: if not all_case_parametrize: raise NameError("all_casez_parametrize列表為空") # 在測試用例運行前,對測試函數進行參數化設置 metafunc.parametrize("casename, caserequest, caseexpect", all_case_parametrize) print("---") # 垃圾回收 del testdata_dict del testcase del current_function_name del not_parametrize_testcase del case_parametrize del all_case_parametrize