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

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
"""