在网上看见 pytest 框架有一个自定义命令行参数的功能,但是只能在 testcase 层调用,我想在 basepage 层调用自定义的参数,应该如何处理呢?
如图,想在 base 层调用图中的 host,我需要怎么弄呢?
按我的理解,fixture 就是面向 testcase 的一个功能,底层决定了。
要实现你的需求,在非 testcase 模块或方法中自动调用,除非改源码 (一般不这么做,也很难),否则就得换思路。
你的需求描述不够详细,比如你可以把 host 方法写到一个自定义类中,然后添加一个动态调用的逻辑,在需要调用的时候去调用,不知道是否能帮到你
写一个全局变量存进去不就行了,在 basepage 读取这个变量,session 执行会优先于你的代码,所以这个变量是有值的
为什么要用 fixture 改配置,不直接读配置文件呢?
在最外部的 conftest.py,创建一个全局变量方法,用于对全局的变量进行储存和取值
在任何一个用例文件 ,任何一个用例中都可以存储值 和 读取值。
这个全局的 global_datas 是个字典,以键值对存储,以 key 取值,实现真正意义上的全局、跨文件、跨用例
#文件 conftest.py
global_datas = {}
@pytest.fixture
def global_data():
"""
从全局变量global_data中取值
:return:
"""
def _global_data(*args):
if len(args) == 2:
global_datas[args[0]] = args[1]
logging.info("全局数据 [存入] {}".format({args[0]: args[1]}))
elif len(args) == 1:
value = global_datas.get(args[0])
logging.info("全局数据 [获取] {}".format({args[0]: value}))
return value
else:
logging.error("全局参数函数入参数量有误,只支持一个或两个参数")
assert False
return _global_data
#文件 test_0001.py
def test_0006(self, global_data):
#global_data存储值
global_data('userId', "123")
#文件 test_0002.py
def test_0001(self, global_data):
#global_data取值
userId = global_data('userId')
我刚才可能没有看明白楼主的意思,你是想每个用例都能使用到 host,只需要将 conftest.py 文件放到最外层目录即可
如我的图中,conftest.py 是放在根目录的,全局有效
外部 conftest.py 参数或定义的全局方法,可以在里层的 conftest.py 继续调用