1. 程式人生 > 其它 >pytest 之 fixture

pytest 之 fixture

Fixture 原始碼詳解: fixture(scope='function',params=None,autouse=False,ids=None,name=None)
  • scope: 作用域範圍,有4個引數“function(預設),class,module,session”
-function:每一個函式或方法都會呼叫
-class:每一個類呼叫一次,一個類中可以有多個方法
-module:每一個.py檔案呼叫一次,該檔案內又有多個function和class
-session:是多個檔案呼叫一次,可以跨.py檔案呼叫,每個.py檔案就是module
  • params: 一個可選的引數列表,實現引數化功能
@pytest.fixture(params=["harry","赫敏"],ids=["11",'22'])
def login(request):   # request是一個關鍵字,也是一個fixture
    print("login")
    return request.param   #request.param固定寫法

def test_search(login):
    print(login)
    print("搜尋")
  • autouse:預設 False,需要呼叫來啟用fixture;如果為True,則所有用例自動呼叫fixture
  • ids:用例標識ID,每個ids 對應於params,如果沒有id 它們將從params自動生產
  • name:fixture的重新命名。如果使用了name,那隻能將name傳如,函式名不再生效,如:
import pytest
@pytest.fixture(name="new_fixture")
def test_name():
    pass
    
#使用name引數後,傳入重新命名函式,執行成功
def test_1(new_fixture):
    print("使用name引數後,傳入重新命名函式,執行成功")

#使用name引數後,仍傳入函式名稱,會失敗
def test_2(test_name):
    print("使用name引數後,仍傳入函式名稱,會失敗")

  

Fixture 用法 功能:Fixture 是為了測試用例的執行,初始化一些資料和方法,類似 setUp、tearDown 功能,但比setUp,tearDown 更靈活 1、呼叫fixture的三種方式
  • 直接傳fixture函式名字呼叫
  • 使用裝飾器 @pytest.mark.usefixtures("test1")
區別:如果fixture有返回值,usefixture無法獲取到返回值,這個是裝飾器usefixture與用例直接傳fixture引數的區別。 當fixture需要用到return出來的引數時,只能將引數名稱直接當引數傳入,不需要用到return出來的引數時,兩種方式都可以。
  • 使用 autouse =True 自動呼叫,如果要返回值,需要傳 fixture函式名
作用域(scope)廣泛:session>module>class>function 2、其他用法:
  • 允許使用多個Fixture
  • 可以提供測試資料,實現引數化的功能
  • fixture 也可以呼叫 fixture
  • 命令列:-setup-show 回溯fixture 的執行過程,檢視當前檔案呼叫的哪個fixture
樣例:
@pytest.fixture(scope='module')   # scope 設定作用域
def aa():
    print("開始計算")
    token = datetime.datetime.now()
    return token

@pytest.fixture()
def bb():
    print("再次計算")
    yield
    print("結束啦")

# 呼叫方式一:直接通過函式名字呼叫,根據順序呼叫
def test_order(aa):
    print("下單")
    print(aa)

# 呼叫方式二:直接通過函式名字呼叫,呼叫順序從內到外;這種呼叫方式不能呼叫返回值
@pytest.mark.usefixtures('aa')
# @pytest.mark.usefixtures('bb')
def test_order1():
    print(aa)
    print("下單1")

  

conftest.py 用法 存在原因:fixture為session級別是可以跨.py模組呼叫的,也就是當我們有多個.py檔案的用例的時候,如果多個用例只需呼叫一次fixture,那就可以設定為scope="session",並且寫到conftest.py檔案裡。
  • 資料共享的檔案,檔名字固定的不能改,指令碼執行優先執行該檔案
  • 可以存放fixture, hook函式
  • 就近生效:當前 conftest.py 檔案所在路徑及其下級檔案均可呼叫,優先呼叫當前包的conftest.py,其次上級包的conftest.py檔案
  • 當前目錄一定要有__init__.py 檔案,也就是在一個包下
  • conftest.py⽂件絕對不能當⼀般的模組匯入
@pytest.fixture(scope="module",autouse=True)
def login():
    print("登入操作")
    token = datetime.datetime.now()
    yield token   # yield 相當於return  被呼叫時先執行yield前面的程式碼,最後執行yield之後的程式碼
    print("登出操作")

@pytest.fixture()
def get_username(login):
    print(login)
    name='赫敏'
    print(name)
    return name

  呼叫檔案:

def test_cart(login):
    print(login)
    print("購物")

def test_order(login):
    print(login)
    print("下單")