Pytest框架 conftest.py文件的使用詳解

conftest.py文件特點

  • 所有同目錄測試文件運行前都會執行conftest.py文件 不需要import導入
  • conftest.py,pytest用例會自動識別該文件,放到項目的根目錄下就可以全局目錄調用瞭,如果放到某個package下,那就在該package內有效,可有多個conftest.py
  • conftest.py與運行的用例要在同一個pakage下,並且有__init__.py文件
  • 可以跨.py文件調用,有多個.py文件調用時,可讓conftest.py隻調用瞭一次fixture,或調用多次fixture

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作用於整個目錄。
  4. 如果希望Fixture(夾具)共享給所有測試,則可以把conftest.py文件放在測試框架的根目錄下。
  5. conftest.py文件中的內容,不需要做任何的imprt導入的操作就能夠讀取到,因為Pytest用例會自動查找。
  6. 建議把測試項目的所有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的特性:

  • conftest.py文件中Fixture的scope參數為session,那麼所有的測試文件執行前(後)執行一次conftest.py文件中的Fixture。
  • conftest.py文件中Fixture的scope參數為module,那麼每一個測試文件執行前(後)都會執行一次conftest.py文件中Fixture。
  • conftest.py文件中Fixture的scope參數為class,那麼每一個測試文件中的測試類執行前(後)都會執行一次conftest.py文件中Fixture。
  • conftest.py文件中Fixture的scope參數為function,那麼所有文件的測試用例執行前(後)都會執行一次conftest.py文件中Fixture。

6、總結:

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

到此這篇關於Pytest框架 conftest.py文件的使用詳解的文章就介紹到這瞭,更多相關Pytest conftest.py文件內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: