1. 程式人生 > 其它 >Pytest全域性用例共用之conftest.py詳解

Pytest全域性用例共用之conftest.py詳解

本文轉自:https://blog.csdn.net/qq_36502272/article/details/102975467

一、’conftest特點:

1、可以跨.py檔案呼叫,有多個.py檔案呼叫時,可讓conftest.py只調用了一次fixture,或呼叫多次fixture

2、conftest.py與執行的用例要在同一個pakage下,並且有__init__.py檔案

3、不需要import匯入 conftest.py,pytest用例會自動識別該檔案,放到專案的根目錄下就可以全域性目錄呼叫了,如果放到某個package下,那就在改package內有效,可有多個conftest.py

4、conftest.py配置指令碼名稱是固定的,不能改名稱

5、conftest.py檔案不能被其他檔案匯入

6、所有同目錄測試檔案執行前都會執行conftest.py檔案

二、’conftest用法:

conftest檔案實際應用需要結合fixture來使用,fixture中引數scope也適用conftest中fixture的特性,這裡再說明一下

1、fixture原始碼詳解

fixture(scope='function',params=None,autouse=False,ids=None,name=None):
fixture裡面有個scope引數可以控制fixture的作用範圍,scope:有四個級別引數"function"(預設),"class","module","session

params:一個可選的引數列表,它將導致多個引數呼叫fixture功能和所有測試使用它。
autouse:如果True,則為所有測試啟用fixture func可以看到它。如果為False則顯示需要參考來啟用fixture
ids:每個字串id的列表,每個字串對應於params這樣他們就是測試ID的一部分。如果沒有提供ID它們將從params自動生成
name:fixture的名稱。這預設為裝飾函式的名稱。如果fixture在定義它的統一模組中使用,夾具的功能名稱將被請求夾具的功能arg遮蔽,解決這個問題的一種方法時將裝飾函式命令"fixture_<fixturename>"然後使用"@pytest.fixture(name='<fixturename>')"。

2、fixture的作用範圍

fixture裡面有個scope引數可以控制fixture的作用範圍:session>module>class>function

-function:每一個函式或方法都會呼叫

-class:每一個類呼叫一次,一個類中可以有多個方法

-module:每一個.py檔案呼叫一次,該檔案內又有多個function和class

-session:是多個檔案呼叫一次,可以跨.py檔案呼叫,每個.py檔案就是module

function預設模式@pytest.fixture(scope='function')或 @pytest.fixture()

3、conftest結合fixture的使用

conftest中fixture的scope引數為session,所有測試.py檔案執行前執行一次

conftest中fixture的scope引數為module,每一個測試.py檔案執行前都會執行一次conftest檔案中的fixture

conftest中fixture的scope引數為class,每一個測試檔案中的測試類執行前都會執行一次conftest檔案中的fixture

conftest中fixture的scope引數為function,所有檔案的測試用例執行前都會執行一次conftest檔案中的fixture

三、conftest應用場景

1、每個介面需共用到的token

2、每個介面需共用到的測試用例資料

3、每個介面需共用到的配置資訊

....

四、程式碼例項

多個.py檔案只調用1次fixture
 
import pytest
# conftest.py
@pytest.fixture(scope='session')
def get_token():
    token = 'qeehfjejwjwjej11sss@22'
    print('獲取到token:%s' % token)
    return token
 
 
 
import pytest
# test02.py
class Test(object):
    def test2(self,get_token):
        token = 'qeehfjejwjwjej11sss@22'
        print("【執行test02.py-Test類-test2用例,獲取get_token:%s】" %get_token)
        assert get_token == token
 
if __name__=="__main__":
    pytest.main(["-s","test02.py","test03.py"])
 
 
import pytest
#test03.py
class Test(object):
    def test3(self,get_token):
        token = 'qeehfjejwjwjej11sss@22'
        print("【執行test03.py-Test類-test3用例,獲取get_token:%s】" %get_token)
        assert get_token == token
    def test4(self,get_token):
        token = 'qeehfjejwjwjej11sss@22'
        print("【執行test03.py-Test類-test4用例,獲取get_token:%s】" %get_token)
        assert get_token == token
 
if __name__=="__main__":
    pytest.main(["-s","test02.py","test03.py"])
 
 
 
"C:\Program Files\Python35\python.exe" C:/Users/wangli/PycharmProjects/Test/test/test02.py
============================= test session starts =============================
platform win32 -- Python 3.5.2, pytest-5.1.2, py-1.8.0, pluggy-0.12.0
rootdir: C:\Users\wangli\PycharmProjects\Test\test
collected 3 items
 
test02.py 獲取到token:qeehfjejwjwjej11sss@22
【執行test02.py-Test類-test2用例,獲取get_token:qeehfjejwjwjej11sss@22】
.
test03.py 【執行test03.py-Test類-test3用例,獲取get_token:qeehfjejwjwjej11sss@22】
.【執行test03.py-Test類-test4用例,獲取get_token:qeehfjejwjwjej11sss@22】
.
 
============================== 3 passed in 0.30s ==============================
 
Process finished with exit code 0
多個.py檔案只調用多次fixture
 
import pytest
# conftest.py
@pytest.fixture()
def get_token():
    token = 'qeehfjejwjwjej11sss@22'
    print('獲取到token:%s' % token)
    return token
 
 
 
import pytest
# test02.py
class Test(object):
    def test2(self,get_token):
        token = 'qeehfjejwjwjej11sss@22'
        print("【執行test02.py-Test類-test2用例,獲取get_token:%s】" %get_token)
        assert get_token == token
 
if __name__=="__main__":
    pytest.main(["-s","test02.py","test03.py"])
 
 
import pytest
#test03.py
class Test(object):
    def test3(self,get_token):
        token = 'qeehfjejwjwjej11sss@22'
        print("【執行test03.py-Test類-test3用例,獲取get_token:%s】" %get_token)
        assert get_token == token
    def test4(self,get_token):
        token = 'qeehfjejwjwjej11sss@22'
        print("【執行test03.py-Test類-test4用例,獲取get_token:%s】" %get_token)
        assert get_token == token
 
if __name__=="__main__":
    pytest.main(["-s","test02.py","test03.py"])
 
 
 
"C:\Program Files\Python35\python.exe" C:/Users/wangli/PycharmProjects/Test/test/test03.py
============================= test session starts =============================
platform win32 -- Python 3.5.2, pytest-5.1.2, py-1.8.0, pluggy-0.12.0
rootdir: C:\Users\wangli\PycharmProjects\Test\test
collected 3 items
 
test02.py 獲取到token:qeehfjejwjwjej11sss@22
【執行test02.py-Test類-test2用例,獲取get_token:qeehfjejwjwjej11sss@22】
.
test03.py 獲取到token:qeehfjejwjwjej11sss@22
【執行test03.py-Test類-test3用例,獲取get_token:qeehfjejwjwjej11sss@22】
.獲取到token:qeehfjejwjwjej11sss@22
【執行test03.py-Test類-test4用例,獲取get_token:qeehfjejwjwjej11sss@22】
.
 
============================== 3 passed in 0.04s ==============================
 
Process finished with exit code 0