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

AWSL · September 30, 2020 · Last by AWSL replied at October 08, 2020 · 2224 hits

如题: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每个大版本升级都不兼容之前的用例,真是有点坑

小酷 回复

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

AWSL 回复

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

AWSL #6 · October 01, 2020 作者
小酷 回复

问题是,不会呐😅

AWSL #7 · October 04, 2020 作者

解决了:生冷粗暴,弄一个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 或者 ';'
AWSL #9 · October 08, 2020 作者
hellohell 回复

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

需要 Sign In 后方可回复, 如果你还没有账号请点击这里 Sign Up