создание тестов py.test в python

Сначала вопрос, затем объяснение, если вам интересно.

В контексте py.test, как мне сгенерировать большой набор тестовых функций из небольшого набора тестовых функций шаблоны?

Что-то вроде:

models = [model1,model2,model3]
data_sets = [data1,data2,data3]

def generate_test_learn_parameter_function(model,data):
    def this_test(model,data):
        param = model.learn_parameters(data)
        assert((param - model.param) < 0.1 )
    return this_test

for model,data in zip(models,data_sets):
    # how can py.test can see the results of this function?
    generate_test_learn_parameter_function(model,data)

Пояснение:

Я изо всех сил пытаюсь попасть в модульное тестирование. Я пишу код для «науки», потому что я пишу код, который, на мой взгляд, сложен математически, но не так уж плох с точки зрения программирования, то есть у меня, возможно, есть пять функций для тестирования. То, что я пришел из науки, означает, что я новичок в модульном тестировании, но были убеждены, что мои приятели по CS, что это то, что нужно сделать.

Код, который я пишу, берет структуру модели, некоторые данные и изучает параметры модели. Итак, мое модульное тестирование состоит из набора структур моделей и предварительно сгенерированных наборов данных, а затем набора из примерно 5 задач машинного обучения, которые необходимо выполнить для каждой структуры + данных.

Итак, если я кодирую это вручную, мне понадобится один тест для каждой модели для каждой задачи. Каждый раз, когда я придумываю новую модель, мне нужно затем скопировать и вставить 5 задач, изменяя, какую маринованную структуру + данные, на которые я указываю. Мне это кажется плохой практикой. В идеале я бы хотел 5 шаблонных функций, которые определяют каждую из моих 5 задач, а затем просто выплевывают тестовые функции для списка структур, которые я указываю.

Поиск в Google приводит меня к а) фабрикам или б) закрытию , и то, и другое запутывает мой мозг и подсказывает мне, что должен быть более простой способ, поскольку с этой проблемой должны регулярно сталкиваться настоящие программисты.


РЕДАКТИРОВАТЬ: Итак, вот как решить эту проблему!

def pytest_generate_tests(metafunc):
    if "model" in metafunc.funcargnames:
        models = [model1,model2,model3]
        for model in models:
            metafunc.addcall(funcargs=dict(model=model))

def test_awesome(model):
    assert model == "awesome"

Это применит тест test_awesome к каждой модели в моем списке моделей! Спасибо @dfichter!

(ПРИМЕЧАНИЕ: assert всегда проходит, кстати)

17
задан Mike Dewar 8 February 2011 в 14:46
поделиться