2016-05-16 7 views
1

私の機能テストでは、一連のテストで共有されるオブジェクト(仮想サーバに関係しています。サーバーはいくつかのpy.testフィクスチャ(環境、ホストなど)を使用して作成され、設定する環境を指定します。テストは複数の異なる環境で実行されます。私の現在のアプローチは、この抽象例のように、醜いです:Pytest - 複数のテストで共有されているオブジェクトを作成する

# [host, env, dns are fixtures, defined in conftest.py and passed from 
# commandline args - py.test recognizes them so they can be changed 
# each time the test is invoked from CLI] 

@pytest.mark.parametrize(parameters_from_parametrize) 

def test_something(host, env, dns): 
    server = Server(host,env, dns, random_name, random_passwd) 
    server.create() 
    server.do_stuff(parameters_from_parametrize) 
    check_stuff() 
    server.delete() 

しかし、これはparameters_from_parametrizeの各セットのための新しいサーバを作成します。 1つのサーバーを作成し、フィクスチャを使用してそのサーバーを実行する方法はありますか?

例えば、のように:

server = Server(host,env, dns, random_name, random_passwd) 
server.create() 

@pytest.mark.parametrize(parameters_from_parametrize) 

def test_something(server): 
    server.do_stuff(parameters_from_parametrize) 
    check_stuff() 

server.delete() 

サーバは一度だけ作成されますこの方法です。テスト関数の前にフィクスチャを使用することはできません(テスト関数外のコードはスコープをスコープと共有しません)ので、上記の例は機能しません。私はセットアップとティアダウンを試みましたが、私はそれを治具で動作させることはできません。

これを行う方法はありますか?私はsetup/teardownを使って、またはテストクラスを作成することでそれを行うことができると思ったが失敗した。

これは非常にノービスの質問ではないと思いますが、おそらくそうです。

答えて

1

fixturesがためのものです何:これは完全なテスト後にサーバのシャットダウンにもを改善することができる

@pytest.fixture(scope='session') # one server to rule'em all 
def server(): 
    server = Server(host, env, dns, random_name, random_passwd) 
    server.create() 
    return server 

def test_something(server, ...): 
    # test logic 

:pytestはに応じて、サーバーの作成を処理するいずれの場合も

@pytest.yield_fixture(scope='session') 
def server(): 
    server = Server(host,env, dns, random_name, random_passwd) 
    server.create() 
    yield server 
    server.delete() 

それを持つすべてのテスト関数に引数serverを提供します。このように、サーバーは、使用されているテストの数とパラメータ化の方法にかかわらず、テストセッションごとに1回だけ作成されます。

+1

ここに小さなタイプミスがあります。 - score = 'session'' - スコアではなく、スコープでなければなりません。 –

+0

@TomDaltonが修正されました、ありがとう! – bereal

+0

はい!私はhost、env、dnsのスコープを 'session'スコープと一致するように変更しなければなりませんでした。加えて、残りのテストを壊すことはないので、私はこのように新しいテストを書いて、その間に古いテストを修正することができます。 あなたは今日の私のヒーローです。何とかビールを買えますか? :) – Taku

関連する問題