『德不孤』Pytest框架 — 11、Pytest中Fixture裝飾器(一)

繁華似錦Fighting發表於2022-03-12

1、Fixture裝飾器的用途

  1. 做測試前後的初始化設定,如測試資料準備,連結資料庫,開啟瀏覽器等這些操作都可以使用Fixture來實現。
  2. 測試用例的前置條件可以使用Fixture實現,比直接使用Pytest框架的setup()teardown()函式更加靈活。
  3. Fixture是Pytest用於將測試前後進行預備,清理工作的程式碼分離出核心測試邏輯的一種機制!
  4. Fixture可以實現Unittest不能實現的功能,比如:Unittest中的測試用例和測試用例之間是無法傳遞引數和資料的,但是Fixture卻可以解決這個問題。

2、Fixture引數說明

可以使用pytest.fixture()檢視fixture()函式的原始碼和所需要的引數,同Fixture裝飾器需要的引數一樣。

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

說明:

  • scope:表示被@pytest.fixture()裝飾器所標識方法的作用域。
    作用域有四個級別,函式function(預設),類class,模組module,包package/session
    說明:function作用域包含函式和方法。
  • params:一個可選的引數列表,用於做Fixture的引數化。
    可將資料提供給其他的Fixture,或者所有測試使用它 。
  • autouseautouse=Ture則開啟自動使用Fixture功能,也是呼叫Fixture函式一種方法。
    Fixture裝飾器會自動執行作用域範圍內的所有用例的前後置。
    autouse預設值為Flase。
  • ids:一個字串id的列表,即當使用params引數化時,給每一個值設定一個變數名。
    如果沒有提供ID,params將自動生成ID 。
  • name:表示給被@pytest.fixture()裝飾器修飾的方法取一個別名,呼叫時可以使用別名呼叫。
    預設為裝飾器所裝飾的函式名稱。

3、Fixture裝飾器簡單應用

使用Fixture裝飾器來實現部分用例的前後置。

比如:我們在測試一個操作流程時,有的測試用例需要登陸,有的測試用例執行不需要使用者登陸。

如果要直接使用setup_function()前置函式來實現,該檔案中的所有用例執行前都需要進行使用者登陸。

如下示例:

import pytest

# 函式級,前置函式
def setup_function():
    print("使用者登陸")

def test_add_cart():
    print("新增購物車--需要登入")


def test_add_address():
    print("新增收貨地址--需要登入")


def test_browser_goods():
    print("瀏覽商品--不需要登入")


if __name__ == '__main__':
    pytest.main()

"""
執行結果:

使用者登陸
新增購物車--需要登入
PASSED使用者登陸
新增收貨地址--需要登入
PASSED使用者登陸
瀏覽商品--不需要登入
PASSED
"""

我們可以使用Fixture裝飾器來實現部分用例的前後置,如下示例:

"""
1.學習目標
    掌握pytest  fixture定義
2.操作步驟
    1.在定義的函式前新增裝飾器
        @pytest.fixture()
    2.編寫函式
        @pytest.fixture()
        def 函式名():
            程式碼
    3.使用fixture
        在測試用例中,將上面定義的函式名稱,當做引數傳入到測試用例中即可
        def test_xx(函式名):
            用例步驟

"""
import pytest


# 步驟1
@pytest.fixture()
def login():  # 步驟3
    print("輸入賬號,密碼,進行登入")


def test_add_cart(login):  # 步驟3
    print("新增購物車--需要登入")


def test_add_address(login):  # 步驟3
    print("新增收貨地址--需要登入")


def test_browser_goods():
    print("瀏覽商品--不需要登入")


if __name__ == '__main__':
    pytest.main()

"""
執行結果:

輸入賬號,密碼,進行登入
新增購物車--需要登入
PASSED輸入賬號,密碼,進行登入
新增收貨地址--需要登入
PASSED瀏覽商品--不需要登入
PASSED

只有新增購物車,新增收貨地址的用例,執行了登陸操作
"""

提示:Fixture裝飾器既可以實現部分用例的前後置,也可以是現實全部用例的前後置,所以比單獨使用前置setup()函式和後置teardown()函式靈活多了。

4、yield執行後置函式

前面的示例,是在用例前加前置條件,相當於執行了setup()前置函式,既然有setup()前置函式那就會有teardown()後置函式,Fixture裡面的teardown()後置函式用yield來喚醒。

示例:

import pytest


# 步驟1
@pytest.fixture()
def login():  # 步驟2
    print("開啟APP")
    print("輸入賬號,密碼,進行登入")
    yield  # 當用例執行完成後,執行yield後的程式碼
    print("關閉APP")


def test_add_cart(login):  # 步驟3
    print("新增購物車--需要登入")


def test_add_address(login):  # 步驟3
    print("新增收貨地址--需要登入")


if __name__ == '__main__':
    pytest.main()

"""
執行結果:

開啟APP
輸入賬號,密碼,進行登入
新增購物車--需要登入
關閉APP
PASSED開啟APP
輸入賬號,密碼,進行登入
新增收貨地址--需要登入
關閉APP
PASSED
"""

相關文章