pytest-fixture的使用

http://doc.pytest.org/en/latest/fixture.html

fixture的優(yōu)點(diǎn)

顯式霞势、模塊化吱涉、可擴(kuò)展

  • fixture具有明確的名稱榨呆,并通過從測試功能看疗,模塊,類或整個(gè)項(xiàng)目中聲明它們的使用來激活益涧。
  • fixture以模塊化方式實(shí)現(xiàn),因?yàn)槊總€(gè)fixture名稱觸發(fā)fixture功能驯鳖,該fixture功能本身可以使用其他fixture闲询。
  • fixture管理從簡單的單元擴(kuò)展到復(fù)雜的功能測試,允許根據(jù)配置和組件選項(xiàng)對夾具和測試進(jìn)行參數(shù)化浅辙,或者在功能扭弧,類,模塊或整個(gè)測試會話范圍內(nèi)重復(fù)使用夾具记舆。

fixture作為函數(shù)參數(shù)

import pytest

@pytest.fixture(scope="session")
def start():
    print("fixture-start開始")
    
def test_3(start):
    print("結(jié)束")

執(zhí)行結(jié)果:我們可以發(fā)現(xiàn)test_3被執(zhí)行前 先執(zhí)行了start方法

image.png

執(zhí)行邏輯:
image.png

@pytest.fixture(scope="session")中我們我們寫有scope="session"鸽捻,那么這個(gè)參數(shù)的作用是什么呢?這個(gè)我們在后面的【fixture的執(zhí)行順序控制】中講到

fixture的模塊化

在使用中如果發(fā)現(xiàn)需要使用多個(gè)文件中的fixture泽腮,則可以將fixture寫入conftest.py中御蒲。
使用時(shí)不需要導(dǎo)入要在測試中使用的fixture,它會自動被pytest發(fā)現(xiàn)诊赊。

查找順序:

fixture功能的發(fā)現(xiàn)從測試類開始厚满,然后是測試模塊,然后是 conftest.py文件碧磅,最后是內(nèi)置和第三方插件

#conftest.py
import pytest

@pytest.fixture(scope="session")
def start():
    print("fixture-start開始")
#test_fixtures2.py
def test_3(start):
    print("結(jié)束")

執(zhí)行結(jié)果一致

image.png

可以使用pytest --fixtures test_fixtures2.py查看可用的fixture

------------------- fixtures defined from test.conftest --------------------
topics
    conftest.py:11: no docstring available

start [session scope]
    conftest.py:7: no docstring available


===================== no tests ran in 0.02 seconds =========================

fixture的執(zhí)行順序控制

前面我們提到在@pytest.fixture(scope="session")中的scope參數(shù)碘箍,scope的作用是有多個(gè)fixture時(shí)指定優(yōu)先級
scope從低到高優(yōu)先級:function(默認(rèn))、class鲸郊、module丰榴、package(實(shí)驗(yàn),有風(fēng)險(xiǎn))严望、session多艇。

import pytest

# fixtures documentation order example
order = []

@pytest.fixture(scope="session")
def s1():
    order.append("s1")

@pytest.fixture(scope="module")
def m1():
    order.append("m1")

@pytest.fixture(scope="class")
def c1():
    order.append("c1")

@pytest.fixture()
def f3():
    order.append("f3")

class TestA():
    def test_order(self, c1, s1, m1,f3):
        print(order)
        assert order == ["s1", "m1", "c1", "f3"]

執(zhí)行結(jié)果:我們可以發(fā)現(xiàn)執(zhí)行順序取決于fixture的scope傳參
image.png
設(shè)置默認(rèn)執(zhí)行的fixture

對于所有test_方法都要使用的fixture像吻,我們在定義fixture時(shí)可以使用autouse=True峻黍,就可以不傳參了

@pytest.fixture()
def f3():
    order.append("f3")

@pytest.fixture(autouse=True)  #設(shè)置的默認(rèn)執(zhí)行
def a1():
    order.append("a1")

def test_1(f3):
    print(order)
    assert order == ["a1", "f3"]

執(zhí)行結(jié)果:我們在test_1方法中沒有傳a1复隆,但仍然執(zhí)行了
image.png
fixture的嵌套

如果一個(gè)fixture執(zhí)行前需要先執(zhí)行另一個(gè)fixture,我們可以使用嵌套來解決

@pytest.fixture
def f1(f3):
    order.append("f1")

@pytest.fixture()
def f3():
    order.append("f3")

def test_1(f1):
    print(order)
    assert order == ["f3", "f1"]

執(zhí)行結(jié)果:
image.png

fixture做后置處理yield

