2017-08-22 5 views
0

pytestフィクスチャの小さな問題に直面しています。Py.test fixture:スコープフィクスチャーに関数フィクスチャを使用

私は以下に述べるような機能をいくつか備えています。簡単にするために、私は実装を示していません。

@pytest.fixture() 
def get_driver(): 
    pass 

@pytest.fixture() 
def login(get_driver): 
    pass 

@pytest.fixture() 
def settings(login): 
    pass 

問題は、私は私が私の最初のテストケースを実行する前にセットアップを行い1以上(セッションレベル)の固定具が必要です。 (実際にテストを開始します)。つまり、設定ページに移動して設定を少なくします。 (ログイン後)

今のところ問題はセッションレベルのフィクスチャを使用して、セッションレベルのフィクスチャ012を使用することができません。 またはできますか?

@pytest.fixture(scope="session") 
def setup(settings): 
    settings.create_settings() 
    pass 
+1

ドキュメンテーションには「いいえ」と表示されます。ファンクションレベルフィクスチャはセッションレベルのものを使用できますが、それ以外の方法は使用できません。あなたの状況にもっと詳しい情報を追加する必要があるので、私たちはあなたの問題に対する回避策を見つけることができるかもしれません。 – ldiary

+0

問題は、最初のテストケースの前に一度だけ呼び出されるもう一つのフィクスチャが必要なことです。 (セッションまたはモジュール)。しかし、問題は、私はこの治具で 'testのためのデータを作成することに関連するすべての機能を持つ' settings'フィクスチャを使うことができないということです。 –

+1

'get_driver'は関数レベルのフィクスチャです。すべてのテスト関数の' driver'の新しいインスタンスを作成していますか?あるいは、あなたはあなたのセッションスコープの 'setup'フィクスチャで使う' driver'インスタンスと同じものを取得していますか? – ldiary

答えて

1

回避策を使用する必要があります。アクションは、autouseTrueに設定されたfunctionスコープ付きフィクスチャで実行する必要があります。

sessionベースのフィクスチャで変数を初期化する必要があります。これによりsettingsが完了したかどうかが確認されます。行われていない場合は、設定を行うと、以下False

にフラグを変更しますが

import pytest 


@pytest.fixture(scope="session", autouse=True) 
def settings_page(): 
    config = {"config_done": False} 
    return config 


@pytest.fixture() 
def init(request): 
    print("init called") 
    return "init" 


@pytest.fixture() 
def driver(): 
    print("driver called") 

    return "driver" 


@pytest.fixture(autouse=True) 
def init_settings(settings_page, driver): 
    if not settings_page["config_done"]: 
     print("Settings being done only the first time") 
     settings_page["config_done"] = True 


@pytest.fixture() 
def login(): 
    print("login called") 
    return "login" 


@pytest.fixture() 
def logged_in_driver(init, driver, login): 
    print("logged in driver is ready") 
    return (init, driver, login) 


@pytest.fixture() 
def non_logged_in_driver(init, driver): 
    print("non logged in driver is ready") 
    return (init, driver) 


def test_1(logged_in_driver): 
    print("test_1") 


def test_2(non_logged_in_driver): 
    print("test_2") 

出力が

test.py driver called 
Settings being done only the first time 
init called 
login called 
logged in driver is ready 
.test_1 
driver called 
init called 
non logged in driver is ready 
.test_2 

以下のようである実施例であるので、あなたにのみ発生し、設定を見ることができます一度

+0

これは私が現在やっていることです。オーバーヘッドは、設定が完了したかどうかを確認するすべてのテストです。私はこれを行うための他のよりよい方法があると思っていた –

+0

あなたは真偽を確認することがオーバーヘッドだと思いますか?あなたのスイート全体に数ミリ秒を追加するかもしれません。 –

0

この回避策は、セッションレベルのフィクスチャを作成せずに同じ結果を達成しようとします。上記のあなたのコメントに記載されているように、あなたは設定の必要性に答えます。called only once before first test caseです。

conftest.pyを作成し、次の内容を配置します。

import pytest 


def pytest_sessionstart(session): 
    print("Initialising Session Level Settings") 
    login = "A specialized login" 
    settings(login).create_settings() 


@pytest.fixture() 
def get_driver(): 
    print("Get Driver") 


@pytest.fixture() 
def login(get_driver): 
    print("Login") 


@pytest.fixture() 
def settings(login): 
    print("Settings") 

    class Setter: 
     def create_settings(self): 
      print("[Success] Settings created!") 
    return Setter() 

あなたはその後、以下のようなあなたのテストでこれを使用することができます。

def test_one(settings): 
    print("Test one...") 


def test_two(settings): 
    print("Test two...") 

テストを実行すると、あなたが望んでいたものに近い効果を与える必要があります(私があなたの与えられた情報から今まで推測できるものに基づいて)。

(py362) D:\repo\git\ens_qa>py.test -sv stackoverflow\ScopeWorkaroundTests.py 
Initialising Session Level Settings 
Settings 
[Success] Settings created! 
============================= test session starts ============================= 
platform win32 -- Python 3.6.2, pytest-3.2.1, py-1.4.34, pluggy-0.4.0 -- d:\virtualenv\py362\scripts\python.exe 
cachedir: .cache 
rootdir: D:\repo\git\ens_qa, inifile: 
collected 2 items 

stackoverflow/ScopeWorkaroundTests.py::test_one Get Driver 
Login 
Settings 
Test one... 
PASSED 
stackoverflow/ScopeWorkaroundTests.py::test_two Get Driver 
Login 
Settings 
Test two... 
PASSED 

========================== 2 passed in 0.05 seconds =========================== 

(py362) D:\repo\git\ens_qa> 
関連する問題