22

最初に質問してから、興味があれば説明してください。

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)

説明:

私が書いているコードは、モデル構造といくつかのデータを取り、モデルのパラメーターを学習します。したがって、私の単体テストは、一連のモデル構造と事前に生成されたデータセット、および各構造とデータで完了する約5つの機械学習タスクのセットで構成されます。

したがって、これを手動でコーディングする場合は、タスクごとにモデルごとに1つのテストが必要です。新しいモデルを思いつくたびに、5つのタスクをコピーして貼り付け、ポイントしているピクルス構造とデータを変更する必要があります。これは私には悪い習慣のように感じます。理想的には、5つのタスクのそれぞれを定義する5つのテンプレート関数を作成し、指定した構造のリストに対してテスト関数を吐き出すだけです。

グーグルで検索すると、a)工場またはb)閉鎖のいずれかになります。どちらも私の頭を悩ませ、適切なプログラマーが定期的にこの問題に直面する必要があるため、もっと簡単な方法があるはずだと私に示唆します。それでありますか?


編集:この問題を解決する方法は次のとおりです!

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!

(注:そのアサートは常に通過します、ところで)

4

2 に答える 2

19

良い本能。 フックpy.testで話していることを正確にサポートします。pytest_generate_tests()彼らはここでそれを説明します

于 2011-02-08T04:05:23.257 に答える