在pytest中我們有teardown_module之類的后置處理姆涩,fixture也可以支持相關(guān)操作

import pytest

@pytest.fixture()
def f1():
    print("f1")
    yield f1
    print("f1 后置處理")

class TestA():
    def test_1(self,f1):
        print("test_1")
        assert 2 == 1

可以看見在test_1()執(zhí)行后挽拂,執(zhí)行了yield后面的語句。且無論用例是否執(zhí)行成功

image.png

  • 注意:如果我們使用有scope="class"的fixture骨饿,則會在類執(zhí)行完成后進(jìn)行后置處理亏栈,其他的scope參數(shù)也一樣

通過request.module獲取請求的module屬性

@pytest.fixture(scope="module")
def smtp(request):
    server = getattr(request.module, "smtpserver")
    print(server)
    yield smtp
    pass

smtpserver = "mail.python.org"
class TestA():
    def test_showhelo(self,smtp):
        pass

執(zhí)行結(jié)果:fixture通過request.module將smtpserver取了出來

image.png

官網(wǎng)說還可以將類屬性取出來,但沒找到關(guān)鍵字

fixture的參數(shù)化

需要使用params參數(shù)進(jìn)行參數(shù)化,然后通過request.param取出

  • 單個(gè)參數(shù)的參數(shù)化
@pytest.fixture(params=['a', 'v', 'c'])
def fix(request):
    return request.param

def test_9(fix):
    print(fix)

執(zhí)行結(jié)果:將三個(gè)參數(shù)依次取出
image.png
  • 多個(gè)參數(shù)的參數(shù)化----使用list
list = [{'a': '阿斯頓', 'b': '請問'},{'a': '自行車', 'b': '出現(xiàn)在'}]

@pytest.fixture(params=list)
def dic(request):
    return request.param

def test_2(dic):
    print('a=' + dic["a"])
    print('b=' + dic["b"])

執(zhí)行結(jié)果:
image.png

另外fixture還支持mock
http://www.reibang.com/p/4bd41d6bb2a9

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末宏赘,一起剝皮案震驚了整個(gè)濱河市绒北,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌察署,老刑警劉巖闷游,帶你破解...
    沈念sama閱讀 218,755評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異贴汪,居然都是意外死亡脐往,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評論 3 395
  • 文/潘曉璐 我一進(jìn)店門扳埂,熙熙樓的掌柜王于貴愁眉苦臉地迎上來业簿,“玉大人,你說我怎么就攤上這事阳懂∶酚龋” “怎么了?”我有些...
    開封第一講書人閱讀 165,138評論 0 355
  • 文/不壞的土叔 我叫張陵希太,是天一觀的道長克饶。 經(jīng)常有香客問我,道長誊辉,這世上最難降的妖魔是什么矾湃? 我笑而不...
    開封第一講書人閱讀 58,791評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮堕澄,結(jié)果婚禮上邀跃,老公的妹妹穿的比我還像新娘。我一直安慰自己蛙紫,他們只是感情好拍屑,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,794評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著坑傅,像睡著了一般僵驰。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,631評論 1 305
  • 那天蒜茴,我揣著相機(jī)與錄音星爪,去河邊找鬼。 笑死粉私,一個(gè)胖子當(dāng)著我的面吹牛顽腾,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播诺核,決...
    沈念sama閱讀 40,362評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼抄肖,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了窖杀?” 一聲冷哼從身側(cè)響起漓摩,我...
    開封第一講書人閱讀 39,264評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎陈瘦,沒想到半個(gè)月后幌甘,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體潮售,經(jīng)...
    沈念sama閱讀 45,724評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡痊项,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了酥诽。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片鞍泉。...
    茶點(diǎn)故事閱讀 40,040評論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖肮帐,靈堂內(nèi)的尸體忽然破棺而出咖驮,到底是詐尸還是另有隱情,我是刑警寧澤训枢,帶...
    沈念sama閱讀 35,742評論 5 346
  • 正文 年R本政府宣布托修,位于F島的核電站,受9級特大地震影響恒界,放射性物質(zhì)發(fā)生泄漏睦刃。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,364評論 3 330
  • 文/蒙蒙 一十酣、第九天 我趴在偏房一處隱蔽的房頂上張望涩拙。 院中可真熱鬧,春花似錦耸采、人聲如沸兴泥。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽搓彻。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間旭贬,已是汗流浹背竭沫。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留骑篙,地道東北人蜕提。 一個(gè)月前我還...
    沈念sama閱讀 48,247評論 3 371
  • 正文 我出身青樓,卻偏偏與公主長得像靶端,于是被迫代替她去往敵國和親谎势。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,979評論 2 355