最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

一文帶你掌握Python?pytest的前后置處理機制與方法

 更新時間:2026年04月16日 09:17:32   作者:Lightning-py  
pytest?提供了多種靈活的前置(setup)和后置(teardown)處理機制,從簡單的函數(shù)級到復(fù)雜的模塊/會話級,下面小編就和大家詳細介紹一下,希望對大家有所幫

在 pytest 中,確保后置清理代碼一定會執(zhí)行(無論測試通過、失敗還是發(fā)生異常),推薦使用以下兩種最穩(wěn)健的方式:

1. 使用yield的 fixture(推薦)

在 fixture 的 yield 之后編寫清理代碼,pytest 會在測試結(jié)束后自動運行這些代碼,即使測試斷言失敗或拋出異常。

import pytest
@pytest.fixture
def db_connection():
    # 前置:建立連接
    conn = create_connection()
    yield conn
    # 后置:一定會執(zhí)行(除非 fixture 前置階段就掛了)
    conn.close()
def test_query(db_connection):
    assert db_connection.query("SELECT 1") == 1

注意:如果 yield 之前的代碼(建立連接)拋出了異常,那么 yield 之后的清理代碼不會執(zhí)行,因為 fixture 本身沒有成功初始化。這是合理的——資源從未被成功獲取,自然無需釋放。

2. 使用request.addfinalizer

功能與 yield 類似,但以注冊回調(diào)函數(shù)的方式顯式聲明清理邏輯。

import pytest
@pytest.fixture
def db_connection(request):
    conn = create_connection()
    def cleanup():
        conn.close()
    request.addfinalizer(cleanup)   # 注冊后置函數(shù)
    return conn

同樣,addfinalizer 注冊成功后的清理函數(shù)一定會執(zhí)行。

3. 在測試類或模塊中使用傳統(tǒng)teardown方法

適用于經(jīng)典的 xUnit 風(fēng)格,pytest 完全支持:

方法級def teardown_method(self, method):

類級def teardown_class(cls):

模塊級def teardown_module(module):

class TestDatabase:
    def setup_method(self):
        self.conn = create_connection()
    def teardown_method(self):
        self.conn.close()   # 每個測試方法結(jié)束后一定會執(zhí)行
    def test_query(self):
        assert self.conn.query("SELECT 1") == 1

4. 如果需要“無論如何(即使 fixture 設(shè)置失?。┒紙?zhí)行清理”

如果存在必須執(zhí)行的全局資源回收(例如臨時文件、進程等),可以在 fixture 中使用 try/finally

@pytest.fixture
def temp_file():
    f = None
    try:
        f = open("/tmp/test.txt", "w")
        yield f
    finally:
        if f:
            f.close()
        # 或者無條件刪除文件

但這種情況較少見,因為通常設(shè)置失敗時資源尚未分配,無需清理。

方式是否保證后置執(zhí)行備注
yield fixture?(前置成功時)最推薦,代碼簡潔
request.addfinalizer?(前置成功時)與 yield 等價
teardown_* 方法?(對應(yīng)作用域)適用于傳統(tǒng)風(fēng)格
try/finally?(無條件)適合必須清理的場景

5.方法補充

1.使用 setup_function / teardown_function(函數(shù)級別)

適用于獨立函數(shù)的測試用例。

def setup_function(function):
    print("\n[前置] 在每個測試函數(shù)前執(zhí)行")
def teardown_function(function):
    print("[后置] 在每個測試函數(shù)后執(zhí)行")
def test_add():
    assert 1 + 1 == 2
def test_multiply():
    assert 2 * 3 == 6

2.使用 setup_method / teardown_method(類內(nèi)方法級別)

適用于測試類中的每個測試方法。

class TestMath:

    def setup_method(self):
        print("\n[前置] 每個測試方法前執(zhí)行")

    def teardown_method(self):
        print("[后置] 每個測試方法后執(zhí)行")

    def test_add(self):
        assert 1 + 1 == 2

    def test_multiply(self):
        assert 2 * 3 == 6

3. 使用 setup_class / teardown_class(類級別)

整個測試類只執(zhí)行一次前置和后置。

