我有一个需要在我的测试套件中使用灯具的功能。这只是一个小辅助函数,有助于生成完整的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_*
?
答案 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_url
和api_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...