pytest中fixture函數(shù)使用
前言
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)文章
selenium+python自動化測試之鼠標(biāo)和鍵盤事件
這篇文章主要介紹了selenium+python自動化測試之鼠標(biāo)和鍵盤事件,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2019-01-01使用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-09Python scipy的二維圖像卷積運算與圖像模糊處理操作示例
這篇文章主要介紹了Python scipy的二維圖像卷積運算與圖像模糊處理操作,涉及Python數(shù)學(xué)運算與圖形繪制相關(guān)操作技巧,需要的朋友可以參考下2019-09-09Python將主機(jī)名轉(zhuǎn)換為IP地址的方法
今天小編就為大家分享一篇Python將主機(jī)名轉(zhuǎn)換為IP地址的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-08-08Python 多維List創(chuàng)建的問題小結(jié)
這篇文章主要介紹了Python 多維List創(chuàng)建的問題小結(jié),詳細(xì)的介紹了遇到的一個小問題的解決方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下2019-01-01