<< 返回目錄
1 pytest自動化測試 - pytest夾具的基本概念
??夾具可以為測試用例提供資源(測試數據)、執行預置條件、執行后置條件
,夾具可以是函數、類或模塊,使用@pytest.fixture
裝飾器進行標記。
1.1 夾具的作用范圍
??夾具的作用范圍:
- 函數范圍:夾具默認范圍是函數級,即,每個測試函數執行時,都會執行一遍夾具的前置和
后置條件
- 類范圍:夾具的
前置條件
在類的第一個測試函數執行前執行,在類的最后一個測試函數執行后執行。 - 模塊范圍:夾具的
前置條件
在模塊的第一個測試函數執行前執行,在模塊的最后一個測試函數執行后執行。 - 會話范圍:夾具的
前置條件
在測試會話開始時執行一次,后置條件
在測試會話結束時執行一次。
1.1.1 函數范圍的夾具
??默認(未指定參數)時是函數級的范圍。
import pytest@pytest.fixture
def setup_resource():# 準備資源resource = "This is a test resource"print("\n" + "="*65)print("BEGIN: 用例預置條件.")yield resource# 清理資源print("END: 用例`后置條件`.")def test_with_fixture(setup_resource):print("第一個用例開始".center(70))assert "test resource" in setup_resourceprint("第一個用例結束".center(70))def test_another_with_fixture(setup_resource):print("第二個用例開始".center(70))assert len(setup_resource) > 10print("第二個用例結束".center(70))
??yield
前的語句是前置條件
,yield
后的語句是后置條件
。夾具中的前置條件
和后置條件
,在每個測試用例中都會執行。
輸出:
============================= test session starts =============================
platform win32 -- Python 3.13.1, pytest-8.3.4, pluggy-1.5.0
rootdir: D:\TYYSOFT\Study\Python\pytest
collected 2 itemstest_ft_subf_fixture_001.py
=================================================================
BEGIN: 用例預置條件.第一個用例開始 第一個用例結束
.END: 用例`后置條件`.=================================================================
BEGIN: 用例預置條件.第二個用例開始 第二個用例結束
.END: 用例`后置條件`.============================== 2 passed in 0.01s ==============================
??從報文可以看到,夾具中的前置條件
在用例開始前執行,后置條件
,在用例執行結束時執行。
1.1.2 類范圍的夾具
??通過參數@pytest.fixture(scope="class")
可以指定夾具的類范圍
import pytest@pytest.fixture(scope="class")
def setup_class_resource():resource = "Class resource"print("\n" + "=" * 65)print("【預置條件】")yield resourceprint("【`后置條件`】.")class TestClassWithFixture:def test_class_fixture(self, setup_class_resource):print("第1個測試用例開始.")assert "Class" in setup_class_resourceprint("第1個測試用例結束.\n")def test_another_class_fixture(self, setup_class_resource):print("第2個測試用例開始.")assert len(setup_class_resource) > 10print("第2個測試用例結束.")
輸出:
============================= test session starts =============================
platform win32 -- Python 3.13.1, pytest-8.3.4, pluggy-1.5.0
rootdir: D:\TYYSOFT\Study\Python\pytest
collected 2 itemstest_ft_fixture_class_001.py
=================================================================
【預置條件】
第1個測試用例開始.
第1個測試用例結束..第2個測試用例開始.
第2個測試用例結束.
.【`后置條件`】.============================== 2 passed in 0.01s ==============================
1.1.3 模塊范圍的夾具
??前置條件
在模塊第一個測試函數執行前執行,后置條件
在最后一個函數執行后執行。
import pytest@pytest.fixture(scope="module")
def setup_module_resource():resource = "Module resource"print("\n" + "=" * 65)print("【預置條件】")yield resourceprint("【`后置條件`】")def test_module_fixture1(setup_module_resource):print("第1個用例開始")assert "Module" in setup_module_resourceprint("第1個用例結束\n")def test_module_fixture2(setup_module_resource):print("第2個用例開始")assert len(setup_module_resource) > 10print("第2個用例結束\n")#這個函數函數沒有使用夾具
def test_module_fixture3():print("第3個用例開始")assert len("測試不用夾具的函數是否會干擾") > 10print("第3個用例結束")
輸出:
============================= test session starts =============================
platform win32 -- Python 3.13.1, pytest-8.3.4, pluggy-1.5.0
rootdir: D:\TYYSOFT\Study\Python\pytest
collected 3 itemstest_ft_fixture_module_001.py
=================================================================
【預置條件】
第1個用例開始
第1個用例結束.第2個用例開始
第2個用例結束.第3個用例開始
第3個用例結束
.【`后置條件`】============================== 3 passed in 0.01s ==============================
??說明:模塊中即使存在測試函數沒有使用夾具,也不會干擾夾具中的預置條件和后置條件
,預置條件始終保存在模塊開始執行前執行,后續條件在模塊的所有函數執行完時執行。
1.1.4 會話范圍的夾具
??下面的示例探索模塊范圍和會話范圍的區別,其中test_ft_fixture_module_001
是上一個示例中的模塊范圍的測試代碼,使用from test_ft_fixture_module_001 import *
將模塊的所有夾具和用例導入到本用例。
import pytest
from test_ft_fixture_module_001 import *@pytest.fixture(scope="session")
def setup_session_resource():resource = "Session resource"print("\n" + "=" * 65)print("【會話-`前置條件`】")yield resourceprint("【會話-`后置條件`】")def test_session_fixture1(setup_session_resource):print("會話-第1個用例開始")assert "Session" in setup_session_resourceprint("會話-第1個用例結束\n")def test_session_fixture2(setup_session_resource):print("會話-第2個用例開始")assert len(setup_session_resource) > 10print("會話-第2個用例結束\n")def test_session_fixture3():print("會話-第3個用例開始")assert len("測試沒有使用夾具的第3個用例對`后置條件`的影響") > 10print("會話-第3個用例結束")
輸出:
============================= test session starts =============================
platform win32 -- Python 3.13.1, pytest-8.3.4, pluggy-1.5.0
rootdir: D:\TYYSOFT\Study\Python\pytest
collected 6 itemstest_ft_fixture_session_001.py
=================================================================
【模塊-預置條件】
模塊-第1個用例開始
模塊-第1個用例結束.模塊-第2個用例開始
模塊-第2個用例結束.模塊-第3個用例開始
模塊-第3個用例結束
.
=================================================================
【會話-`前置條件`】
會話-第1個用例開始
會話-第1個用例結束.會話-第2個用例開始
會話-第2個用例結束.會話-第3個用例開始
會話-第3個用例結束
.【模塊-`后置條件`】
【會話-`后置條件`】============================== 6 passed in 0.02s ==============================
從執行結果來看,模塊的預置條件在最開始執行,緊隨其后的是導入的模塊中的測試函數,而會話的前置條件
只在當前模塊執行前才執行,后置條件
是先執行了模塊的后置條件
,再執行會話的后置條件
作者聲明:本文用于記錄和分享作者的學習心得,可能有部分文字或示例來源自豆包AI,由于本人水平有限,難免存在表達錯誤,歡迎留言交流和指教!
Copyright ? 2022~2025 All rights reserved.
<< 返回目錄