前言
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
- 將fixture名稱作為測試用例函數的輸入參數
- 測試用例加上裝飾器:@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操作

注意:
1、如果yield前面的代碼,即setup部分已經拋出異常了,則不會執行yield后面的內容
2、如果測試用例拋出異常,yield后面的內容還是會正常執行
3、帶有 yield 的函數在 Python 中被稱之為 generator(生成器),生成器就是一邊循環一邊計算的機制,yield 的好處是顯而易見的,把一個函數改寫為一個 generator 就獲得了迭代能力
4、與return的區別:return后面的代碼不會執行,yield后面的代碼繼續執行