Pytest和Allure測試框架-超詳細版+實戰(zhàn)3

三, Pytest -fixture

下面都有實戰(zhàn)很詳細-fixture確實牛逼


圖1
圖2

圖3.png
圖4.png

圖5.png
圖6.png

pytest 相較于 unittest 最為跳躍的一點應(yīng)該就是 fixture 機制

對于unittest來說,每個用例的類中都需要去寫入setUp和tearDown。也就是我們所說的前置和后置,

而不可避免的,很多用例的前置和后置都是一樣(例如很多用例都需要前置登錄,后置退出),于是我們需要重復(fù)的復(fù)制粘貼,這樣導(dǎo)致工作量增加,代碼量也增加,界面也顯得冗雜。

所以此時pytest中fixture機制便要閃亮登場了。

通俗的講: fixture = 前置+后置
而方便的是:如果很多用例都有同樣的前置和后置,那么我就只實現(xiàn)一個,然后需要的用例就去調(diào)用就好了。

1.機制:與測試用例同級,或者是測試用例的父級,創(chuàng)建一個conftest.py文件。
2.conftest.py文件里:放所有的前置和后置。 不需要用例.py文件主動引入conftest文件。
3.定義一個函數(shù):包含前置操作+后置操作。
4.把函數(shù)聲明為fixture :在函數(shù)前面加上 @pytest.fixture(作用級別=默認為function)
5.fixture的定義。
  如果有返回值,那么寫在yield后面。(yield的作用就相當于return)
  在測試用例當中,調(diào)用有返回值的fixture函數(shù)時,函數(shù)名稱就是代表返回值。
  在測試用例當中,函數(shù)名稱作為用例的參數(shù)即可。

1. 如下: 定義一個函數(shù)名叫open_url的fixture前后置,前置為打開鏈接,后置為退出瀏覽器

@pytest.fixture(scope=“class”) #定義scope的范圍

  def open_url():
    # 前置
    driver = webdriver.Chrome()
    driver.get(url) #url為鏈接地址
    yield driver    #yield之前代碼是前置,之后的代碼就是后置。
    # 后置
    driver.quit()

這樣我們就定義了一個叫做 open_url 的 fixture

2.在我們要用這個前后置的類前面 我們用@pytest.mark.usefixtures(fixture函數(shù)名)

就可以直接調(diào)用上面定義好的這個前后置


圖片.png

可以看到 在TestLogin 這個類中 我們不再去編寫setup 和 teardown. 直接寫我們的中間過程就可以了。是不是很方便了?

3.進階方法:conftest中定義多個fixture,一個fixture可以是另一個fixture的前后置,期間還是用field隔開前后置

如上圖中可以看到我class中另外還引用了一個名為refresh_page的fixture,直接上代碼:

# 刷新頁面 - 定義的第二個fixture
@pytest.fixture
def refresh_page(open_url):
    yield
    open_url.refresh()

直接將open_url作為了另一個fixture的前置引用進來,用yield隔開,當用例中執(zhí)行完open_url前后置后,再執(zhí)行了一次refresh的后置。
執(zhí)行順序: open_url yield 之前代碼 – 用例代碼 – open_url yield 之后代碼 --》 refresh_page yield 之后代碼
是不是很妙,可以解決許多用例流程環(huán)環(huán)相扣時的麻煩。

4.說到上面的多個fixture調(diào)用,很多人就會疑惑,會不會fixture之間相互沖突。

當然是不會了,fixture在conftest.py當中就已經(jīng)決定了他的用例域,他會主動去區(qū)分你這個fixture是作用在哪個用例域。

首先我們看一下框架中對于fixture函數(shù)的定義:

scope便是定義用例域的范圍:
function:默認范圍,每一個函數(shù)或方法都會調(diào)用,不填寫時便是它
class:每一個類調(diào)用一次
module: 每一個.py文件調(diào)用一次,文件中可以有多個function和class
session:多個文件調(diào)用一次,可以跨文件,如在.py文件中,每一個.py文件就是module
范圍:
session > module > class > function

所以在調(diào)用時各個fixture之間并不會相互沖突。

5,fixture的自動應(yīng)用autouse

autouse調(diào)用例子:**
當管理用例比較多的時候,這種方法比較方便高效,但是用該功能時也要小心,一定要注意fixture的作用范圍。需要注意的是,當使用這種方式時,就不能使用返回值的功了。autouse默認設(shè)置為False。當默認為False,就可以選擇用上面兩種方式來試用fixture。當設(shè)置為True時,所有的test都會自動調(diào)用這個fixture。autouse遵循scope="關(guān)鍵字參數(shù)"規(guī)則:當scope="session"時,無論怎樣定義只運行一次;當scope="module"時,每個py文件只運行一次;當scope="class"時,每個class只運行一次(但是一個文件中包括function和class時,會在每個function(不在class中)運行一次);當scope="function"時,每個function運行一次;
‘’’
平常寫自動化用例會寫一些前置的fixture操作,用例需要用到就直接傳該函數(shù)的參數(shù)名稱就行了。當用例很多的時候,每次都傳這個參數(shù),會比較麻煩。
fixture里面有個參數(shù)autouse,默認是Fasle沒開啟的,可以設(shè)置為True開啟自動使用fixture功能,這樣用例就不用每次都去傳參了

設(shè)置autouse=True
autouse設(shè)置為True,自動調(diào)用fixture功能
start設(shè)置scope為module級別,在當前.py用例模塊只執(zhí)行一次,autouse=True自動使用[圖片]open_home設(shè)置scope為function級別,
每個用例前都調(diào)用一次,自動使用

import pytest

@pytest.fixture(scope="module",autouse=True)
def start(request):
    print("\n----開始執(zhí)行module------")
    print('module : %s'% request.module.__name__)
    print('------啟動瀏覽器-------')
    yield
    print("------結(jié)束測試 end!----------")

@pytest.fixture(scope="function",autouse=True)
def open_home(request):
    print("function:%s \n--回到首頁--"% request.function.__name__)

def test_01():
    print('----用例01-----')

def test_02():
    print('----用例02-----')

if __name__ == '__main__':
    pytest.main(["-s","autouse.py"])

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

----開始執(zhí)行module------
module : autouse
------啟動瀏覽器-------
function:test_01 
--回到首頁--
.----用例01-----
function:test_02 
--回到首頁--
.----用例02-----
------結(jié)束測試 end!----------

參考鏈接
https://blog.csdn.net/qq_42610167/article/details/101204066

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容