前言session
前面一篇講到用例加setup和teardown能夠實如今測試用例以前或以後加入一些操做,但這種是整個腳本全局生效的,若是我想實現如下場景:
用例1須要先登陸,用例2不須要登陸,用例3須要先登陸。很顯然這就沒法用setup和teardown來實現了。這就是本篇學習的目的,自定義測試用例的預置條件函數
1.firture相對於setup和teardown來講應該有如下幾點優點學習
fixture(scope="function", params=None, autouse=False, ids=None, name=None): """使用裝飾器標記fixture的功能 ** 做者:上海-悠悠 QQ交流羣:588402570** 可使用此裝飾器(帶或不帶參數)來定義fixture功能。 fixture功能的名稱能夠在之後使用 引用它會在運行測試以前調用它:test模塊或類可使用pytest.mark.usefixtures(fixturename標記。 測試功能能夠直接使用fixture名稱做爲輸入參數,在這種狀況下,夾具實例從fixture返回功能將被注入。 :arg scope: scope 有四個級別參數 "function" (默認), "class", "module" or "session". :arg params: 一個可選的參數列表,它將致使多個參數調用fixture功能和全部測試使用它 :arg autouse: 若是爲True,則爲全部測試激活fixture func 能夠看到它。 若是爲False(默認值)則顯式須要參考來激活fixture :arg ids: 每一個字符串id的列表,每一個字符串對應於params 這樣他們就是測試ID的一部分。 若是沒有提供ID它們將從params自動生成 :arg name: fixture的名稱。 這默認爲裝飾函數的名稱。 若是fixture在定義它的同一模塊中使用,夾具的功能名稱將被請求夾具的功能arg遮蔽; 解決這個問題的一種方法是將裝飾函數命名 「fixture_ <fixturename>」而後使用」@ pytest.fixture(name ='<fixturename>')「」。
Fixtures能夠選擇使用yield
語句爲測試函數提供它們的值,而不是return
。 在這種狀況下,yield
語句以後的代碼塊做爲拆卸代碼執行,而無論測試結果如何。fixture功能必須只產生一次測試
1.實現場景:用例1須要先登陸,用例2不須要登陸,用例3須要先登陸設計
# 新建一個文件test_fixt.py # coding:utf-8 ** 做者:上海-悠悠 QQ交流羣:588402570** import pytest # 不帶參數時默認scope="function" @pytest.fixture() def login(): print("輸入帳號,密碼先登陸") def test_s1(login): print("用例1:登陸以後其它動做111") def test_s2(): # 不傳login print("用例2:不須要登陸,操做222") def test_s3(login): print("用例3:登陸以後其它動做333") if __name__ == "__main__": pytest.main(["-s", "test_fix.py"])
運行結果:code
============================= test session starts ============================= platform win32 -- Python 3.6.0, pytest-3.6.3, py-1.5.4, pluggy-0.6.0 rootdir: E:\YOYO, inifile: collected 3 items test_fix.py 輸入帳號,密碼先登陸 用例1:登陸以後其它動做111 .用例2:不須要登陸,操做222 .輸入帳號,密碼先登陸 用例3:登陸以後其它動做333 . ========================== 3 passed in 0.06 seconds ===========================
2.若是@pytest.fixture()裏面沒有參數,那麼默認scope="function",也就是此時的級別的function,針對函數有效orm
1.上面一個案例是在同一個.py文件中,多個用例調用一個登錄功能,若是有多個.py的文件都須要調用這個登錄功能的話,那就不能把登錄寫到用例裏面去了。
此時應該要有一個配置文件,單獨管理一些預置的操做場景,pytest裏面默認讀取conftest.py裏面的配置utf-8
conftest.py配置須要注意如下點:字符串
2.參考腳本代碼設計以下get
** 做者:上海-悠悠 QQ交流羣:588402570** __init__.py conftest.py # coding:utf-8 import pytest @pytest.fixture() def login(): print("輸入帳號,密碼先登陸") test_fix1.py # coding:utf-8 import pytest def test_s1(login): print("用例1:登陸以後其它動做111") def test_s2(): # 不傳login print("用例2:不須要登陸,操做222") def test_s3(login): print("用例3:登陸以後其它動做333") if __name__ == "__main__": pytest.main(["-s", "test_fix1.py"]) test_fix2.py # coding:utf-8 import pytest def test_s4(login): print("用例4:登陸以後其它動做111") def test_s5(): # 不傳login print("用例5:不須要登陸,操做222") if __name__ == "__main__": pytest.main(["-s", "test_fix2.py"])
3.單獨運行test_fix1.py和test_fix2.py都能調用到login()方法,這樣就能實現一些公共的操做能夠單獨拿出來了
---------------------------------pytest結合selenium自動化完整版-------------------------
全書購買地址 https://yuedu.baidu.com/ebook/902224ab27fff705cc1755270722192e4536582b
做者:上海-悠悠 QQ交流羣:874033608
也能夠關注下個人我的公衆號:yoyoketang