Selenium pytest 框架中,需要实现命令行自定义参数的功能,但是需要在其他模块使用怎么处理呢?

wwasdassss · 2023年08月23日 · 最后由 wwasdassss 回复于 2023年08月24日 · 6039 次阅读

在网上看见 pytest 框架有一个自定义命令行参数的功能,但是只能在 testcase 层调用,我想在 basepage 层调用自定义的参数,应该如何处理呢?

如图,想在 base 层调用图中的 host,我需要怎么弄呢?😭 😭 😭 😭

共收到 8 条回复 时间 点赞

按我的理解,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 继续调用

REXLEE 回复

不是的,我想在 common 里面调用自定义的参数

ALLEN 回复

我的需求就是,base 层定义了一个判断方法,0 开启 1 不开启,想在命令行模式输入自定义参数是否开启它

Mr.Shuo 回复

想用命令行的方式改某些参数

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