欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

pytest中fixture函數(shù)使用

 更新時間:2023年02月07日 10:35:09   作者:測試中二  
本文主要介紹了pytest中fixture函數(shù)使用,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

前言

setup和teardown能實現(xiàn)在測試用例執(zhí)行之前或之后做一些操作,但是這種是整個測試腳本全局生效的;

如果我們想實現(xiàn)某些用例執(zhí)行之前進(jìn)行登錄,某些用例執(zhí)行之前不需要進(jìn)行登錄,這種場景我們再使用setup和teardown就無法實現(xiàn)了,這時候我們就需要用到fixture功能了。

fixture函數(shù)

fixture(scope="function", params=None, autouse=False, ids=None, name=None)

參數(shù)說明:

1、scope:fixture函數(shù)的作用域;可選值:function(默認(rèn))、class、module、session

  • function:作用于每個方法或函數(shù),每個方法或函數(shù)都運行一次
  • class:作用于整個class類,每個class中的所有test只運行一次
  • module:作用于整個模塊,每個module中的所有test只運行一次
  • session:作用于整個session,整個session只運行一次(慎用)

2、params:列表類型;一個可選的參數(shù)列表;它將會多次調(diào)用被fixture標(biāo)記的方法和所有用到這個fixture的test測試用例;默認(rèn)為None;當(dāng)前調(diào)用參數(shù)可以用 request.param 來獲取。

3、autouse:如果為True,則為所有測試用例激活fixture,運行測試用例的時候會自動運行被fixture標(biāo)記的方法;如果為False,則需要顯示指定來激活fixture,不會自動運行。

4、ids:id字符串列表,與params相對應(yīng),因此它們也是測試的一部分。如果沒有提供ids,那么將會從params來自動生成。

5、name:fixture的名稱。默認(rèn)為被fixture裝飾器標(biāo)記的函數(shù)名。

fixture的使用

1、通過參數(shù)引用fixture函數(shù)

舉例:

# file_name:test_fixture.py
 
 
import pytest
 
 
class Test_A:
 
    @pytest.fixture()
    def before(self):
        print("\n--------before fixture has ran--------")
 
    def test_a(self, before):    # test_a方法以參數(shù)的形式傳入了被fixture標(biāo)記的函數(shù),fixture的名稱默認(rèn)為被fixture標(biāo)記的函數(shù)名
        print('-------test_a has ran-------')
        assert 1
 
 
if __name__ == '__main__':
    pytest.main(['-s', 'test_fixture.py'])

運行結(jié)果:

從結(jié)果中可以看到被fixture標(biāo)記的函數(shù)before會優(yōu)先于測試用例test_a運行。

2、通過使用name參數(shù)來引用fixture函數(shù)

①name參數(shù)表示fixture的重命名;

②通常來說使用 fixture 的測試函數(shù)會將 fixture 的函數(shù)名作為參數(shù)傳遞,但是 pytest 也允許將fixture重命名。

舉例1:

# file_name:test_fixture.py
 
 
import pytest
 
 
class Test_A:
 
    @pytest.fixture(name="before_fixture_name")
    def before(self):
        print("\n--------before fixture has ran--------")
 
    def test_a(self, before_fixture_name):    # test_a方法以參數(shù)的形式傳入了被fixture標(biāo)記的函數(shù),這里的fixture名稱為:before_fixture_name,如果不設(shè)置name參數(shù),則fixture的名稱默認(rèn)為被fixture標(biāo)記的函數(shù)名
        print('-------test_a has ran-------')
        assert 1
 
 
if __name__ == '__main__':
    pytest.main(['-s', 'test_fixture.py'])

舉例2:為fixture函數(shù)重命名之后,不可以在使用fixture函數(shù)的函數(shù)名來調(diào)用,只能通過fixture函數(shù)重命名的新名字來調(diào)用。

3、通過@pytest.mark.usefixtures('fixture函數(shù)名')函數(shù)的形式引用fixture函數(shù)

舉例:

