2017-08-28 52 views
0

我有一个需要在我的测试套件中使用灯具的功能。这只是一个帮助生成完整URL的小帮助函数。在PyTest中将夹具传递给辅助函数?

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

我在conftest.py夹具返回的网址:

@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... 

当我这样做但是,它会抛出一个错误,说明调用gen_urlapi_url未定义。如果我添加api_url作为第二个参数,我需要将它作为第二个参数传递。这不是我想要做的。

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

+3

为什么你不想把'api_url'传递给'gen_url'? –

回答

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... 
1

如果您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 
    # ...