固件(Fixture)是一些函數,pytest 會在執行測試函數之前(或之後)加載運行它們。我們可以利用固件做任何事情,其中最常見的可能就是數據庫的初始連接和最後關閉操作。Pytest 使用文件 conftest.py
集中管理固件。不要自己顯式調用 conftest.py
,pytest 會自動調用,可以把 conftest 當做插件來理解。
固件的作用是爲了抽離出重複的工作和方便複用,爲了更精細化控制固件(比如只想對數據庫訪問測試腳本使用自動連接關閉的固件),pytest 使用作用域來進行指定固件的使用範圍。
在定義固件時,通過 scope
參數聲明作用域,可選項有:
function
: 函數級,每個測試函數都會執行一次固件;class
: 類級別,每個測試類執行一次,所有方法都可以使用;module
: 模塊級,每個模塊執行一次,模塊內函數和方法都可使用;session
: 會話級,一次測試只執行一次,所有被找到的函數和方法都可用。#conftest.py import pytest @pytest.fixture(scope='function') def func_scope(): pass @pytest.fixture(scope='module') def mod_scope(): pass @pytest.fixture(scope='session') def sess_scope(): pass
-
#test_scope.py def test_multi_scope(class_scope,sess_scope, mod_scope, func_scope): pass def test_multi_scope1(class_scope,sess_scope, mod_scope, func_scope): pass
執行pytest --setup-show test_scope,可以看到 sess_scope mod_scope只執行了一次,class_scope func_scope 在每個函數調用的時候都會被執行,引申作用,比如登錄的 就可以寫到func_scope中,保證每次腳本執行前都登錄 數據庫的鏈接 數據的初始化,可以放到sess_scope中,只需要做一次就可以。
對於類的作用域,就要用到pytest.mark.userfixtures,例子如下:
import pytest
@pytest.mark.usefixtures('class_scope')
class TestClassScope:
def test_1(self):
pass
def test_2(self):
pass
輸出爲:
此時我們改爲func_scope,輸出變爲:
這種結果,和unitest中的setupclass 和setup 的用法就類似了。