1. 程式人生 > >pytest文檔5-fixture之conftest.py

pytest文檔5-fixture之conftest.py

查找 有一個 mark tar onf 自動 class collected 單獨

前言

前面一篇講到用例加setup和teardown可以實現在測試用例之前或之後加入一些操作,但這種是整個腳本全局生效的,如果我想實現以下場景:
用例1需要先登錄,用例2不需要登錄,用例3需要先登錄。很顯然這就無法用setup和teardown來實現了。這就是本篇學習的目的,自定義測試用例的預置條件

fixture優勢

1.firture相對於setup和teardown來說應該有以下幾點優勢

  • 命名方式靈活,不局限於setup和teardown這幾個命名
  • conftest.py 配置裏可以實現數據共享,不需要import就能自動找到一些配置
  • scope="module" 可以實現多個.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"])

運行結果:

============================= 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,針對函數有效

conftest.py配置

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

conftest.py配置需要註意以下點:

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

2.參考腳本代碼設計如下

** 作者:上海-悠悠 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()方法,這樣就能實現一些公共的操作可以單獨拿出來了
** 作者:上海-悠悠 QQ交流群:588402570**

pytest文檔5-fixture之conftest.py