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