2016-09-25 22 views
1

コマンドライン引数からテスト関数をパラメータ化できます。 クラスにスコープを設定することは可能です。 私はこれらの2つのものを結合したいので、各クラスはクラス内のフィクスチャに与えられたパラメータ化された引数を受け取ります。pytestを使用してクラスレベルのフィクスチャを動的にパラメータ化

(基本的にコマンドライン引数ごとに1つの非常に高価な操作を実行してから、その操作の結果に対してさまざまな安価で迅速なテストを行う必要があり、高価な操作を再実行する必要はありません私はそれを保存する方法をしたい)

つまり、私はpytest_generate_tests(metafunc)と同等のものを探しています。これはテスト関数ではなくフィクスチャを動的にパラメータ化するために働きます。

すでにうまくいっていないことは、要求パラメータを読み込んで、これらを pytest_generate_testsフックで設定することです。このテストを実行する

conftest.py: 
    def pytest_generate_tests(metafunc): 
     metafunc.parametrize("result", [ 
       (1,0),(1,2) 
      ]) 

test_thing.py: 
    class TestThingy: 
     @pytest.fixture(scope="class") 
     def result(self, request): 
      a,b=request.param 
      return a+b 

    #@pytest.mark.parametrize("result", [(0, 1), (1, 2)]) 
    def test_one(self, result): 
     assert result!=2 

は(私がconftestフックなしとアンコメントコメント行でそれをしようとしたとき、テストはうまく実行されたことに注意してください)、次のエラーが発生することが発生します

@pytest.fixture(scope="class") 
def result(self, request): 
    a,b=request.param 

AttributeError: 'SubRequest' object has no attribute 'param'

私は同じ結果を得るための他の方法にも興味があります。

+0

py.testチームが体重を増やすことができれば素晴らしいと思います。 –

答えて

2

私はこのようなコマンドライン引数に基づいて、フィクスチャパラメータ化で醜いハックの - 仕事をしてきました。ここで何が起こっているのか基本的に

# contents of conftest.py 
import pytest 

def pytest_addoption(parser): 
    parser.addoption("--test-local", action="store_true", default=False) 

def pytest_generate_tests(metafunc): 
    if "dummy" in metafunc.fixturenames: 
     #driverParams sets dummy[0], dummy[1] parametrically (as seen below) 
     if metafunc.config.getoption("--test-local"): 
      driverParams = [(True, None)] 
     else: 
      driverParams = [(False, "seriousface setting 1"), 
          (False, "seriousface setting 2")] 
     metafunc.parametrize("dummy", driverParams) 

#driver can then be used as a standard fixture 
@pytest.fixture(scope="function") 
def driver(dummy): 
    _driver = makeDriverStuff(dummy[0], dummy[1]) 
    yield _driver 
    _driver.cleanup() 

@pytest.fixture(scope="function") 
def dummy(): 
    pass 

はときmetafunc.parametrize("dummy", driverParams)実行、それが投げるということですdriverParamsをダミーフィクスチャに依存するものに置き換えます。もっと重要なことは、ダミーのフィクスチャ関数が実際にはを実行しないことを意味します。

は当初、私は直接私のドライバー・フィクスチャをパラメータするmetafuncを使用してみました、と私は前に物事をしていた(間違った)の方法は、直接makeDriverStuff(param1, param2)metafunc.parametrizeにあったので、クリーンアップが起こっていなかったことに気づいて、なぜ疑問に思う私の頭を傷つけますdriver()が呼び出されることはありませんでした。ダミーのポイントは、「ちょっと、ここに合法的な固定具があります、あなたがそれを見つけることができないと不平を言ってはいけません!」と言います。

私が言ったように、それは醜いハックです。しかし、あなたはそれを適応させることができるはずです

+0

私はこの提案を実装しました。私は高価なコードが何回呼ばれたかを調べるためにprintステートメントを追加しました。残念ながら、パラメータを取得する各テストについて、答えは何度も繰り返されます。 – dWitty

+0

私がやっていることの場合、それは意図的です。私の 'makeDriverStuff()'は、新しいWebDriver(つまり、新しいブラウザインスタンス)をスピンアップします。これは、テストが互いにより孤立しているように特に望みます。 –

+0

fixtureデコレータを 'scope =" session "(またはクラス、モジュールなど)に変更して解決するでしょうか? –

関連する問題