# file_name: test_fixture.py
 
 
import pytest
 
 
@pytest.fixture()  # 被fixture標(biāo)記的函數(shù)也可以應(yīng)用在測試類的外部,使用@pytest.mark.usefixtures()裝飾器來引用
def before():
    print("\n--------before fixture has ran--------")
 
 
@pytest.mark.usefixtures("before")  # 通過使用usefixtures()來引用fixture,此時usefixtures()函數(shù)的入?yún)⑹莊ixture函數(shù)的函數(shù)名
class Test_A:
 
    def test_a(self):
        print('-------test_a has ran-------')
        assert 1
 
 
if __name__ == '__main__':
    pytest.main(['-s', 'test_fixture.py'])

運行結(jié)果:

從結(jié)果中可以看到被fixture標(biāo)記的函數(shù)before會優(yōu)先于測試用例test_a運行。

4、通過autouse=True設(shè)置默認(rèn)執(zhí)行fixture函數(shù)

①fixture函數(shù)的autouse參數(shù)默認(rèn)等于False;

②fixture函數(shù)的autouse參數(shù)若為True,剛每個測試函數(shù)都會自動調(diào)用該fixture函數(shù),而且無需傳入fixture函數(shù)名。

舉例:

# file_name: test_fixture.py
 
 
import pytest
 
 
@pytest.fixture(autouse=True)  # 通過參數(shù)autouse=True來設(shè)置fixture默認(rèn)運行
def before():
    print("\n--------before fixture has ran--------")
 
 
class Test_A:
 
    def test_a(self):
        print('-------test_a has ran-------')
        assert 1
 
    def test_b(self):
        print('-------test_b has ran-------')
        assert 1
 
 
if __name__ == '__main__':
    pytest.main(['-s', 'test_fixture.py'])

運行結(jié)果:

從結(jié)果中可以看到我們并沒有顯示指定test_a和test_b使用fixture,但是在執(zhí)行測試用例之前卻執(zhí)行了fixture,這就是因為我們將fixture設(shè)置成了autouse=True。

5、fixture作用域設(shè)置成function

舉例:

# file_name: test_fixture.py
 
 
import pytest
 
 
@pytest.fixture(scope="function", autouse=True)  # 作用域設(shè)置成function,通過參數(shù)autouse=True來設(shè)置fixture默認(rèn)運行
def before():
    print("\n--------before fixture has ran--------")
 
 
class Test_A:
 
    def test_a(self):
        print('-------test_a has ran-------')
        assert 1
 
    def test_b(self):
        print('-------test_b has ran-------')
        assert 1
 
 
if __name__ == '__main__':
    pytest.main(['-s', 'test_fixture.py'])

運行結(jié)果:

從結(jié)果中可以看到將fixture的作用域設(shè)置成scope=function后,每個test測試用例執(zhí)行前都會執(zhí)行一次被fixture標(biāo)記的函數(shù)。

并且通過跟上一個例子對比我們可以看到設(shè)置 scope=function 和不設(shè)置scope參數(shù)的執(zhí)行結(jié)果是一致的,這說明scope參數(shù)的默認(rèn)值是function。

6、fixture作用域設(shè)置成class

舉例:

# file_name: test_fixture.py
 
 
import pytest
 
 
@pytest.fixture(scope="class", autouse=True)  # 作用域設(shè)置成class,通過參數(shù)autouse=True來設(shè)置fixture默認(rèn)運行
def before():
    print("\n--------before fixture has ran--------")
 
 
class Test_A:
 
    def test_a(self):
        print('-------test_a has ran-------')
        assert 1
 
    def test_b(self):
        print('-------test_b has ran-------')
        assert 1
 
 
if __name__ == '__main__':
    pytest.main(['-s', 'test_fixture.py'])

運行結(jié)果:

從運行結(jié)果中可以看到測試類中有兩個測試用例,但是fixture卻只執(zhí)行了一次。

7、fixture的返回值使用

舉例:

# file_name: test_fixture.py
 
 
import pytest
 
 
@pytest.fixture()
def return_data():
    print("\n--------before fixture has ran--------")
    return 2    # 返回值
 
 
