關於conftest和fixtures

疯狂学习中發表於2024-07-04

一、 conftest.py 檔案

  作用:存放case的前提條件和後置條件配置函式;一般該類函式都會使用fixture裝飾(fixture該篇第二點會介紹);使用conftest裡面的函式時不需要匯入 conftest.py 這個檔案。只需將函式名作為變數傳入test_case即可呼叫;
  使用 conftest.py 的規則:
特點:

  1. conftest.py 這個檔名是固定的,不可以更改。
  2. conftest.py 與執行用例在同一個包下,並且該包中有 init.py 檔案
  3. 使用的時候不需要匯入 conftest.py,pytest 會自動識別到這個檔案
  4. 放到專案的根目錄下可以全域性呼叫,放到某個 package 下,就在這個 package 內有效。

二、fixture

  pytest中可以使用@pytest.fixture裝飾器來裝飾一個方法,被裝飾方法的方法名可以作為一個引數傳入到測試方法中。可以使用這種方式來完成測試之前的初始化,也可以返回資料給測試函式;
  fixture裡面有一個引數scope,透過scope可以控制fixture的作用範圍,根據作用單位大小劃分為:session>module>class>function

  1. function函式或者方法級別都會被呼叫
  2. class類級別呼叫一次
  3. module模組級別呼叫一次
  4. session是多個檔案呼叫一次(可以.py檔案呼叫,每個.py檔案就是一個module);fixture scope 為 session 級別是可以跨 .py 模組呼叫的,也就是當我們有多個 .py 檔案的用例時,如果多個用例只需呼叫一次 fixture,可以將 scope='session',並且寫到 conftest.py 檔案裡。寫到 conftest.py 檔案可以全域性呼叫這裡面的方法。

2.1 .將fixture作為函式引數
  通常使用setup和teardown來進行資源的初始化。如果有這樣一個場景,測試用例1需要依賴登入功能,測試用例2不需要登入功能,測試用例3需要登入功能。這種場景setup、teardown無法實現,可以使用pytest fixture功能,在方法前加個@pytest.fixture裝飾器,加了這個裝飾器的方法可以以引數的形式傳入到方法裡面執行。
2.2 將fixture作為模組引數
  整個模組有多條測試用例,需要在全部用例執行之前開啟瀏覽器,全部執行完之後去關閉瀏覽器,開啟和關閉操作只執行一次,如果每次都重新執行開啟操作,會非常佔用系統資源。這種場景除了setup_module,teardown_module可以實現,還可以透過設定模組級別的fixture裝飾器(@pytest.fixture(scope="module"))來實現

如果每條測試用例都需要新增 fixture 功能,則需要在每一要用例方法裡面傳入這個fixture的名字,這裡就可以在裝飾器裡面新增一個引數 autouse='true',它會自動應用到所有的測試方法中,只是這裡沒有辦法把返回值給測試用例。

俗話說的好百聞不如一見,下面展示一下,我們經常使用的場景;

示例例:

下圖就是conftest.py檔案中的前置條件函式【ModulInit】,並且以fixture裝飾;

注:【ModulInit】該函式主要功能是登入裝置,並獲取該裝置型號

下圖是test_case函式呼叫前置條件函式的方式;將前置條件函式名稱直接作為引數傳入到case中,那麼在執行該case之前,程式會自動先執行前置函式【ModulInit】;然後再執行case;並且該前置函式是有返回值的(返回值為一個列表),使用返回值也是直接前置函式名稱後跟序號來取;ModulInit[0/1/2]

相關文章