gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 16:44:48 25 4
gpt4 key购买 nike

我目前正在使用 pytest_addoption运行我的 API 测试,所以测试应该针对用户在命令行上使用的环境运行。在我的测试文件中,我试图实例化 UsersSupport只上课一次,通过 env争论。我的代码:

conftest.py

import pytest

# Environments
QA1 = '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_env

users_support.py
import requests


class 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 response

post_create_user_test.py
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.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'错误,但如果我删除 scope来自 setup_class方法,此方法在每个方法上运行,而不是在所有方法上运行。

我如何使用 env fixture 在 setup_class并实例化 UsersSupport在所有方法中使用的类?

最佳答案

如果您使用具有类作用域的 fixture ,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)

在测试过程中,会为每个测试创建一个新的测试实例。
如果你有一个默认函数作用域的fixture,它会在测试的同一个实例中被调用,这样 self fixture 和当前测试的参数引用同一个实例。

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

关于python - 范围为 “class” 的 Pytest fixture 不适用于 "setup_class"方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62289556/

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