httprunner 2.x学习20 - HttpRunner().run()连续执行2个不同项目,只会解析到第一个项目的debugtalk.py

前言

调用HttpRunner().run() 连续执行2个不同的项目时,只会解析到第一个项目的debugtalk.py。

问题描述

下版本信息:
操作系统类型: windows
Python 版本 3.6.8
HttpRunner 版本 2.5.7

问题描述

比如我有 test 和 xxx两个项目,每个项目分别有不同的debugtalk.py文件内容

xxx项目debugtalk.py

def user():
    return "test5"
    
def get_userx():
    return "testxc"

test项目debugtalk.py

def get_user():
    return "test1"

运行命令

当我使用api方式调用执行用例,连续执行2个项目 xxx 和 test

from httprunner.api import HttpRunner

from pathlib import Path

p = Path(__file__)
p_project1 = p.parent.joinpath('xxx')
print(p_project1)
runner1 = HttpRunner(
                    # failfast=False,
                    save_tests=True,
                    log_level="DEBUG",
                )
summary1 = runner1.run(path_or_tests=str(p_project1.joinpath('api').resolve()),
                     )


p_project2 = p.parent.joinpath('test')
print(p_project2)
runner2 = HttpRunner(
                    # failfast=False,
                    save_tests=True,
                    log_level="DEBUG",
                )
summary2 = runner2.run(path_or_tests=str(p_project2.joinpath('api').resolve()),
                     )

此时生成的all.loaded.json 文件中可以看出
xxx项目加载的functions(第一次调用读到的debugtalk文件是对的)

{
    "project_mapping":{
        "env":{
            "userxxx":"test",
            "password":"123456"
        },
        "PWD":"D:\\soft\\hrun2_web_manager\\hrun2_web\\test",
        "functions":{
            "user":"<function user at 0x000002676F75C2F0>",
            "get_userx":"<function get_userx at 0x000002677195B268>"
        },
        "test_path":"D:\\soft\\hrun2_web_manager\\hrun2_web\\test\\api"
    },

text项目加载的functions (第二次读的还是第一个项目的debugtalk文件)

{
    "project_mapping":{
        "env":{
            "userxxx":"test",
            "password":"123456"
        },
        "PWD":"D:\\soft\\hrun2_web_manager\\hrun2_web\\xxx",
        "functions":{
            "user":"<function user at 0x000002676F75C2F0>",
            "get_userx":"<function get_userx at 0x000002677195B268>"
        },
        "test_path":"D:\\soft\\hrun2_web_manager\\hrun2_web\\xxx\\api"
    },

PWD 和 test_path 路径都是对的,但是functions 中读的始终是第一个项目的。
不知道如何才能让第二次执行项目读取对应项目的debugtalk文件内容?
有没大神能解答下,感激不尽!!!!

问题临时解决办法

找到问题原因了,load_debugtalk_functions(),导入importlib.import_module("debugtalk")后,
后面有同名称模块导入时,未重新加载,源代码在buildup.py

def load_debugtalk_functions():
    """ load project debugtalk.py module functions
        debugtalk.py should be located in project working directory.

    Returns:
        dict: debugtalk module functions mapping
            {
                "func1_name": func1,
                "func2_name": func2
            }

    """
    # load debugtalk.py module
    imported_module = importlib.import_module("debugtalk")
    return load_module_functions(imported_module)

临时解决办法,在调用api之前,打个补丁替换下源代码里面的load_debugtalk_functions 函数

from httprunner.loader import buildup
import importlib
"""
打个补丁,解决 debugtalk 导入不更新问题
"""


def new_load_debugtalk_functions():
    """ load project debugtalk.py module functions
        debugtalk.py should be located in project working directory.

    Returns:
        dict: debugtalk module functions mapping
            {
                "func1_name": func1,
                "func2_name": func2
            }

    """
    import sys
    if sys.modules.get('debugtalk'):
        imported_module = importlib.reload(sys.modules['debugtalk'])
    else:
        imported_module = importlib.import_module("debugtalk")
    return buildup.load_module_functions(imported_module)


buildup.load_debugtalk_functions = new_load_debugtalk_functions
posted @ 2022-04-01 09:12  上海-悠悠  阅读(267)  评论(0编辑  收藏  举报