首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从一个函数中的pytest fixture中获取返回值,这样我就不需要用额外的参数调用这个函数了?

如何从一个函数中的pytest fixture中获取返回值,这样我就不需要用额外的参数调用这个函数了?
EN

Stack Overflow用户
提问于 2018-11-16 01:54:26
回答 1查看 3.1K关注 0票数 1

我在conftest.py中有以下fixture,它返回一个环境设置字典,如用户、密码等:

代码语言:javascript
复制
@pytest.fixture
def envparams(request):
    env = request.config.getoption("--env")
    return env_params[env]

然后我有像这样的模块:

代码语言:javascript
复制
def request_master_url(envparams):
    cje_master_url = envparams['url']+'/'+test_master
    cje_user = envparams['user']
    cje_pass = envparams['password']
    local = testinfra.get_host("ssh://localhost")
    results = local.command(
                        'curl -L -I --user '+cje_user+':'
                        + cje_pass+' '+cje_master_url+'| grep HTTP\
                        |tail -1').stdout
    if '200 OK' in results:
        return True
    else:
        return False

以及使用此模块的测试,如:

代码语言:javascript
复制
def test_cje_high_availability(envparams, env_option, script_loc):
    workstation = testinfra.get_host('ssh://'+testinfra_hosts[0])
    if not security.request_master_url(envparams):
        print(test_master+' - is not available\n')
        create_team_master(test_master, envparams, script_loc)

我能不能从模块函数中去掉envparams参数,这样我就可以在没有额外参数的情况下调用它了?像这样:

代码语言:javascript
复制
security.request_master_url(envparams)

我只需要在一个会话中设置这个夹具一次。我试着使用:

代码语言:javascript
复制
@pytest.mark.usefixtures('envparams')
def request_master_url():

但是,我不确定如何从这个fixture中获取返回值。

EN

回答 1

Stack Overflow用户

发布于 2018-12-06 23:56:13

好吧,我已经按照hoefling的建议做了。

在conftest.py中创建了小函数:

代码语言:javascript
复制
def get_env_params():
    env_name = pytest.config.getoption("--env")
    return env_params[env_name]

并在需要的地方从我的模块函数调用它。示例函数如下所示:

代码语言:javascript
复制
def request_master_url(team_id):
    envparams = get_env_params()
    cje_master_url = envparams['url']+'/'+team_id
    cje_user = envparams['user']
    cje_pass = envparams['password']
    local = testinfra.get_host("ssh://localhost")
    results = local.command(
                        'curl -L -I --user '+cje_user+':'
                        + cje_pass+' '+cje_master_url+'| grep HTTP\
                        |tail -1').stdout
    if '200 OK' in results:
        return True
    else:
        return False

从更多的函数中删除了不必要的fixture,并且能够清理我的代码。谢谢!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53325313

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档