pytest fixture超級靈活 缺乏百度文檔學習,很多騷操作(繼承、共享……),面試也愛問,多看多寫。
前后置條件公式:
@pytest.fixture #無參則默認為函數級別,可帶參數 加上:(scope=”class”/”module”/”session”, auto=True)
Def fun1():
前置條件執行體
Yield 返回值
后置條件執行體
#用例方法要調用前后置條件時:
@pytest.mark.usefixtures(“fun1”)
def test_add(self, fun1): #要用前置條件函數中返回值時,此處用例方法才需傳參,參數名一定同fixture函數名
XXX
XXX
Fixture騷操作---fixture的繼承
如下圖代碼,init_driver 是 login_web的 一部分,兩個都是函數級別的前后置條件,可以使用繼承來優化Login_web。
自己理解:此處繼承其實更像調用,先執行別人的代碼,再執行自己的代碼,如果要用到別人的返回值,仍用別人的函數名接收返回值直接使用。
繼承了其他的前后置,其實是先執行一遍其它前后置函數中的語句。所以說省代碼!
使用繼承后 login_web函數改為如下:
# 訪問網站並且登陸成功
@pytest.fixture
def login_web(init_driver):#login_web函數繼承了init函數,或者叫調用了init函數,因為執行login_web時會先執行下init函數
# login_web 調用了init—_web(就像用例方法調用前置條件一樣來調用,直接加前置條件的函數名),並用init_driver接收了它的返回值
LoginPage(init_driver).login(CD.user, CD.passwd)#init的返回值是driver,所以driver都換成了init
yield init_driver
fixture騷操作--全局共享conftest.py
使用pytest時,如果多處測試用例想共享一個前置、后置條件,則把fixture寫在一個叫conftest.py的文件中。
1.固定名字,因為pytest有個機制會自動去conftest.py中搜索fixture, 而在用例文件當中,也不需要去引入conftest.py
2.作用域:當前conftest文件所在目錄及N級子目錄下的用例,均可直接調用此文件當中的 fixtures.
3.如果fixture出現重名。就近原則,優先使用自己文件下的,其次找父目錄下的共享文件中的即同一爸爸的,其次才會去爺爺那去找。.