gpt4 book ai didi

python - Pytest "run-around-tests"fixture 在类中的所有测试之前只运行一次

转载 作者:太空宇宙 更新时间:2023-11-04 00:18:11 24 4
gpt4 key购买 nike

我正在使用 pytest + selenium 测试网络解决方案的用户消息功能。测试将为测试用户生成一条测试消息,然后登录该用户以验证该消息确实正在为该用户显示。

  • 我需要通过内部 API 生成这些消息。
  • 为了能够访问此 API,我首先必须通过不同的 API 生成 AUTH token 。

所以测试场景基本上是:

  1. 在测试启动时,通过 API 辅助函数生成一个新的 AUTH token 。
  2. 向另一个 API 发送请求以设置新消息(需要 AUTH token )
  3. 向另一个 API 发送请求以将此消息“映射”到指定用户(需要 AUTH token )
  4. 登录测试用户并验证新消息确实在显示。

我的问题是,我想避免每次运行我的测试类中的每个测试时都创建一个新的 AUTH token - 我想创建一个新 token ,一旦所有测试都在同一测试运行中使用。

在调用所有测试时生成一个新访问 token 的最聪明的解决方案是什么?

现在我想出了这样的东西,每次运行任何单独的测试时都会生成一个新 token :

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"])

我已经在“绕行测试” fixture 上反复试验了一些,但未能找到解决方案。

最佳答案

您必须调整 fixture 作用域以缓存测试运行中所有测试的结果 (scope='session')、模块中的所有测试 (scope='module'),类中的所有测试(仅限旧的 unittest 样式测试,scope='class'),或单个测试(scope='function '; 这是默认的)。示例:

fixture 函数

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

token 将在第一次请求时计算一次并在整个测试运行期间保存在缓存中,因此所有三个测试 Tests::test_oneTests::test_twoOtherTests::test_one 将共享相同的标记值。

fixture 类方法

如果您打算编写旧式测试类而不是测试函数,并且希望 fixture 是一个类方法(就像在您的代码中一样),请注意您只能使用 class范围,以便仅在类中的测试之间共享 fixture 值:

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):
...

搁置一边:

  1. pytest.yield_fixture 已弃用并替换为 pytest.fixture
  2. 您不需要设置 autouse=True,因为您在测试参数中明确请求了 fixture 。无论如何都会调用它。

关于python - Pytest "run-around-tests"fixture 在类中的所有测试之前只运行一次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50151189/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com