为了账号安全,请及时绑定邮箱和手机立即绑定

范围为“class”的 Pytest fixture 不适用于“setup_class”方法

范围为“class”的 Pytest fixture 不适用于“setup_class”方法

小唯快跑啊 2023-01-04 11:06:02
我目前正在使用pytest_addoption它来运行我的 API 测试,因此测试应该针对用户在命令行上使用的环境运行。在我的测试文件中,我试图仅实例化UsersSupport该类一次,并传递env参数。我的代码:conftest.pyimport pytest# EnvironmentsQA1 = 'https://qa1.company.com'LOCALHOST = 'https://localhost'def pytest_addoption(parser):    parser.addoption(        '--env',        action='store',        default='qa1'    )@pytest.fixture(scope='class')def env(request):    cmd_option = request.config.getoption('env')    if cmd_option == 'qa1':        chosen_env = QA1    elif cmd_option == 'localhost':        chosen_env = LOCALHOST    else:        raise UnboundLocalError('"--env" command line must use "qa1", "localhost"')    return chosen_envusers_support.pyimport requestsclass UsersSupport:    def __init__(self, env):        self.env = env        self.users_endpoint = '/api/v1/users'    def create_user(self, payload):        response = requests.post(            url=f'{self.env}{self.users_endpoint}',            json=payload,        )        return responsepost_create_user_test.pyimport pytestfrom faker import Fakerfrom projects import UsersSupportfrom projects import users_payloadclass TestCreateUser:    @pytest.fixture(autouse=True, scope='class')    def setup_class(self, env):        self.users_support = UsersSupport(env)        self.fake = Faker()        self.create_user_payload = users_payload.create_user_payload    def test_create_user(self):        created_user_res = self.users_support.create_user(            payload=self.create_user_payload        ).json()        print(created_user_res)问题当我运行时出现错误,但如果pytest projects/tests/post_create_user_test.py --env qa1我AttributeError: 'TestCreateUser' object has no attribute 'users_support'删除scopefromsetup_class方法,则此方法将在每个方法上运行,而不是在所有方法上运行。如何使用中的env夹具setup_class并实例化UsersSupport要在所有方法中使用的类?
查看完整描述

1 回答

?
千巷猫影

TA贡献1829条经验 获得超7个赞

如果您使用具有类作用域的夹具,则self参数不引用类实例。但是,您仍然可以使用 访问类本身self.__class__,因此您可以从实例变量创建类变量。


您的代码可能如下所示:


import pytest

from faker import Faker

from projects import UsersSupport

from projects import users_payload



class TestCreateUser:


    @pytest.fixture(autouse=True, scope='class')

    def setup_class(self, env):

        self.__class__.users_support = UsersSupport(env)

        self.__class__.fake = Faker()

        self.__class__.create_user_payload = users_payload.create_user_payload


    def test_create_user(self):

        created_user_res = self.users_support.create_user(

            payload=self.create_user_payload

        ).json()  # now you access the class variable

        print(created_user_res)

在测试期间,为每个测试创建一个新的测试实例。

如果你有一个默认函数范围的夹具,它将在测试的同一个实例中被调用,这样self夹具的参数和当前测试引用同一个实例。


在类范围的夹具的情况下,设置代码在创建测试实例之前在单独的实例中运行——这个实例必须一直存在到所有测试结束才能执行拆卸代码,所以它不同于所有测试实例。由于它仍然是同一测试类的实例,因此在这种情况下您可以将变量存储在测试类中。


查看完整回答
反对 回复 2023-01-04
  • 1 回答
  • 0 关注
  • 91 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信