pytest 固件作用域

固件(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 的用法就類似了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章