如何在夹具工厂使用pytest夹具



在scikit learn中,有一个函数parametrize_with_checks()被用作pytest fixture工厂——它返回一个pytest.mark.parametrizefixture,并被称为具有可迭代估计量的装饰器,例如

@parameterize_with_checks(list_of_estimators)

我的问题是,我的估计器列表可能会发生变化(或者我可能有多个列表(,并且我在固定装置中设置的每个列表。

这是一个M(N(WE:

import pytest
from sklearn.linear_model import LinearRegression
from sklearn.utils.estimator_checks import parametrize_with_checks

@pytest.fixture
def models():
return (LinearRegression(fit_intercept=flag) for flag in (False, True))

class TestModels:
@parametrize_with_checks(models)
def test_1(self, estimator, check):
check(estimator)
print("Do other stuff...")
def test_2(self, models):
print("Do even more stuff...")

然而,当models被传递给parametrize_with_checks时,它仍然是一个函数对象,因此它抛出了一个错误。我该怎么绕过这个?

parametrize_with_checks()无法使用fixture设置的值。它处理models只是一个函数,而不是一个固定装置。您只能从测试函数访问fixture
因此,看起来您需要将models设置为列表,或者调用parametrize_with_checks()中的模型函数

import pytest
from sklearn.linear_model import LinearRegression
from sklearn.utils.estimator_checks import parametrize_with_checks

MODELS = [LinearRegression(fit_intercept=flag) for flag in (False, True)]

@pytest.fixture()
def models():
return [LinearRegression(fit_intercept=flag) for flag in (False, True)]

class TestModels:
@parametrize_with_checks(MODELS)
# OR
# @parametrize_with_checks(estimators=models())
def test_1(self, estimator, check):
check(estimator)
print("Do other stuff...")
def test_2(self, models):
print("Do even more stuff...")

最新更新