接口测试 [已解决] httprunner3.x 不支持--dot_env_path 的问题,曲线救国的办法在 7 楼

我去催饭 · 2020年09月30日 · 最后由 我去催饭 回复于 2020年10月08日 · 3061 次阅读

如题:https://github.com/httprunner/httprunner/issues/1008
【命令行读取环境变量文件的参数在 3.* 版本不见了,希望加上 --dot-env-path】
不想用低版本,有没有办法绕过这个问题,改源码有点不现实。

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
共收到 9 条回复 时间 点赞
def load_dot_env_file(dot_env_path: Text) -> Dict:
    """ load .env file.

    Args:
        dot_env_path (str): .env file path

    Returns:
        dict: environment variables mapping

            {
                "UserName": "debugtalk",
                "Password": "123456",
                "PROJECT_KEY": "ABCDEFGH"
            }

    Raises:
        exceptions.FileFormatError: If .env file format is invalid.

    """
    if not os.path.isfile(dot_env_path):
        return {}

    logger.info(f"Loading environment variables from {dot_env_path}")
    env_variables_mapping = {}

    with open(dot_env_path, mode="rb") as fp:
        for line in fp:
            # maxsplit=1
            if b"=" in line:
                variable, value = line.split(b"=", 1)
            elif b":" in line:
                variable, value = line.split(b":", 1)
            else:
                raise exceptions.FileFormatError(".env format error")

            env_variables_mapping[
                variable.strip().decode("utf-8")
            ] = value.strip().decode("utf-8")

    utils.set_os_environ(env_variables_mapping)
    return env_variables_mapping

这个方法现在用不了了?

恒温 回复

用不了,hrun -H 里都没有这个参数了

老项目最好不要升级版本了,httprunner 每个大版本升级都不兼容之前的用例,真是有点坑

cool 回复

我就是 3.x 才开始用的,跟着一步一步走下来的,现在遇到这个坑

我去催饭 回复

我记得 httprunner 有 python 方法执行入口吧,封装一下,在执行之前加载自定义 env 数据,执行过程中再去获取

cool 回复

问题是,不会呐😅

解决了:生冷粗暴,弄一个 py 文件,读取配置文件然后全量替换.env 里的文本内容

def switch_env(filepath):
    cur_path = os.path.dirname(os.path.abspath('')) 
    print("cur_path:",cur_path)
    re_data=os.path.join(cur_path, filepath + ".txt")
    env_file=os.path.join(cur_path,'.env')
    #print("要替换的env:", re_data)
    data_renew=""
    with open(re_data, 'r',encoding="utf-8") as ff:
        for line in ff:
            line = line.strip()
#忽略配置文件的注释行
            if not len(line) or line.startswith('#'):        
                continue
            else:
                data_renew += line+'\n'
        print(data_renew)
    with open(env_file,'w',encoding="utf-8") as f:
        f.write(data_renew)
    #print(data_renew)
    return data_renew


if __name__ == "__main__":
    #用于jenkins读取参数执行
    filepath=sys.argv[1]
    config=switch_env(filepath) 

两个疑问

  • cur_path = os.path.dirname(os.path.abspath('')) , 假设,被执行的文件在 com 目录下,如 com/main.py, 那么在不同的目录中执行

    python main.py
    python com/main.py

cur_path 得到是同样的值么? 当然,即使不一样,应用场景锁定了,不一样也无所谓。

  • continue 看着有点奇怪啊,它后面什么代码都没有啊。 为什么 不直接写 pass 或者 ';'
hellohell 回复

cur_path = os.path.dirname(os.path.abspath('')) 这个我就是把.env 和我用来替换的文件放在同一个目录下的。continue 那个也就是过滤一下 # 注释的内容,因为.env 文件格式校验很严格,必须要字典形式的不能掺杂注释。

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册