class Test_A:
 
    def test_a(self, return_data):
        print('-------test_a has ran-------')
        assert 1 == return_data # 拿到返回值做斷言
 
 
if __name__ == '__main__':
    pytest.main(['-s', 'test_fixture.py'])

運行結(jié)果:

從結(jié)果中看到我們拿到了fixture的返回值為2,在測試用例中拿到返回值做斷言,斷言失敗。

8、fixture的params參數(shù)使用

①params形參是fixture函數(shù)的可選形參列表,支持列表傳入;

②不傳此參數(shù)時默認(rèn)為None;

③每個param的值fixture函數(shù)都會去調(diào)用執(zhí)行一次,類似for循環(huán)。

④可與參數(shù)ids一起使用,作為每個參數(shù)的標(biāo)識,類似于用例參數(shù)化時的ids作用。

舉例:

# file_name: test_fixture.py
 
 
import pytest
 
 
@pytest.fixture(params=[1, 2, 3])
def return_data(request):   # 傳入?yún)?shù)request,request系統(tǒng)內(nèi)置的fixture
    print("\n--------before fixture has ran--------")
    return request.param  # 通過request.param 獲取當(dāng)前傳入的參數(shù)
 
 
class Test_A:
 
    def test_a(self, return_data):
        print('-------test_a has ran,return_data的值為:{}-------'.format(return_data))
        assert 1 == return_data  # 拿到返回值做斷言
 
 
if __name__ == '__main__':
    pytest.main(['-s', 'test_fixture.py'])

運行結(jié)果:

從結(jié)果中我們可以看到測試用例執(zhí)行了3次。通過設(shè)置params參數(shù)會導(dǎo)致多次調(diào)用被fixture標(biāo)記的函數(shù),并且使用該fixture函數(shù)的測試用例也會執(zhí)行多次。

9、fixture的params參數(shù)于ids參數(shù)結(jié)合使用

①fixture函數(shù)未配置ids參數(shù)之前:用例執(zhí)行后的標(biāo)識為傳入的params參數(shù)。

②fixture函數(shù)配置ids參數(shù)之后:用例執(zhí)行后的標(biāo)識為傳入的ids參數(shù)。并與params參數(shù)一一對應(yīng)。

10、fixture函數(shù)的相互調(diào)用(fixture函數(shù)與fixture函數(shù)之間的依賴關(guān)系)

舉例1:

import pytest
# fixtrue作為參數(shù),互相調(diào)用傳入
@pytest.fixture()
def account():
    a = "account"
    print("第一層fixture")
    return a
    
#Fixture的相互調(diào)用一定是要在測試類里調(diào)用這層fixture才會生次,普通函數(shù)單獨調(diào)用是不生效的
@pytest.fixture()   
def login(account):
    print("第二層fixture")
 
class TestLogin:
    def test_1(self, login):
        print("直接使用第二層fixture,返回值為{}".format(login))
 
    def test_2(self, account):
        print("只調(diào)用account fixture,返回值為{}".format(account))
 
 
if __name__ == '__main__':
    pytest.main()

運行結(jié)果1:

舉例2:如果一個fixture函數(shù)依賴另外一個fixture函數(shù),此時不能使@pytest.mark.usefixtures() 調(diào)用被依賴的fixture函數(shù),這種調(diào)用方式不會生效。而是需要用函數(shù)傳遞的方式才能生效。

# test_fixture_02.py
import pytest
 
 
@pytest.fixture()
def login_weibo():
    print("==============登陸微博===============")
 
 
@pytest.fixture()
# @pytest.mark.usefixtures("login_weibo")  #這種方式不會生效
def get_weibo_data(login_weibo):  # 這種方式才會生效
    """fixture函數(shù)依賴,需要用傳遞函數(shù)的方式"""
    print("=============獲取微博數(shù)據(jù)==============")
 
 
@pytest.mark.demo
class TestMyCode:
 
    @pytest.mark.usefixtures("get_weibo_data")
    def test_fixture_005(self):
        """fixture函數(shù)在測試腳本文件中"""
        assert 1 == 1

