pytest文檔5-fixture之conftest.py

前言session

前面一篇講到用例加setup和teardown能夠實如今測試用例以前或以後加入一些操做,但這種是整個腳本全局生效的,若是我想實現如下場景:
用例1須要先登陸,用例2不須要登陸,用例3須要先登陸。很顯然這就沒法用setup和teardown來實現了。這就是本篇學習的目的,自定義測試用例的預置條件函數

fixture優點

1.firture相對於setup和teardown來講應該有如下幾點優點學習

  • 命名方式靈活,不侷限於setup和teardown這幾個命名
  • conftest.py 配置裏能夠實現數據共享,不須要import就能自動找到一些配置
  • scope="module" 能夠實現多個.py跨文件共享前置, 每個.py文件調用一次
  • scope="session" 以實現多個.py跨文件使用一個session來完成多個用例
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功能必須只產生一次測試

fixture參數傳入(scope="function")

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

conftest.py配置

1.上面一個案例是在同一個.py文件中,多個用例調用一個登錄功能,若是有多個.py的文件都須要調用這個登錄功能的話,那就不能把登錄寫到用例裏面去了。
此時應該要有一個配置文件,單獨管理一些預置的操做場景,pytest裏面默認讀取conftest.py裏面的配置utf-8

conftest.py配置須要注意如下點:字符串

  • conftest.py配置腳本名稱是固定的,不能更名稱
  • conftest.py與運行的用例要在同一個pakage下,而且有__init__.py文件
  • 不須要import導入 conftest.py,pytest用例會自動查找

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

相關文章
相關標籤/搜索