我有一个类
TestSecured
,其中有一些方法可以获取受保护的端点,因此您需要一个 jwt 来发出请求。我正在尝试优化我的测试类,这样我就不需要登录过程 3 次,而只需要 1 次,并在我的 3 个测试方法中使用相同的令牌。
@pytest.mark.usefixtures("client", "auth", "setup_user_and_token")
class TestSecured:
def test_get_operations(self, client, setup_user_and_token):
# headers = {'Authorization' : f'Beare {setup_user_and_token}'}
response = client.get(f'{SECURED_ROUTE}get-operations', headers=setup_user_and_token)
assert response.status_code == 200
def test_post_operation(self, client, auth):
return "ok"
def test_post_ope2(self,client,auth):
print("ok")
如果我在每个方法中使用
setup_user_and_token()
我创建的夹具。
@pytest.fixture(scope="class")
def setup_user_and_token(auth):
response = auth.login()
token = response.get_json()['access_token']
return {'Authorization' : f'Bearer {token}'}
但我只想使用
setup_class()
只执行一次此操作。我怎样才能做到这一点?
编辑:
下面是我的
conftest.py
文件,我在其中定义了一些装置:
@pytest.fixture
def app():
app = create_app({
'TESTING' : True,
})
yield app
with app.app_context():
db.drop_all()
@pytest.fixture
def client(app):
return app.test_client()
class AuthActions(object):
def __init__(self, client):
self._client = client
def login(self, username='test_user', password='test_pass'):
return self._client.post(
'/auth/login',
json={'username': username, 'password': password}
)
def logout(self):
return self._client.get('/auth/logout')
def auth(client):
return AuthActions(client)
@pytest.fixture(scope="class")
def setup_user_and_token(auth):
response = auth.login()
token = response.get_json()['access_token']
return {'Authorization' : f'Bearer {token}'}
可以通过以下方式实现目标:使用
setup_class
方法并在类级别存储令牌:
@pytest.mark.usefixtures("client", "auth")
class TestSecured:
token = None
@classmethod
def setup_class(cls, auth):
response = auth.login()
cls.token = {'Authorization': f'Bearer {response.get_json()["access_token"]}'}
def test_get_operations(self, client):
response = client.get(f'{SECURED_ROUTE}get-operations', headers=self.token)
assert response.status_code == 200
def test_post_operation(self, client):
response = client.post(f'{SECURED_ROUTE}some-endpoint', headers=self.token, json={'some': 'data'})
assert response.status_code == 201 # 或任何期望的状态码
def test_post_ope2(self, client):
response = client.get(f'{SECURED_ROUTE}another-endpoint', headers=self.token)
assert response.status_code == 200 # 或任何期望的状态码
解释:
-
类级别令牌存储: 我们在
TestSecured
类中添加了一个token
类变量。这将用于存储整个测试类共享的令牌。 -
setup_class
方法: -
我们使用
@classmethod
装饰器定义setup_class
方法,该方法在类中的任何测试方法运行之前执行一次。 -
在此方法内,我们使用
auth
fixture 登录并获取令牌。 -
然后,我们将获取的令牌存储在
self.token
中,使其可用于所有测试方法。 -
在测试方法中使用令牌: 在每个测试方法中,我们现在可以使用
self.token
访问存储的令牌,并在发出请求时将其包含在 headers 中。
通过此设置,只需登录一次,并且所有测试方法都将使用相同的令牌,从而优化的测试套件。
标签:python,flask,pytest From: 78803088