Python pytest用于测试的夹具的请求参数

Python pytest用于测试的夹具的请求参数,python,python-3.6,pytest,self,web-api-testing,Python,Python 3.6,Pytest,Self,Web Api Testing,我已经参数化了我的fixture来调用api,在每次调用中使用不同的输入数据来发布请求,作用域为class。因为我需要用发送的数据检查API响应。我需要在测试中读取装置的请求参数 class Test_create_fixture(): @pytest.fixture(scope="class", params=[0, 1]) def my_fixture(self, request): "Call incident creation api." # POST request

我已经参数化了我的fixture来调用api,在每次调用中使用不同的输入数据来发布请求,作用域为
class
。因为我需要用发送的数据检查API响应。我需要在测试中读取装置的请求参数

class Test_create_fixture():

@pytest.fixture(scope="class", params=[0, 1])
def my_fixture(self, request):
    "Call incident creation api."

    # POST request to API using params value in request data, get data from API      
    my_data = {'abc': 123, 'severity': 0} # this data is from API

    self.data = {'severity': request.param}

    return my_data

def test_incident_severity(self, my_fixture, request):
    print("self.data", self.data) # 'Test_create_fixture' object has no attribute 'data'
    assert my_fixture.get('severity', False) == request.param # AttributeError: 'FixtureRequest' object has no attribute 'param'

但当我运行这个程序时,我无法将传递给fixture的请求参数读入测试。还尝试保存实例中的变量,但没有成功。我观察到夹具中的
id()
属性与测试中的
self
属性不同。为什么会这样?有没有办法实现这一点?

您可以将
请求.param
从夹具传递到测试功能。您可以将其添加到
my_data
对象本身

class Test\u create\u fixture():
@fixture(scope=“class”,params=[0,1])
def my_夹具(自身,请求):
“调用事件创建api。”
#使用请求数据中的params值将请求发布到API,从API获取数据
my_data={'abc':123',severity':0,'req_param':request.param}此数据来自API
返回我的\u数据
def测试事件严重性(自身、我的夹具):
断言my_fixture.get('severity',False)=my_fixture.get('req_param'))

更新: 由于您正在参数化装置,
request.param
仅在定义参数化的装置功能中可用

另一种可能是引入另一个参数化的夹具并返回参数。当前夹具和测试函数使用此新夹具获取参数

class Test\u create\u fixture():
@fixture(scope=“class”,params=[0,1])
def req_参数(自身、请求):
返回请求.param
@pytest.夹具(scope=“class”)
定义我的夹具(自身,要求参数):
“调用事件创建api。”
#使用请求数据中的req_参数将请求发布到API,从API获取数据
my_data={'abc':123,'严重性]:0}#此数据来自API
返回我的\u数据
def测试事件严重性(自身、我的夹具、要求参数):
断言我的fixture.get('severity',False)=req\u参数

这实际上是在更新API响应,我不这么做。返回多个值或更新返回值可能是一个解决方案,但这是一个解决办法。我已更新了另一个备选方案的答案,其中API响应保持不变。您的注释“由于您正在参数化装置,因此request.param仅在定义参数化的装置函数中可用”完全不是真的,为完整的测试运行维护请求对象,可以在需要参数的其他测试中访问。这里的问题是pytest在开始时实例化类fixture,并在运行测试时创建另一个实例,这样该实例就不会共享这些值。可以在需要参数的其他测试中访问完整测试运行的请求对象。但是我说过,
request.param
在测试函数中不可用(使用参数化的fixture),这就是您在测试函数中尝试使用AttributeError时获得AttributeError的原因。