首頁 > 軟體

Pytest框架之fixture詳解(二)

2022-06-30 14:02:34

相關文章

Pytest框架之fixture詳解(一)

Pytest框架之fixture詳解(二)

Pytest框架之fixture詳解(三)

本文關於 fixture 的內容如下:

  • fixture 的 autouse 引數
  • session 和 module 級別的 fixture

1、fixture 的 autouse 引數

pytest 當中的 fixture, 預設情況下在定義好之後,需要測試用例/測試類主動請求使用,才會執行。

但是它有一個引數叫做 autouse,預設是 False。

關閉 fixture 的自動呼叫/自動執行功能。

如果設定 autouse=True,則表示這個 fixture 在它的作用域範圍內都會自動化執行。

分為 2 種情況,接下來舉例說明。

第 1 種情況:當定義的 fixture 在測試類內部時

如果 fixture 設定了 autouse=True,只會在測試類類內部生效。測試類以外的用例不受影響。

定義一個 test_pytest-autouse.py,定義一個 TestDemo 類。

在其中定義 2 個 fixture,一個設定了 autouse=True,另外一個使用預設值 False

執行結果:

第 2 種情況,在 conftest.py 當中的 fixture 設定 autouse=True

conftest.py 能影響到所有測試類/測試用例都會執行(依據 fixture 的作用域決定在哪個範圍內執行)。

有如下的目錄結構:

測試用例檔案(test_autouse1.py,test_autouse2.py)當中,並沒有使用@pytest.mark.usefixture("func_fix")來主動請求 fixture.

conftest.py 檔案中的內容如下:

名為 func_fix 的 fixture 設定了 autouse=True,它的作用域為 function, 那麼

在 pytest20210301 包下的每一個測試用例,在執行用例之前都會執行它的前置準備動作,在執行用例之後都會執行它的後置清理動作。

執行 main.py(收集用例並執行)檔案的結果如下:

基於以上情況,一般 function、class、module 級別的 fixture,都不會去開啟 autouse=True

不同的測試用例/測試類,對於前置準備工作和後置清理工作的需求並不完全一樣。

如果開啟了 autouse=True, 那麼不管測試用例/測試類是否需要,都會去執行。

讓測試用例/測試類根據實際需求主動來請求使用 fixture 才是正確之道。

2、session 和 module 級別的 fixture

pytest 的 fixture 除了 function 和 class 以外,還有 session 和 module 級別。

session 級別的 fixture

這裡的 session 是指測試對談。

它指的是:從 pytest 開始收集用例,到執行用例完成的整個過程,為一次對談。

比如收集到了 100 個測試用例要執行,那麼 session 夾具夾的就是這 100 個用例。

比如收集到了 30 個測試用例要執行,那麼 session 夾具夾的就是這 30 個用例。

由於它在所有用例執行的過程中,只執行一次。

如果定義了 session 級別的 fixture,那說明你就是需要執行它的。

所以它是可以設定 autouse=True 的。

我們在做自動化測試的時候,如果有些前置準備工作是為整個測試對談做的,那麼可以定義 session 級別的,比如清理/建立一些檔案等。

還是以上面的用例結構為例,在 conftest.py 當中新增 session 級別的 fixture,並設定為 autouse=True:

執行結果如下:

module 級別的 fixture

module 是指測試 py 檔案,夾具夾的是整個 test_*.py 檔案裡的測試用例。

在 test_*.py 裡,哪一行程式碼呼叫了 module 級別的 fixture,那麼夾的就是那行程式碼之後的所有測試用例。

舉例來說明。還是以上面的用例結構為例,在 conftest.py 當中新增 module 級別的 fixture:

在 test_autouse2.py 當中,呼叫 module 級別的 fixture,但並未在第一個用例前呼叫。

執行結果如下:

到此這篇關於Pytest框架之fixture的文章就介紹到這了。希望對大家的學習有所幫助,也希望大家多多支援it145.com。


IT145.com E-mail:sddin#qq.com