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

Posted 上海-悠悠

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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

以上是关于httprunner 2.x学习20 - HttpRunner().run()连续执行2个不同项目,只会解析到第一个项目的debugtalk.py的主要内容,如果未能解决你的问题,请参考以下文章

httprunner 2.x学习18 - 报告validate显示LazyString($msg)问题解决

httprunner 2.x学习19 - 参数化显示不同的用例标题$title

httprunner 2.x学习16 - 调用HttpRunner类执行用例

httprunner 2.x学习15

httprunner2.x学习1-环境与登录接口案例

httprunner 2.x学习10-上传文件(upload关键字使用)