『德不孤』Pytest框架 — 14、Pytest中的conftest.py檔案

繁華似錦Fighting發表於2022-03-19

1、conftest.py檔案介紹

conftest.py檔案是Pytest框架裡面一個很重要的東西,它可以在這個檔案裡面編寫Fixture函式,這個Fixture函式的作用,就相當於Unittest框架裡面的setup()前置函式和teardown()後置函式,雖然Pytest框架也有setup()前置函式和teardown()後置函式,但是在實際工作中沒必要寫在測試用例檔案中,直接寫在conftests.py裡面就好了,Pytest框架會自動去找conftest.py檔案裡面的東西,這樣更靈活。

總結:在實際工作中,通常conftest.py@pytest.fixture()結合使用,實現全域性的前後置應用。

2、conftest.py的注意事項

  1. conftest.py檔案是單獨存放的一個夾具(Fixture)配置檔案,名稱是不能更改。
  2. 可以在不同的.py檔案中使用同一個Fixture函式。
  3. 原則上conftest.py需要和執行的用例放到同一目錄中,並且有__init__.py檔案,那麼conftest.py作用於整個目錄。
    如果希望Fixture(夾具)共享給所有測試,則可以把conftest.py檔案放在測試框架的根目錄下。
  4. conftest.py檔案中的內容,不需要做任何的imprt匯入的操作就能夠讀取到,因為Pytest用例會自動查詢。
  5. 建議把測試專案的所有Fixture都存放在conftest.py檔案中,把conftest.py當作Pytest的Fixture倉庫。

3、conftest.py的使用

(1)測試框架的根目錄或者包中建立conftest.py檔案

"""
1.學習目標
    掌握conftest.py檔案編寫格式
2.操作步驟
    2.1 conftest.py檔名不能修改
        conftest.py檔案中存放專案所有的fixture
        方便對fixture管理和維護
    2.2 在conftest.py定義函式
        在函式前新增@pytest.fixture()裝飾器
        在測試用例的函式中傳入fixture標識的函式名。

提示:conftest.py檔案放在專案的根目錄,作用域是全域性的。
    conftest.py檔案放在某一個包下,作用域只在該包內。

"""
import pytest
from selenium import webdriver


@pytest.fixture()
def login():
    print("開啟APP")
    print("登入成功")
    yield  # 當用例執行完成後,執行yield後的程式碼
    print("關閉APP")


@pytest.fixture()
def driver(request):  # request是Pytest中的一個關鍵字,固定寫法。
    # 步驟1:建立瀏覽器驅動物件
    driver = webdriver.Chrome()

    # 步驟3:定義用例執行後要執行的程式碼,封裝到一個函式中
    def end():  # 這個end函式命是自定義的
        driver.quit()

    # 步驟4:執行上面封裝的程式碼。
    # 通過request關鍵字,結束上面的函式。
    request.addfinalizer(end)  # 終結函式

    # 步驟2:返回瀏覽器驅動物件,給測試用例
    return driver

(2)測試用例檔案如下

import pytest

# 注意:要把conftest.py檔案中定義的fixture方法新增到用例中
def test_add_cart(login): # 把conftest.py檔案中的fixture函式傳入用例
    print("新增購物車--需要登入")


def test_add_address(login):
    print("新增收貨地址--需要登入")


if __name__ == '__main__':
    pytest.main()

"""
執行結果:

test_01.py::test_add_cart 開啟APP
登入成功
新增購物車--需要登入
PASSED關閉APP

test_01.py::test_add_address 開啟APP
登入成功
新增收貨地址--需要登入
PASSED關閉APP
"""

4、不同位置conftest.py檔案的優先順序

其作用範圍是當前目錄包括子目錄裡的測試模組。

  • 比如在測試框架的根目錄建立conftest.py檔案,檔案中的Fixture的作用範圍是所有測試模組。
  • 比如在某個單獨的測試資料夾裡建立conftest.py檔案,檔案中Fixture的作用範圍,就僅侷限於該測試資料夾裡的測試模組。
    該測試資料夾外的測試模組,或者該測試資料夾外的測試資料夾,是無法呼叫到這個conftest.py檔案中的Fixture。
  • 如果測試框架的根目錄和子包中都有conftest.py檔案,並且這兩個conftest.py檔案中都有一個同名的Fixture,實際生效的是測試框架中子包目錄下的conftest.py檔案中配置的Fixture。
  • 提示:一個用例可以新增多個conftest.py檔案中定義的Fixture夾具,如下:
    # 注意:要把conftest.py檔案中定義的fixture方法新增到用例中
    def test_add_cart(login, driver):
        print("新增購物車--需要登入")
    

5、conftest.py中Fixture(夾具)的作用域

Fixture的scope引數也適用conftest.py檔案中Fixture的特性:

  1. conftest.py檔案中Fixture的scope引數為session,那麼所有的測試檔案執行前(後)執行一次conftest.py檔案中的Fixture。
  2. conftest.py檔案中Fixture的scope引數為module,那麼每一個測試檔案執行前(後)都會執行一次conftest.py檔案中Fixture。
  3. conftest.py檔案中Fixture的scope引數為class,那麼每一個測試檔案中的測試類執行前(後)都會執行一次conftest.py檔案中Fixture。
  4. conftest.py檔案中Fixture的scope引數為function,那麼所有檔案的測試用例執行前(後)都會執行一次conftest.py檔案中Fixture。

6、總結

  • Pytest框架中的setup()/teardown()函式,setup_class()/teardown_class()函式。他們是作用於所有用例或者所有類的。
  • @pytest.fixtrue()的作用域是既可以部分用例,也可以全部用例的前後置。
  • conftest.py檔案和@pytest.fxtrue()裝飾器結合使用,作用於全域性用例的前後置。

參考:

相關文章