運行結(jié)果:

【注意】

①即使fixture函數(shù)之間支持相互調(diào)用,但普通函數(shù)直接使用fixture是不支持的,一定是在測試函數(shù)內(nèi)調(diào)用才會逐級調(diào)用生效。

②有多層fixture函數(shù)調(diào)用時,最先執(zhí)行的是最后一層fixture函數(shù),而不是先執(zhí)行傳入測試函數(shù)的fixture函數(shù)。

③上層fixture函數(shù)的值不會自動return,這里就類似函數(shù)相互調(diào)用一樣的邏輯?!竞瘮?shù)調(diào)用值需要賦值給一個變量并使用】

到此這篇關(guān)于pytest中fixture函數(shù)使用的文章就介紹到這了,更多相關(guān)pytest fixture函數(shù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Python中的嵌套循環(huán)詳情

    Python中的嵌套循環(huán)詳情

    這篇文章主要介紹了Python中的嵌套循環(huán)詳情,嵌套循環(huán)就是一個外循環(huán)的主體部分是一個內(nèi)循環(huán)。內(nèi)循環(huán)或外循環(huán)可以是任何類型,下列詳情介紹內(nèi)容,需要的朋友可以參考一下
    2022-03-03
  • selenium+python自動化測試之鼠標(biāo)和鍵盤事件

    selenium+python自動化測試之鼠標(biāo)和鍵盤事件

    這篇文章主要介紹了selenium+python自動化測試之鼠標(biāo)和鍵盤事件,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-01-01
  • 基于python實現(xiàn)操作redis及消息隊列

    基于python實現(xiàn)操作redis及消息隊列

    這篇文章主要介紹了基于python操作redis及消息隊列,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-08-08
  • 使用python調(diào)用llama3進(jìn)行對話的操作步驟

    使用python調(diào)用llama3進(jìn)行對話的操作步驟

    Meta?已將最新的?LLaMa3?進(jìn)行了開源,因此,我們也可以方便的使用?Python?進(jìn)行?LLaMa3?模型的調(diào)用和開發(fā),本文給大家介紹了如何使用?python?調(diào)用?llama3?進(jìn)行對話,需要的朋友可以參考下
    2024-09-09
  • 詳解python中的Turtle函數(shù)庫

    詳解python中的Turtle函數(shù)庫

    這篇文章主要介紹了python中的Turtle函數(shù)庫,包括函數(shù)庫的引用方式,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價值,需要的朋友可以參考下
    2018-11-11
  • Jupyter中直接顯示Matplotlib的圖形方法

    Jupyter中直接顯示Matplotlib的圖形方法

    今天小編就為大家分享一篇Jupyter中直接顯示Matplotlib的圖形方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-05-05
  • Python scipy的二維圖像卷積運算與圖像模糊處理操作示例

    Python scipy的二維圖像卷積運算與圖像模糊處理操作示例

    這篇文章主要介紹了Python scipy的二維圖像卷積運算與圖像模糊處理操作,涉及Python數(shù)學(xué)運算與圖形繪制相關(guān)操作技巧,需要的朋友可以參考下
    2019-09-09
  • Python將主機(jī)名轉(zhuǎn)換為IP地址的方法

    Python將主機(jī)名轉(zhuǎn)換為IP地址的方法

    今天小編就為大家分享一篇Python將主機(jī)名轉(zhuǎn)換為IP地址的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-08-08
  • Python 多維List創(chuàng)建的問題小結(jié)

    Python 多維List創(chuàng)建的問題小結(jié)

    這篇文章主要介紹了Python 多維List創(chuàng)建的問題小結(jié),詳細(xì)的介紹了遇到的一個小問題的解決方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-01-01
  • Django框架教程之中間件MiddleWare淺析

    Django框架教程之中間件MiddleWare淺析

    這篇文章主要給大家介紹了關(guān)于Django框架教程之中間件MiddleWare的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用Django框架具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-12-12

最新評論