我正在使用pytest + selenium测试Web解决方案的User message功能。测试将向测试用户生成测试消息,然后登录该用户以验证该消息确实正在为该用户显示。
所以测试场景基本上是:
我的问题是我想避免每次运行我的测试类中的每个测试时都创建一个新的AUTH令牌 - 我想在所有测试在同一测试运行中使用之后创建一个新令牌。
在调用所有测试时,生成一个新访问令牌的最智能解决方案是什么?
现在我想出了类似的东西,每次运行单个测试时都会生成一个新的令牌:
import pytest
import helpers.api_access_token_helper as token_helper
import helpers.user_message_generator_api_helper as message_helper
import helpers.login_helper as login_helper
import helpers.popup_helper as popup_helper
class TestStuff(object):
@pytest.yield_fixture(autouse=True)
def run_around_tests(self):
yield token_helper.get_api_access_token()
def test_one(self, run_around_tests):
auth_token = run_around_tests
message_helper.create_new_message(auth_token, some_message_data)
message_helper.map_message_to_user(auth_token, user_one["user_id"])
login_helper.log_in_user(user_one["user_name"], user_one["user_password"])
assert popup_helper.user_message_is_displaying(some_message_data["title"])
def test_two(self, run_around_tests):
auth_token = run_around_tests
message_helper.create_new_message(auth_token, some_other_message_data)
message_helper.map_message_to_user(auth_token, user_two["user_id"])
login_helper.log_in_user(user_two["user_name"], user_two["user_password"])
assert popup_helper.user_message_is_displaying(some_other_message_data["title"])
我已经用" run-around-tests"来回练习了一下。夹具但未能找到解决方案。
答案 0 :(得分:3)
您必须调整夹具范围以缓存其在测试运行中的所有测试的结果(scope='session'
),模块中的所有测试(scope='module'
),所有类中的测试(旧unittest
仅限样式测试,scope='class'
),或单个测试(scope='function'
;这是默认测试)。例子:
@pytest.fixture(scope='session')
def token():
return token_helper.get_api_access_token()
class Tests(object):
def test_one(self, token):
...
def test_two(self, token):
...
class OtherTests(object):
def test_one(self, token):
...
令牌将在首次请求时计算一次,并在整个测试运行期间保留在缓存中,因此所有三个测试Tests::test_one
,Tests::test_two
和OtherTests::test_one
将共享相同的令牌值。
如果您打算编写旧式测试类而不是测试函数,并希望fixture是一个类方法(就像它在您的代码中一样),请注意您只能使用class
范围,所以夹具值仅在类中的测试之间共享:
class TestStuff(object):
@pytest.fixture(scope='class')
def token(self):
return token_helper.get_api_access_token()
def test_one(self, token):
...
def test_two(self, token):
...
放在一边:
pytest.yield_fixture
已弃用,已替换为pytest.fixture
; autouse=True
,因为您在测试参数中明确请求了灯具。无论如何它都会被召唤。