中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何理解Python自動化測試pytest中fixtureAPI

發布時間:2021-10-09 13:47:06 來源:億速云 閱讀:195 作者:iii 欄目:開發技術

這篇文章主要講解了“如何理解Python自動化測試pytest中fixtureAPI”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“如何理解Python自動化測試pytest中fixtureAPI”吧!

什么是fixture

根據pytest官方文檔的說明,fixture可以簡單的歸納為具有以下功能的函數:

  • 配置測試前系統的初始狀態;

  • 定義傳入測試中的數據集;

  • 為批量測試提供數據源等

與xUnit風格的setup和teardown的對比

fixture的功能與setup和teardown類似,可以實現setup和teardown的功能,但是對這些功能進行了明顯的改進,主要有以下方面:

  • 調用靈活。可以在測試函數、模塊、類或整個項目中聲明fixture的名稱來進行調用;

  • 使用靈活。fixture即適用于簡單的單元測試又適用于復雜的功能測試。根據測試的需求可對fixture進行參數化使用,并且可對fixture進行重復使用。

  • fixture是以模塊化方式實現的,因此允許fixture調用其他fixture函數;

  • teardown的實現邏輯更加清晰明了,并且方便進行管理。

 fixture運行報錯后,pytest的處理方式

通過上面的說明,我們可以知道fixture函數本身是允許調用其他fixture函數的。在這種情況下,測試運行的時候,其中一個fixture函數報錯了,pytest的會如何處理呢?
通過pytest官方文檔的說明,我們可以知道:

  • pytest以線性的方式順序執行測試用例所調用的fixture函數;

  • 當順序較前的fixture函數執行報錯后,pytest會停止執行該測試所調用的其他fixture,并且將測試標記出錯;

  • 測試標記錯誤,并不意味著測試未通過,只能說明測試無法嘗試執行下去,因此我們需要盡可能的去為測試函數減少必要的依賴關系。

示例1:

1.在以下demo代碼中,order()返回類型存在問題,正確的應該返回一個list,我們給其返回一個None:

import pytest
@pytest.fixture
def order():
    return None  #正確應該返回[],我們給返回一個None
@pytest.fixture
def append_first(order):
    order.append(1)
@pytest.fixture
def append_second(order, append_first):
    order.extend([2])
@pytest.fixture(autouse=True)
def append_third(order, append_second):
    order += [3]
def test_order(order):
    assert order == [1, 2,3]

運行后結果如下:

test_order被標記Error,并且信息提示:test setup failed,說明是調用的fixture函數存在問題,且說明了錯誤原因。

如何理解Python自動化測試pytest中fixtureAPI

2.如果是test_order運行未通,運行信息會怎么樣提醒呢?我們按照以下demo修改測試代碼,修改test_order的斷言語句:

import pytest
@pytest.fixture
def order():
    return []   #返回一個list
@pytest.fixture
def append_first(order):
    order.append(1)
@pytest.fixture
def append_second(order, append_first):
    order.extend([2])
@pytest.fixture(autouse=True)
def append_third(order, append_second):
    order += [3]
def test_order(order):
    assert order == [1, 2]  #斷言失敗,正確應該是 order==[1,2,3]

運行結果如下:

test_order被標記failed,且提醒是AssertionError,斷言出錯。這說明是test_order 本身運行未通過。

如何理解Python自動化測試pytest中fixtureAPI

2.fixture API @pytest.fixture()說明

pytest使用@pytest.fixture()來聲明fixture方法。具體如何使用,我會在文章后面進行詳細說明。在此,主要來簡單說明一下fixture()

def fixture(
    fixture_function: Optional[_FixtureFunction] = None,
    *,
    scope: "Union[_Scope, Callable[[str, Config], _Scope]]" = "function",
    params: Optional[Iterable[object]] = None,
    autouse: bool = False,
    ids: Optional[
        Union[
            Iterable[Union[None, str, float, int, bool]],
            Callable[[Any], Optional[object]],
        ]
    ] = None,
    name: Optional[str] = None,
) -> Union[FixtureFunctionMarker, _FixtureFunction]:

參數說明:

2.1 scope

fixture函數的作用域。作用域從小到大依次為:function(默認)classmodulepackagesession

