В scikit-learn есть функция parametrize_with_checks()
, которая используется в качестве фабрики фикстур pytest — она возвращает фикстуру pytest.mark.parametrize
и вызывается как декоратор с итерацией оценок, например.
@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()
не может работать со значениями, установленными фикстурами. Он обрабатывает models
как функцию, а не как фикстуру. Вы можете получить доступ к приборам только из тестовых функций.
Итак, похоже, вам нужно установить 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...")
Это простой вариант, и я, вероятно, выберу его, спасибо. sklearn также имеет функцию
check_estimator
, которую я мог бы использовать (с пакетомpytest-cases
), чтобы получить желаемое иерархическое тестирование;parametrize_with_checks
полезен, поскольку он ломает все тесты.