pytest 之 fixture
阿新 • • 發佈:2021-08-03
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")
- 使用 autouse =True 自動呼叫,如果要返回值,需要傳 fixture函式名
- 允許使用多個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("下單")