一、前言
fixture是pytest的核心功能,也是亮點功能,熟練掌握fixture的使用方法,pytest用起來才會得心應手!
二、fixture簡介
fixture的目的是提供一個固定基線,在該基線上測試可以可靠地和重復地執行。fixture提供了區別於傳統單元測試(setup/teardown)有顯著改進:
(1)有獨立的命名,並通過聲明它們從測試函數、模塊、類或整個項目中的使用來激活;
(2)按模塊化的方式實現,每個fixture都可以相互調用;
(3)fixture的范圍從簡單的單元擴展到復雜的功能測試,允許根據配置和組件選項對fixture和測試用例進行參數化,或者跨函數function,類class,模塊module或整個測試會話session范圍。
三、fixture作為參數傳入
定義fixture跟定義普通函數差不多,唯一區別就是在函數上加個裝飾器@pytest.fixture(),fixture命名不要用test_開頭,跟用例區分開。用例才是test_開頭的命名。
fixture是可以有返回值的,如果沒return默認返回None。用例調用fixture的返回值,直接就是吧fixture的函數名稱當成變量名稱,如下案例
import pytest @pytest.fixture() def user(): print("獲取用戶名") a = "admin" return a def test_1(user): assert user == "admin" if __name__ == "__main__": pytest.main(["-s","test_fixture1.py"])
運行結果:
四、error和failed區別
測試結果一般有三種:passed、failed、error。(skip的用例除外)
如果在test_用例里面斷言失敗,那就是failed
import pytest @pytest.fixture() def user(): print("獲取用戶名") a = "admin" return a def test_1(user): assert user == "admin111" if __name__=="__main__": pytest.main(["-s","test_fixture2.py"])
如果在fixture里面斷言失敗了,那就是error
import pytest @pytest.fixture() def user(): print("獲取用戶名") a = "admin" assert a == "admin123" return a def test_1(user): assert user=="admin" if __name__=="__main__": pytest.main(["-s","test_fixture3.py"])
參考文章:https://www.jianshu.com/p/8b21deb27262