您好,登錄后才能下訂單哦!
前面一篇講了setup、teardown可以實現在執行用例前或結束后加入一些操作,但這種都是針對整個腳本全局生效的
如果有以下場景:用例 1 需要先登錄,用例 2 不需要登錄,用例 3 需要先登錄。很顯然無法用 setup 和 teardown 來實現了fixture可以讓我們自定義測試用例的前置條件
@pytest.fixture(scope="function", params=None, autouse=False, ids=None, name=None)
def test():
print("fixture初始化的參數列表")
參數列表
注意
session的作用域:是整個測試會話,即開始執行pytest到結束測試
#!/usr/bin/env python # -*- coding: utf-8 -*- """ __title__ = __Time__ = 2020-04-06 15:50 __Author__ = 小菠蘿測試筆記 __Blog__ = https://www.cnblogs.com/poloyy/ """ import pytest # 調用方式一 @pytest.fixture def login(): print("輸入賬號,密碼先登錄") def test_s1(login): print("用例 1:登錄之后其它動作 111") def test_s2(): # 不傳 login print("用例 2:不需要登錄,操作 222") # 調用方式二 @pytest.fixture def login2(): print("please輸入賬號,密碼先登錄") @pytest.mark.usefixtures("login2", "login") def test_s11(): print("用例 11:登錄之后其它動作 111") # 調用方式三 @pytest.fixture(autouse=True) def login3(): print("====auto===") # 不是test開頭,加了裝飾器也不會執行fixture @pytest.mark.usefixtures("login2") def loginss(): print(123)
執行結果
fixture的實例化順序
#!/usr/bin/env python # -*- coding: utf-8 -*- """ __title__ = __Time__ = 2020-04-06 16:14 __Author__ = 小菠蘿測試筆記 __Blog__ = https://www.cnblogs.com/poloyy/ """ import pytest order = [] @pytest.fixture(scope="session") def s1(): order.append("s1") @pytest.fixture(scope="module") def m1(): order.append("m1") @pytest.fixture def f1(f3, a1): # 先實例化f3, 再實例化a1, 最后實例化f1 order.append("f1") assert f3 == 123 @pytest.fixture def f3(): order.append("f3") a = 123 yield a @pytest.fixture def a1(): order.append("a1") @pytest.fixture def f2(): order.append("f2") def test_order(f1, m1, f2, s1): # m1、s1在f1后,但因為scope范圍大,所以會優先實例化 assert order == ["s1", "m1", "f3", "a1", "f1", "f2"]
執行結果
斷言成功
添加了 @pytest.fixture
,如果fixture還想依賴其他fixture,需要用函數傳參的方式,不能用 @pytest.mark.usefixtures()
的方式,否則會不生效
@pytest.fixture(scope="session") def open(): print("===打開瀏覽器===") @pytest.fixture # @pytest.mark.usefixtures("open") 不可取!!!不生效!!! def login(open): # 方法級別前置操作setup print(f"輸入賬號,密碼先登錄{open}")
前面講的,其實都是setup的操作,那么現在就來講下teardown是怎么實現的
用fixture實現teardown并不是一個獨立的函數,而是用 yield 關鍵字來開啟teardown操作
#!/usr/bin/env python # -*- coding: utf-8 -*- """ __title__ = __Time__ = 2020-04-06 15:50 __Author__ = 小菠蘿測試筆記 __Blog__ = https://www.cnblogs.com/poloyy/ """ import pytest @pytest.fixture(scope="session") def open(): # 會話前置操作setup print("===打開瀏覽器===") test = "測試變量是否返回" yield test # 會話后置操作teardown print("==關閉瀏覽器==") @pytest.fixture def login(open): # 方法級別前置操作setup print(f"輸入賬號,密碼先登錄{open}") name = "==我是賬號==" pwd = "==我是密碼==" age = "==我是年齡==" # 返回變量 yield name, pwd, age # 方法級別后置操作teardown print("登錄成功") def test_s1(login): print("==用例1==") # 返回的是一個元組 print(login) # 分別賦值給不同變量 name, pwd, age = login print(name, pwd, age) assert "賬號" in name assert "密碼" in pwd assert "年齡" in age def test_s2(login): print("==用例2==") print(login)
yield注意事項
# 官方例子 @pytest.fixture(scope="module") def smtp_connection(): with smtplib.SMTP("smtp.gmail.com", 587, timeout=5) as smtp_connection: yield smtp_connection # provide the fixture value
該 smtp_connection
連接將測試完成執行后已經關閉,因為 smtp_connection
對象自動關閉時, with
語句結束。
@pytest.fixture(scope="module") def test_addfinalizer(request): # 前置操作setup print("==再次打開瀏覽器==") test = "test_addfinalizer" def fin(): # 后置操作teardown print("==再次關閉瀏覽器==") request.addfinalizer(fin) # 返回前置操作的變量 return test def test_anthor(test_addfinalizer): print("==最新用例==", test_addfinalizer)
注意事項
如果 request.addfinalizer() 前面的代碼,即setup部分已經拋出異常了,則不會執行 request.addfinalizer() 的teardown內容(和yield相似,應該是最近新版本改成一致了)
可以聲明多個終結函數并調用
總結
到此這篇關于Pytest框架之fixture的詳細使用教程的文章就介紹到這了,更多相關Pytest fixture使用內容請搜索億速云以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持億速云!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。