class TestDatabase:

    @classmethod
    def setup_class(cls):
        print("\n[前置] 整個測試類只執(zhí)行一次")

    @classmethod
    def teardown_class(cls):
        print("[后置] 整個測試類只執(zhí)行一次")

    def test_connection(self):
        assert True

    def test_query(self):
        assert True

4. 使用 setup_module / teardown_module(模塊級別)

在整個模塊(文件)的所有測試前后執(zhí)行一次。

# test_example.py
def setup_module(module):
    print("\n[前置] 模塊級別,執(zhí)行一次")

def teardown_module(module):
    print("[后置] 模塊級別,執(zhí)行一次")

def test_a():
    assert True

def test_b():
    assert True

5. 使用 @pytest.fixture(最推薦、最強大)

fixture 是 pytest 的核心功能,可以實現(xiàn)任意粒度的前后置,并支持依賴注入、作用域控制、自動清理等。

基本用法(函數(shù)級)

import pytest

@pytest.fixture
def db_connection():
    print("\n[前置] 建立數(shù)據(jù)庫連接")
    conn = {"host": "localhost", "port": 3306}
    yield conn   # 將資源傳遞給測試函數(shù)
    print("[后置] 關(guān)閉數(shù)據(jù)庫連接")

def test_query(db_connection):
    assert db_connection["port"] == 3306

作用域控制

通過 scope 參數(shù)控制生命周期:

scope作用域
function每個測試函數(shù)(默認)
class每個測試類
module每個模塊文件
package每個包
session整個測試會話
@pytest.fixture(scope="module")
def shared_resource():
    print("\n[前置] 模塊級別共享資源")
    yield {"data": "shared"}
    print("[后置] 清理共享資源")

自動使用(autouse=True)

無需在測試參數(shù)中顯式引用,自動在每個作用域執(zhí)行。

@pytest.fixture(autouse=True)
def auto_log():
    print("\n[自動前置] 記錄測試開始")
    yield
    print("[自動后置] 記錄測試結(jié)束")

def test_something():
    assert True   # 前后置會自動執(zhí)行

使用 request 對象獲取上下文

@pytest.fixture
def resource(request):
    print(f"測試函數(shù)名: {request.node.name}")
    # 可訪問 module, cls, function 等
    yield
    print("清理")

6.使用 pytestmark 模塊級標(biāo)記

可以在模塊頂部定義 pytestmark 來應(yīng)用 fixture 到整個模塊。

import pytest

pytestmark = pytest.mark.usefixtures("db_connection")

def test_1():
    pass

def test_2():
    pass

7.通過 conftest.py 共享 fixture

將 fixture 定義在 conftest.py 文件中,可被多個測試文件共享。

# conftest.py
import pytest

@pytest.fixture(scope="session")
def global_config():
    return {"env": "test"}
# test_foo.py
def test_config(global_config):
    assert global_config["env"] == "test"

8.前后置執(zhí)行順序總結(jié)

在一個測試函數(shù)中,各鉤子的執(zhí)行順序:

setup_module
  setup_class
    setup_method
      setup_function (對函數(shù)測試有效)
        <測試函數(shù)體>
      teardown_function
    teardown_method
  teardown_class
teardown_module

而 fixture 的 yield 前后代碼分別對應(yīng)前置和后置,且支持嵌套依賴。

推薦實踐

  • 簡單場景setup_method / teardown_method 或 setup_function。
  • 復(fù)雜/可復(fù)用場景始終優(yōu)先使用 @pytest.fixture,因為它更靈活、支持依賴注入、作用域可控、更符合 pytest 的設(shè)計哲學(xué)。
  • 全局共享:使用 conftest.py + scope="session"

通過合理使用這些機制,可以編寫出清晰、高效、易于維護的測試用例。

