2017-08-08 24 views
1

pytestpytest.mark.parametrize()パラメータとして呼び出し可能を指定する方法はありますか?テストが実行されるように選択された場合にのみ、パラメータが動的に生成されるようにしますか?pytest parametrize()パラメータとして呼び出し可能メソッドを使用するには?

私はパラメータを生成するために実行するためにいくつかの高価な操作をしており、テストが実行されるように選択されている場合にのみ実行します。

例えば、

import pytest 

def my_callable(): 
    # do expensive operations here 
    return [(1, 2), (3, 6)] 


# I want my_callable to be called only if test_something 
# has been selected to be run 
@pytest.mark.parametrize("my_parm_1,my_parm_2", my_callable) 
def test_something(my_parm_1, my_parm_2): 
    assert my_parm_1 * 2 == my_parm_2 
+0

これはすべてpytest側の小さな欠点のようです。多分、pytestにバグを報告して、修飾されたテストが実行される瞬間にパラメータの評価を遅らせる(またはそれを行うデコレータパラメータを追加する)ことを検討する価値があります。 – sophros

答えて

0

代わりに、直接プロキシを作成することができます@pytest.mark.parametrizemycallable使用する:私はこれが何をしたいんだと思う

def my_callable(): 
    # do expensive operations here 
    return [(1, 2), (3, 6)] 

expensive_params = [paramset for paramset in my_callable()] 

@pytest.mark.parametrize("my_parm_1,my_parm_2", expensive_params) 
... 
+0

Python 3.6.1とpytest 3.2で動作します. – sophros

+1

しかし、「テストが実行されるように選択されていれば、実行したいだけです」とはどういうことでしょうか? 'expensive_params'はテストが選択されていなくても常に評価されるグローバル変数です。 –

+0

合意。 'expensive_params'はコンパイル時に常に評価されますが、テストが実行されたときにのみ評価されます。 –

0

を - 高価な計算がどの治具の内側にありますテストが呼び出され、高価な計算が1回だけ行われた場合にのみ呼び出されます。

class TestSomething: 

    _result = None 

    @pytest.fixture() 
    def my_callable(self): 
     if TestSomething._result is None: 
      # do expensive operations here 
      TestSomething._result = [(1, 2), (3, 6)] 

     def _my_callable(run_number): 
      return TestSomething._result[run_number] 
     return _my_callable 

    @pytest.mark.parametrize("run_number", [0, 1]) 
    def test_something(self, run_number, my_callable): 
     my_param_1, my_param_2 = my_callable(run_number) 
     assert my_param_1 * 2 == my_param_2 
+0

これは、高価なオペレーションをテストの実行時に移動させますが、あらかじめmy_callable()によって返されたiterableの長さをコードに知らせるようにします。残念ながら、私は事前にiterableの長さを知っていません - 高価な操作は、動的にiterableの長さを決定します。 興味深い解決策ですが、私の要件を十分に満たしていません。 さらに、このソリューションは 'pytest -v'でテストを実行したときに、テストの名前にパラメータ値を見る利点がありません。 「run_number」だけが表示されます。 –

+0

@RobBednarkパラメータの数が分かっていないことを考慮に入れて、唯一考えられるもう一つの点は、 'parametrize'を削除し、上記のようにフィクスチャを使い、テストコードの中にパラメータのグループをループさせることです。多少醜いですが、うまくいくでしょう。 –

+0

はい、私は単一のテストの中でパラメータをループすると考えました。私は、それぞれのパラメータのセットが1つのテストにまとめられているのではなく、それ自身のテストである「パラメータ化」ソリューションを得ることを望んでいました。 –

関連する問題