目錄
- 1、前言
- 2、Fixture的優勢
- 3、Fixture的定義與呼叫
- (1)定義方法
- (2)引數簡要說明
- (3)呼叫方法
- (4)使用
yield實作后置
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
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/501685.html
標籤:Python
