1. 程式人生 > 實用技巧 >pytest之fixture的詳細使用

pytest之fixture的詳細使用

前言

1、首先要理解unittest中setup、teardown的作用,可以實現在執行用例前或結束後加入一些操作,但這種都是針對整個測試類全域性生效的

2、如果有以下場景:用例 1 需要先登入,用例 2 不需要登入,當每個測試用例的執行環境和條件都不一樣時,顯然無法用 setup 和 teardown 來實現

3、fixture可以使環境管理更靈活,每個測試用例可以有自己的fixture

fixture的優勢

1、命名方式靈活,不侷限於 setup 和teardown 這幾個命名

2、需要和conftest.py同時使用,可以實現資料共享,不需要 import 就能自動找到fixture

3、scope="module" 可以實現多個.py 跨檔案共享前置

4、scope="session" 以實現多個.py 跨檔案使用一個 session 來完成多個用例

fixture引數列表

  • scope:可以理解成fixture的作用域,預設:function,還有class、module、package、session四個【常用】
  • autouse:預設False,需要用例手動呼叫該fixture;如果是True,所有作用域內的測試用例都會自動呼叫該fixture
  • name:預設裝飾器的名稱,同一模組的fixture相互呼叫建議寫不同的name

測試用例如何呼叫fixture

  1. 將fixture名稱作為測試用例函式的輸入引數
  2. 測試用例加上裝飾器:@pytest.mark.usefixtures(fixture_name)

注意:

添加了@pytest.fixture,如果fixture還想依賴其他fixture,需要用函式傳參的方式,不能用@pytest.mark.usefixtures()的方式,否則不會生效

@pytest.fixture(scope="session")

def open():

  print("===開啟瀏覽器===")

@pytest.fixture #

@pytest.mark.usefixtures("open") #不生效

def login(open): # 方法級別前置操作setup

  print(f"輸入賬號,密碼先登入{open}")

前面都是setup的操作,那麼現在就來講下teardown怎麼實現

fixture之yield實現teardown

用fixture實現teardown並不是一個獨立的函式,而是用yield關鍵字來開啟teardown操作

@pytest.fixture
def init_driver():
print('begin driver')
driver = webdriver.Chrome()
login_page = LoginPage(driver)
driver.get('http://120.78.128.25:8765/Index/login.html')
yield (driver,login_page)#相當於setup
#生成器,迭代器
driver.quit()
print('quit driver')

注意:

1、如果yield前面的程式碼,即setup部分已經丟擲異常了,則不會執行yield後面的內容

2、如果測試用例丟擲異常,yield後面的內容還是會正常執行

3、帶有 yield 的函式在 Python 中被稱之為 generator(生成器),生成器就是一邊迴圈一邊計算的機制,yield 的好處是顯而易見的,把一個函式改寫為一個 generator 就獲得了迭代能力

4、與return的區別:return後面的程式碼不會執行,yield後面的程式碼繼續執行