首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在测试之间共享全局变量?

如何在测试之间共享全局变量?
EN

Stack Overflow用户
提问于 2017-06-08 17:14:20
回答 9查看 73.4K关注 0票数 37

我在conftest.py中有一个全局变量,并在测试中使用它。例如:

conftest.py

代码语言:javascript
运行
复制
api_version = 'v25'
api_url = 'http://www.foobar.com/' + api_version

test_foo.py

代码语言:javascript
运行
复制
from conftest import api_url
import requests

@pytest.fixture
def data():
    return requests.request("GET", api_url)

test_bar(data):
    assert data is not None

现在,我希望能够将api_version从cmd更改为测试其他api版本。因此,我以以下方式修改了conftest.py:

conftest.py

代码语言:javascript
运行
复制
api_url = None

def pytest_addoption(parser):
    parser.addoption("--api_version", action="store", default="v25", help="By default: v25")

@pytest.fixture(autouse=True, scope='session')
def cmd_param(pytestconfig):
    api_version = pytestconfig.getoption("--mobile_api_ver").lower()
    global api_url
    if api_version in ['v24', 'v25', 'v26', 'v27']:
        api_url = 'http://www.foobar.com/' + api_version
    else:
        raise ValueError('Unknown api version: ' + api_version)

但是,这并不像我预期的那样工作,因为所有导入都在安装之前执行,而test_foo import api_url = None cmd_param cmd_param重新定义之前都会执行。然后编写get_api_url方法并从测试模块调用它:

conftest.py

代码语言:javascript
运行
复制
api_url = None

def pytest_addoption(parser):
    parser.addoption("--api_version", action="store", default="v25", help="By default: v25")

@pytest.fixture(autouse=True, scope='session')
def cmd_param(pytestconfig):
    api_version = pytestconfig.getoption("--mobile_api_ver").lower()
    global api_url
    if api_version in ['v24', 'v25', 'v26', 'v27']:
        api_url = 'http://www.foobar.com/' + api_version
    else:
        raise ValueError('Unknown api version: ' + api_version)

def get_api_url():
    return api_url

但现在我也被迫改变了test_foo.py:

test_foo.py

代码语言:javascript
运行
复制
from conftest import get_api_url
import requests

@pytest.fixture
def data():

    return requests.request("GET", get_api_url())

test_bar(data):
    assert data is not None

这是可行的,但解决方案看起来很尴尬。是否有更优雅的方法使用自定义cmd选项而不更改测试文件?

EN

Stack Overflow用户

发布于 2017-06-13 06:33:10

我不想搞乱全局变量。只需定义您的工具来返回一个值并在测试中使用该工具:类似@milo发布的内容,但要简单得多。

此外,您还定义了--api_version CLI选项,但在您的夹具中访问了--mobile_api_ver选项。此外,您的测试只是检查响应对象是否为None,而后者永远不会是None,因此即使响应为404状态,assert语句也将始终通过,请参见内联注释。

下面是一些可以工作的代码:

conftest.py含量

代码语言:javascript
运行
复制
import pytest


def pytest_addoption(parser):
    parser.addoption("--api_version", action="store", default="v25", help="By default: v25")


@pytest.fixture(scope='session')
def api_url(pytestconfig):
    api_version = pytestconfig.getoption("--api_version").lower()
    if api_version in ['v24', 'v25', 'v26', 'v27']:
        return 'http://www.foobar.com/' + api_version
    else:
        raise ValueError('Unknown api version: ' + api_version)

test_foo.py含量

代码语言:javascript
运行
复制
import pytest
import requests


@pytest.fixture
def data(api_url):  # probably a good idea to rename your fixture to a api_response or change what fixture returns.
    return requests.get(api_url)


def test_bar(data):
    print(data.text)
    # below you are not testing data, but merely checking that response object is not None
    assert data is not None  # this will always pass

    # you probably want to test status code and response content
    assert data.status_code == 200
    assert data.json()

运行测试:pytest -vvv --api_version v24 test_foo.py

票数 10
EN
查看全部 9 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44441929

复制
相关文章

相似问题

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