還可傳入一個可調用對象,以實現動態修改fixture的作用域。

后面會單獨寫一篇文章,為大家詳細介紹fixture的scope。

2.2 params

傳入測試數據集,動態生成測試用例,每一條數據都單獨生成一條測試用例。通過request.param,可以獲取傳入的這些數據。

后面會單獨寫一篇文章,為大家詳細介紹fixture的參數化。

2.3 autouse

fixture自動應用標識。

如果是True,則在同作用域下的測試函數,會自動調用該fixture;如果是False,則測試函數需要主動去調用該fixture。

后面會在介紹fixture調用方法的文章給大家詳細說明。

2.4 ids

測試用例ID標識,與parmas傳入的參數一一對應。當未定義時,會自動生成id。

示例2:

1.傳入ids參數,運行以下demo:

import pytest
@pytest.fixture(params=[1,2,3],ids=['A','B','C'])
def ids(request):
    data=request.param
    print(f'獲取測試數據{data}')
    return data
def test_ids(ids):
    print(ids)

運行結果:

在執行信息中,我們可以發現ids的三個參數和params的三個參數一一對應顯示,并且ids的參數作為測試用例id的一部分呈現出來。

如何理解Python自動化測試pytest中fixtureAPI

2. 修改上面demo中的代碼,不傳入ids參數,運行一下:

import pytest
@pytest.fixture(params=[1,2,3]) #未傳入ids
def ids(request):
    data=request.param
    print(f'獲取測試數據{data}')
    return data
def test_ids(ids):
    print(ids)

運行結果:

查看運行結果我們可以發現,雖然沒有傳入ids,但是卻自動生成了ids

如何理解Python自動化測試pytest中fixtureAPI

測試結束后,我們常常以測試報告的形式來匯報測試結果,如結合allure呈現測試結果。通過ids傳入的參數可以對測試用例進行說明,這樣更方便我們查看測試結果。

2.5 name

fixture的別名。fixture的name默認是@pytest.fixture所裝飾的函數的函數名。使用fixture的別名可以提高代碼的閱讀性。

示例3:
以下面的demo為例:

import pytest
@pytest.fixture()
def login():
    print('login')
class SubClass:
    def sub_login(self):
        print('subcalss_login')
class TestCase:
    def test_case1(self,login):  #調用fixture——login
        login=SubClass()  #定義一個login并實例化SubClass
        login.sub_login() #調用SubClass中的sub_login()
        print('這是testcase1')

我們定義了一個fixture函數——login(),同時在test_case1中實例化了一個Subclass類,并起名為login,然后調用了SubClass類中的sub_login()。如果代碼復雜的情況,很容易將fixture函數的login與SubClass實例的login弄混淆,增加代碼的閱讀的復雜度。

當我們使用fixture別名的話,在閱讀代碼的時候就很容易進行區分。

@pytest.fixture(name='module_login') 
def login():
    print('login')
class TestCase:
    def test_case1(self,module_login):  #使用fixture別名:module_login
        login=SubClass()  #定義一個login并實例化SubClass
        login.sub_login() #調用SubClass中的sub_login()
        print('這是testcase1')

注意:

當使用name參數后,則無法再通過@pytest.fixture所裝飾的函數的函數名來進行調用,必須使用name所指定fixture別名來調用。

感謝各位的閱讀,以上就是“如何理解Python自動化測試pytest中fixtureAPI”的內容了,經過本文的學習后,相信大家對如何理解Python自動化測試pytest中fixtureAPI這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

庆安县| 聊城市| 钟祥市| 大石桥市| 临西县| 丹东市| 阿拉善盟| 蒙城县| 吐鲁番市| 库车县| 霍林郭勒市| 沅陵县| 江城| 望城县| 东兰县| 鄂托克前旗| 平江县| 营山县| 平罗县| 正宁县| 江都市| 漠河县| 衡阳县| 文山县| 吴忠市| 阿图什市| 二手房| 从江县| 光泽县| 扎兰屯市| 邯郸县| 瑞丽市| 太和县| 育儿| 平潭县| 元朗区| 宁阳县| 嵩明县| 柳林县| 黄平县| 鹤庆县|