1、前言 fixture中文名翻譯為夾具,作用與上一篇中setup和teardown一致,都是用來做前後置處理的,但fixture更靈活更強大。它支持部分前後置,比如有時候我們不需要為每一條測試用例都添加前後置,使用setup和teardown要麼為整個模塊添加前後置,要麼為整個類,所有類方法,所有 ...
目錄
1、前言
fixture
中文名翻譯為夾具,作用與上一篇中setup
和teardown
一致,都是用來做前後置處理的,但fixture
更靈活更強大。它支持部分前後置,比如有時候我們不需要為每一條測試用例都添加前後置,使用setup
和teardown
要麼為整個模塊添加前後置,要麼為整個類,所有類方法,所有函數添加前後置,使用fixture
就可以很好的解決這個場景的問題。
2、Fixture的優勢
- 可以實現部分前後置,如前言中所述
- 名稱可以自定義,無需像
setup
和teardown
一樣有固定命名 - 可以通過
conftest.py
文件進行全局配置,實現共用前後置,且不需要import
- 可以通過設置
scope
參數實現與setup
和teardown
各級別一樣的功能,而且多一個session
級別,實現了多模塊前後置 - 可以實現unittest不能實現的功能,比如unittest測試用例間無法傳遞參數和數據,通過fixture可以解決這個問題
3、Fixture的定義與調用
(1)定義方法
import pytest
@pytest.fixture()
def my_fixture():
print("定義一個試夾具")
(2)參數簡要說明
fixture(scope="function", params=None, autouse=False, ids=None, name=None):
scope
:表示所定義fixture
的作用域function
:函數級別(預設作用域),每個用例都運行一次class
:類級別,每個類只執行一次module
:模塊級別,每個模塊只執行一次package
:包級別,每個python包值執行一次session
:session
級別,整個會話只執行一次,即運行項目時整個過程只執行一次
params
:一個可選參數列表,可用於參數化或給其他fixture
傳遞數據autouse
:自動使用,預設值為False
,設置True
時配合scope
實現setup
和teardown
一樣的全部前後置ids
:一個字元串id
的列表,即當使用params
參數化時,為每一種數據值提供對應的參數名name
:為定義的fixture
提供一個別名
(3)調用方法
- 方式一:將定義的
fixture
名稱或別名作為測試用例的參數,可以傳遞多個,按先後順序執行
import pytest
@pytest.fixture()
def fixture_1():
print("這是一個前置處理")
def testcase_1(fixture_1):
print("這是測試用例1")
"""
執行結果
fixture/use_fixture_1.py::testcase_1 這是一個前置處理
這是測試用例1
PASSED
"""
- 方式二:使用
@pytest.mark.usefixture(fixture_name)
裝飾器- 在類上使用,表示類中所有測試方法都會調用這個
fixture
- 在函數上使用,表示只有這個函數會調用這個
fixture
- 同樣可以傳遞多個
fixture
,按順序執行 - 如果
fixture
設置了別名,無法使用這個裝飾器調用fixture
- 如果
fixture
有返回值,用這個裝飾器無法獲取返回值,也就無法給測試用例傳遞數據實現參數化
- 在類上使用,表示類中所有測試方法都會調用這個
import pytest
@pytest.fixture()
def fixture_2():
print("這是一個前置處理")
@pytest.mark.usefixtures("fixture_2")
def test_2():
print("這是測試用例2")
"""
執行結果
fixture/use_fixture_2.py::test_2 這是一個前置處理
這是測試用例2
PASSED
"""
- 方式三:
fixture
設置autouse=True
實現自動調用,同樣無法獲取返回值
import pytest
@pytest.fixture(autouse=True)
def fixture_3():
print("這是一個前置處理")
def testcase_1():
print("這是測試用例1")
def testcase_2():
print("這是測試用例2")
"""
執行結果
fixture/use_fixture_3.py::testcase_1 這是一個前置處理
這是測試用例1
PASSED
fixture/use_fixture_3.py::testcase_2 這是一個前置處理
這是測試用例2
PASSED
"""
(4)使用yield
實現後置
前面的案例都是加了前置處理,相當於setup()
,後置teardown()
在fixture
中是通過yield
關鍵字來實現
import pytest
@pytest.fixture(autouse=True)
def fixture_3():
print("這是一個前置處理")
yield
print("這是一個後置處理")
def testcase_1():
print("這是測試用例1")
def testcase_2():
print("這是測試用例2")
"""
執行結果
fixture/use_fixture_3.py::testcase_1 這是一個前置處理
這是測試用例1
PASSED這是一個後置處理
fixture/use_fixture_3.py::testcase_2 這是一個前置處理
這是測試用例2
PASSED這是一個後置處理
"""
參考
https://www.cnblogs.com/miki-peng/p/14736425.html
https://www.cnblogs.com/liuyuelinfighting/p/15998510.html