pytest之pytest_generate_tests(metafunc)


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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM