2017-08-22 39 views
0

我正面臨pytest夾具的一個小問題,非常感謝您的幫助。Py.test夾具:在示波器夾具中使用功能夾具

我有幾個功能如下所述。爲了簡單起見,我沒有顯示實現。

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

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

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

的問題是我需要多一個(會話級別)燈具之前,我跑我的第一個測試的情況下,其不設置。 (實際上開始測試)。即轉到設置頁面並創建一些設置。 (登錄後)

現在的問題是我不能這樣做使用會話級別夾具,因爲我不能在會話級別使用功能級別的夾具。 還是可以嗎?

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

文檔說'不'。功能級別的燈具可以使用會話級別的燈具,但不能用其他方式。我想你需要給你的情況增加更多的細節,以便我們能夠找到解決問題的辦法。 – ldiary

+0

問題是我需要一個在第一個測試用例之前只調用一次的燈具。 (會話或模塊)。然而,問題是,我不能使用'設置'夾具,它具有與在該夾具中創建'測試數據'有關的所有功能。 –

+1

您的'get_driver'是一個函數級別的fixture,是否意味着您正在爲每個測試函數創建一個'driver'的新實例?或者你只是檢索你將在會話範圍'setup'中使用的'driver'實例? – ldiary

回答

1

您將需要使用一種解決方法。該動作需要在function範圍內的燈具中完成,其中autouse設置爲True

您需要初始化基於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

你認爲檢查真假是否是開銷?它可能會爲您的整個套件增加幾個ms,這些都不重要 –

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>