到此這篇關(guān)于一文帶你掌握Python pytest的前后置處理機制與方法的文章就介紹到這了,更多相關(guān)pytest前后置處理內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Pandas之?dāng)?shù)據(jù)追加df.append方式

    Pandas之?dāng)?shù)據(jù)追加df.append方式

    這篇文章主要介紹了Pandas之?dāng)?shù)據(jù)追加df.append方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • Python數(shù)據(jù)分析入門之?dāng)?shù)據(jù)讀取與存儲

    Python數(shù)據(jù)分析入門之?dāng)?shù)據(jù)讀取與存儲

    今天繼續(xù)帶大家學(xué)習(xí)python數(shù)據(jù)分析,下文中有非常詳細的代碼示例,清楚地解釋了python數(shù)據(jù)讀取與存儲的相關(guān)知識,需要的朋友可以參考下
    2021-05-05
  • python實現(xiàn)圖像自動Gamma校正方式

    python實現(xiàn)圖像自動Gamma校正方式

    這篇文章主要介紹了python實現(xiàn)圖像自動Gamma校正方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-10-10
  • Django實現(xiàn)的自定義訪問日志模塊示例

    Django實現(xiàn)的自定義訪問日志模塊示例

    這篇文章主要介紹了Django實現(xiàn)的自定義訪問日志模塊,結(jié)合具體實例形式分析了Django針對日志的相關(guān)操作技巧,需要的朋友可以參考下
    2017-06-06
  • python語言中pandas字符串分割str.split()函數(shù)

    python語言中pandas字符串分割str.split()函數(shù)

    分列在我們?nèi)粘9ぷ髦薪?jīng)常用到,從各種系統(tǒng)中導(dǎo)出的什么訂單號、名稱、日期很多都是復(fù)合組成的,這些列在匹配、合并時沒有辦法使用,我們經(jīng)常需要將她們分開,下面這篇文章主要給大家介紹了關(guān)于python語言中pandas字符串分割str.split()函數(shù)的相關(guān)資料,需要的朋友可以參考下
    2022-08-08
  • Python制作一個仿QQ辦公版的圖形登錄界面

    Python制作一個仿QQ辦公版的圖形登錄界面

    這篇文章主要介紹了Python制作一個仿QQ辦公版的圖形登錄界面,幫助大家更好的理解和使用python,感興趣的朋友可以了解下
    2020-09-09
  • Python+dddocr實現(xiàn)自動化通過多缺口滑塊驗證

    Python+dddocr實現(xiàn)自動化通過多缺口滑塊驗證

    滑塊驗證是一種常見的反爬蟲手段,多缺口滑塊驗證則是在背景圖上有多個缺口,滑塊需要精確拖動到正確的缺口位置,下面我們就來看看如何使用Python實現(xiàn)自動化通過多缺口滑塊驗證吧
    2025-06-06
  • flask使用session保存登錄狀態(tài)及攔截未登錄請求代碼

    flask使用session保存登錄狀態(tài)及攔截未登錄請求代碼

    這篇文章主要介紹了flask使用session保存登錄狀態(tài)及攔截未登錄請求代碼,具有一定借鑒價值,需要的朋友可以參考下
    2018-01-01
  • 利用Python統(tǒng)計Jira數(shù)據(jù)并可視化

    利用Python統(tǒng)計Jira數(shù)據(jù)并可視化

    目前公司使用 Jira 作為項目管理工具,在每一次迭代完成后的復(fù)盤會上,我們都需要針對本次迭代的 Bug 進行數(shù)據(jù)統(tǒng)計,以幫助管理層能更直觀的了解研發(fā)的代碼質(zhì)量。本篇文章將介紹如何利用統(tǒng)計 Jira 數(shù)據(jù),并進行可視化,需要的可以參考一下
    2022-07-07
  • Python 繼承,重寫,super()調(diào)用父類方法操作示例

    Python 繼承,重寫,super()調(diào)用父類方法操作示例

    這篇文章主要介紹了Python 繼承,重寫,super()調(diào)用父類方法,結(jié)合完整實例形式詳細分析了Python面向?qū)ο蟪绦蛟O(shè)計中子類繼承與重寫父類方法的相關(guān)操作技巧,需要的朋友可以參考下
    2019-09-09

最新評論

航空| 常州市| 沧源| 前郭尔| 航空| 平邑县| 新巴尔虎左旗| 昭平县| 南宫市| 冷水江市| 肇源县| 汶川县| 正镶白旗| 嘉鱼县| 二手房| 宁波市| 道孚县| 台北县| 额济纳旗| 东兴市| 安宁市| 溧水县| 汝南县| 汉中市| 巴林左旗| 望江县| 大渡口区| 兴海县| 繁峙县| 杭锦旗| 保亭| 家居| 玛纳斯县| 宁安市| 北安市| 嘉善县| 佳木斯市| 启东市| 霍州市| 平凉市| 哈密市|