pytest的fixture功能

  • 2020 年 2 月 21 日
  • 筆記

今天記錄一下最近學習pytest的過程中對fixture功能的總結,學習pytest就要好好的了解下它的精髓所在—fixture,就像了解unittest中的setup和teardown一樣。接下來開始正題:

1. 什麼是fixture

(1)fixture是在測試函數運行前後,由pytest執行的外殼函數;

(2)它的作用是將一些非核心測試邏輯從測試函數分離出來,以便於其他測試函數使用,同時保持這些邊緣邏輯的一致性;

(3)fixture中的程式碼可以進行訂製,滿足多變的測試需求,包括:包括定義傳入測試中的數據集,配置測試前系統的初始狀態,為批量測試提供數據源等等…

總起來說,fixture是pytest用戶將測試前後進行預備、清理工作的程式碼分離出核心測試邏輯的一種機制。

2. fixture定義

通過一個例子來看下fixture的定義:

@pytest.fixture() 裝飾器用於聲明函數是一個fixture。fixtureFunc 這個函數就是一個fixture,fixture函數內部可以實現一些初始化的操作。

運行結果:

3. fixture函數存放的位置

(1)如果你希望fixture函數的作用域僅限於某個測試文件,那麼將它寫在該測試文件中;

(2)如果希望fixture被多個測試文件共享,可以在公共目錄下創建一個conftest.py文件,將fixture放在其中。

4. fixture執行和銷毀的邏輯

下面通過 pytest –setup-show example1.py查看一下fixture的執行和銷毀的邏輯:

從執行結果看到,測試函數被夾在中間,pytest將每一個fixture的執行分成SETUP和TEARDOWN兩部分。

5. fixture傳遞測試數據

fixture非常適合存放測試數據,可以返回任何數據,尤其是針對介面測試的時候,需要傳入很多組不同的測試數據的的情況。

6. fixture的作用範圍

fixture包含一個叫scope(作用範圍)的可選參數,用於控制fixture執行和銷毀邏輯的頻率。@pytest.fixture()的scope參數有4個值:function、class、module、session,默認為:function。

(1)scope='function'

函數級別的的fixture每個測試函數只需要運行一次。配置程式碼在測試用例運行之前運行,銷毀程式碼在測試用例運行之後運行。

(2)scope='class'

類級別的fixture的每個測試類只需要運行一次,無論測試類中有多少類方法都可以共享這個fixture。

(3)scope='module'

模組級別的fixture每個模組只需要運行一次,無論模組裡面有多少個測試函數、類方法或其他fixture都可以共享這個fixture。

(4)scope='session'

會話級別的fixture每次會話只需要運行一次,一次pytest會話中的所有測試函數、方法都可以共享這個fixture。

綜上作用範圍:session>module>class>function

這次就總結到這,下一次我們繼續介紹fixture,