『德不孤』Pytest框架 — 11、Pytest中Fixture裝飾器(一)
- 2022 年 3 月 12 日
- 筆記
- 測試基礎技能 - Pytest測試框架
1、Fixture裝飾器的用途
- 做測試前後的初始化設置,如測試數據準備,鏈接資料庫,打開瀏覽器等這些操作都可以使用Fixture來實現。
- 測試用例的前置條件可以使用Fixture實現,比直接使用Pytest框架的
setup()
和teardown()
函數更加靈活。 - Fixture是Pytest用於將測試前後進行預備,清理工作的程式碼分離出核心測試邏輯的一種機制!
- 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,或者所有測試使用它 。autouse
:autouse=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
"""