您好,登錄后才能下訂單哦!
本篇內容介紹了“自動化測試框架pytest的Fixture固件怎么調用”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!
Fixture 翻譯成中文即是固件的意思。它其實就是一些函數,會在執行測試方法/測試函數之前(或之后)加載運行它們,常見的如接口用例在請求接口前數據庫的初始連接,和請求之后關閉數據庫的操作。
我們之前在APP UI自動化系列中已經介紹過 unittest 的相關測試固件,如setup
、teardown
等。而 pytest 中提供了功能更加豐富的Fixture
,用于實現setup
、teardown
功能。
使用@pytest.fixture()
進行定義,簡單示例如下:
import pytest @pytest.fixture() def before(): print("連接數據庫")
調用單個fixture函數
方式一,使用fixture函數名作為參數
import pytest @pytest.fixture() def before(): print("連接數據庫") # 調用before def test_01(before): print("執行test_01")
方式二,使用 @pytest.mark.usefixtures('fixture函數名')
裝飾器
import pytest @pytest.fixture() def before(): print("連接數據庫") # 調用before @pytest.mark.usefixtures('before') def test_01(): print("執行test_01")
方式三,使用autouse
參數自動執行fixture
函數
import pytest # fixture函數定義的時候使用autouse參數,作用域范圍內的測試用例會自動調用該fixture函數 @pytest.fixture(autouse=True) def before(): print("連接數據庫") # 自動調用before def test_01(): print("執行test_01")
三種方式調用后的結果都如下:
我們可以看到,先執行了fixture
函數,再執行測試函數。
調用多個fixture函數
import pytest @pytest.fixture() def before(): print("連接數據庫") @pytest.fixture() def before_s(): print("初始化數據") def test_01(before, before_s): print("執行test_01")
調用多個 fixture 函數時,由前至后依次執行,所以test_01()
調用時先執行before
,再執行before_s
。
對fixture函數重命名
定義fixture
函數時,可以利用name
參數進行重命名,方便用于調用,示例如下:
import pytest @pytest.fixture(name='db') def connect_order_db(): print("連接數據庫") def test_01(db): print("執行test_01")
在執行完fixture
函數后,有時需要將該fixture
中得到到某些數據傳遞給測試函數/測試方法,用于后續的執行。
fixture
中提供普通傳遞和參數化傳遞兩種數據傳遞方式。
普通傳遞
示例如下:
import pytest @pytest.fixture() def before(): print("連接數據庫") return "連接成功!" def test_01(before): print("執行test_01") assert before == "連接成功!"
注意,如果自定義的fixture
函數有返回值,需要使用上面說的方式一調用才能獲取fixture
函數的返回值并傳入測試函數中,方式二就無法獲取返回值。
參數化傳遞
對fixture
函數進行參數化時,需要使用參數params
,并且需要傳入參數request
,簡單示例如下:
import pytest test_params = [1, 2, 0] @pytest.fixture(params=test_params) def before(request): result = request.param return result def test_02(before): print("執行test_02") assert before if __name__ == '__main__': pytest.main()
執行結果:
可以看到,因為所調用的fixture函數進行了參數化,雖然只有一個測試函數但執行了3次。
上面我們舉的例子都是把fixture函數放在測試用例模塊里面,但如果很多測試模塊需要引用同一個fixture函數怎么辦,這是時候就需要把它放在命名為conftest
的模塊里,這樣同級或以下目錄中的測試用例便能調用這些自定義的fixture函數。
例如,有如下目錄:
├─testcase │ │ │ ├─test_module_01 │ │ test_case_1.py │ │ test_case_2.py │ │ │ ├─test_module_02 │ │ test_case_3.py
test_module_01 中的test_case_1.py
與test_case_2.py
都需要調用同一個 fixture 函數,那么我們只需要在 test_module_01 中新建conftest.py
并編寫這個fixture
函數即可,示例如下:
├─testcase │ │ │ ├─test_module_01 │ │ conftest.py │ │ test_case_1.py │ │ test_case_2.py │ │ │ ├─test_module_02 │ │ test_case_3.py
conftest.py
:
import pytest @pytest.fixture(autouse=True) def before(): print("連接數據庫")
test_case_1.py
:
def test_01(): print("執行test_01")
test_case_2.py
:
def test_02(): print("執行test_02")
這樣,執行這兩個模塊的測試用例時會自動先去調用conftest.py
中的before()
函數。
假設 test_module_02 中的 test_case_3.py 也需要調用這個before()
函數,那么這個時候我們就需要在上一層即 testcase 中新建conftest.py
并編寫這個before()
函數,才能在 test_case_3.py 中調用,如下:
├─testcase │ │ conftest.py │ │ │ ├─test_module_01 │ │ conftest.py │ │ test_case_1.py │ │ test_case_2.py │ │ │ ├─test_module_02 │ │ test_case_3.py
conftest.py
只作用于同級
或以下
目錄中的測試模塊,且需要注意,當以下
層級中存在了另一個conftest.py
,那么以下層級將由另一個conftest.py
文件接管。
pytest 的 fixture 作用域分session
、module
、class
、function
四個級別。在定義 fixture 函數的時候通過scope
參數指定作用范圍,默認為function
。
session
,每次會話執行一次
module
,每個測試模塊執行一次
class
,每個測試類執行一次
function
,每個測試方法執行一次
注意,對于單獨定義的測試函數,class、function 都會起作用,可以從下列示例中看出來。
測試目錄結構如下:
├─apiAutoTest │ │ run.py │ │ │ ├─testcase │ │ │ conftest.py │ │ │ │ │ ├─test_module_02 │ │ │ │ conftest.py │ │ │ │ test_case_3.py │ │ │ │ test_case_4.py
其中conftest.py
代碼如下:
import pytest @pytest.fixture(scope="session", autouse=True) def session_fixture(): print("這是一個作用于session的fixture") @pytest.fixture(scope="module", autouse=True) def module_fixture(): print("這是一個作用于module的fixture") @pytest.fixture(scope="class", autouse=True) def class_fixture(): print("這是一個作用于class的fixture") @pytest.fixture(scope="function", autouse=True) def function_fixture(): print("這是一個作用于function的fixture")
test_case_3.py
代碼如下:
import pytest class TestOrder: def test_a(self): print("test_a") def test_b(self): print("test_b") def test_c(): print("test_c")
test_case_4.py
代碼如下:
def test_e(): print("test_e")
run.py
代碼如下:
import pytest if __name__ == '__main__': pytest.main(["-s"])
運行run.py
,結果如下:
collected 4 items testcase\test_module_02\test_case_3.py 這是一個作用于session的fixture 這是一個作用于module的fixture 這是一個作用于class的fixture 這是一個作用于function的fixture test_a .這是一個作用于function的fixture test_b .這是一個作用于class的fixture 這是一個作用于function的fixture test_c . testcase\test_module_02\test_case_4.py 這是一個作用于module的fixture 這是一個作用于class的fixture 這是一個作用于function的fixture test_e . ============================== 4 passed in 0.04s ==============================
從結果可以看出來:
作用于session
的fixture函數只在所有測試用例執行之前調用了一次
作用于module
的fixture函數在每個測試模塊執行之前調用了一次
作用于class
的fixture函數在每個測試類執行之前調用了一次
作用于function
的fixture函數在每個測試方法/測試函數執行之前調用了一次
注意,在定義的測試函數(如test_c()
、test_e()
)執行之前也會調用scope=class的fixture函數。
“自動化測試框架pytest的Fixture固件怎么調用”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。