将夹具传递给PyTest中的辅助函数?

时间:2017-08-28 16:52:13

标签: python pytest

我有一个需要在我的测试套件中使用灯具的功能。这只是一个小辅助函数,有助于生成完整的URL。

def gen_url(endpoint):
    return "{}/{}".format(api_url, endpoint)

我在conftest.py中有一个返回URL的夹具:

@pytest.fixture(params=["http://www.example.com"])
def api_url(request):
    return request.param

@pytest.fixture(params=["MySecretKey"])
def api_key(request):
    return request.param

最后,在我的测试功能中,我需要调用我的gen_url

def test_call_action_url(key_key):
    url = gen_url("player")
    # url should equal: 'http://www.example.com/player'
    # Do rest of test here...

但是,当我执行此操作时,会抛出一个错误,指出api_url在调用gen_url时未定义。如果我将api_url添加为第二个参数,我需要将其作为第二个参数传递。那不是......我不想做的事。

我可以将api_url作为第二个参数添加到gen_url,而无需从测试中传递它吗?为什么我不能在我的api_key函数中使用它test_*

2 个答案:

答案 0 :(得分:3)

如果你使gen_url成为一个固定装置,它可以在没有明确传递的情况下请求api_url

@pytest.fixture
def gen_url(api_url):
    def gen_url(endpoint):
        return '{}/{}'.format(api_url, endpoint)
    return gen_url


def test_call_action_url(api_key, gen_url):
    url = gen_url('player')
    # ...

此外,如果api_key仅用于发出请求,则为TestClient类 可以封装它,因此测试方法只需要客户端:

try:
    from urllib.parse import urljoin  # Python 3
except ImportError:
    from urlparse import urljoin  # Python 2

import requests

@pytest.fixture
def client(api_url, api_key):
    class TestClient(requests.Session):
        def request(self, method, url, *args, **kwargs):
            url = urljoin(api_url, api_key)
            return super(TestClient, self).request(method, url, *args, **kwargs)

    # Presuming API key is passed as Authorization header
    return TestClient(headers={'Authorization': api_key})


def test_call_action_url(client):
    response = client.get('player')  # requests <api_url>/player
    # ...

答案 1 :(得分:0)

您的代码存在多个问题,在您的测试代码中看不到夹具,除非您将其用作测试参数,否则您不会同时将夹具(api_urlapi_key)传递给您的测试功能以及随后的辅助功能。 这是修改后的代码(未经测试)

def gen_url(api_url, endpoint):
   return "{}/{}".format(api_url, endpoint)

def test_call_action_url(api_url, api_key):
   url = gen_url(api_url, "player")
   # url should equal: 'http://www.example.com/player'
   # Do rest of test here with api_key here...