上一篇介紹了如何通過setup和teardown來幫助我們做自動化的前置和后置內容,那么如果有一個場景,有的用例需要用到登錄的方法,有的卻用不到登錄的方法,這時如果用setup和teardown的方法就不能寫在一個測驗類中,但是pytest中還有更好的前置內容,不需要每個用例都能用到,
fixture
fixture屬于pytest中的一個方法,fixture是在測驗函式運行前后進行執行的,fixture的命名不規范沒有強制要求,以及里面的代碼內容可以自己進行定制從而滿足多種測驗需求,配置測驗前的資料清理,以及測驗完成后的資料管理,fixture中的代碼處理測驗后的代碼為 yield 測驗開始前會執行yield前面的代碼(setup),測驗完成后將執行yield后面的代碼(teardown),在fixture中不是強制必須有yield,比如,我只有前置代碼,沒有后置代碼,那就不需要yield內容,或者只有后置代碼,沒有前置代碼,無論測驗程序中發生什么錯誤,yield后續的代碼都會被執行
原始碼:
def fixture( # noqa: F811 fixture_function: Optional[_FixtureFunction] = None, *, scope: "Union[_Scope, Callable[[str, Config], _Scope]]" = "function", params: Optional[Iterable[object]] = None, autouse: bool = False, ids: Optional[ Union[ Iterable[Union[None, str, float, int, bool]], Callable[[Any], Optional[object]], ] ] = None, name: Optional[str] = None ) -> Union[FixtureFunctionMarker, _FixtureFunction]:
通過上面的原始碼可以看到fixture一共有5個引數分別是:name,scope,params,autouse,ids,每個引數在后面都會介紹到,這里安靜就先不做太多介紹,
栗子:
安靜拿開頭說的那個案例,如果一個測驗類下用例,有的需要登錄,有的必須要登錄操作
import pytest @pytest.fixture() def login(): print('輸入賬號,輸入密碼') print('完成登錄功能!!!!') yield print('---退出登錄---') class Test_Login(): def test_01(self,login): print('這是用例01') print('需要用到登錄!') def test_02(self): print('這是用例02') print('不需要登錄!') def test_03(self,login): print('這是用例03') print('這里需要用到登錄!') if __name__ == '__main__': pytest.main(['-s','test_03.py'])

這里會發現,我在用例1和用例3中進行通過fixture進行使用,然后用例1和用例3都執行了配置的登錄和退出登錄內容,用例2,我沒用使用fixture方法,所以沒用執行對應代碼,
也可以通過--setup-show的方法來查看詳細的fixture資訊

多個fixture使用
在一個測驗用例中可以使用多個fixture的方法,執行順序根據你傳入的順序進行執行,
import pytest @pytest.fixture() def login(): print('輸入賬號,輸入密碼') print('完成登錄功能!!!!') yield print('---退出登錄---') @pytest.fixture() def add(): print('測驗開始執行!') class Test_Login(): def test_01(self,login,add): print('這是用例01') print('需要用到登錄!') def test_02(self): print('這是用例02') print('不需要登錄!') def test_03(self,add,login): print('這是用例03') print('這里需要用到登錄!') if __name__ == '__main__': pytest.main(['-s','test_03.py'])
結果可以看出來,用例1:把login方法的fixture放在了前面,先執行的login方法后執行的add,用例3:add方法在前面,login方法在后面,執行也是add先執行,login后執行,
fixture相互呼叫
其實fixture之間也是可以進行相互呼叫的,
import pytest @pytest.fixture() def login(): print('輸入賬號,輸入密碼') print('完成登錄功能!!!!') yield print('---退出登錄---') @pytest.fixture() def add(login): print('測驗開始執行!') yield print('測驗結束!') class Test_Login: def test_01(self, add): print('------用例01------') def test_02(self): print('------用例02------') def test_03(self,login): print('------用例03------') if __name__ == '__main__': pytest.main(['-s', 'test__01.py'])

通過上面的執行結果可以看到,我們fixture中的login函式被add函式進行呼叫了,然后在用例中直接執行add,login中的內容也進行了執行
yield遇到例外后繼續執行
在前面介紹fixture的時候說過,fixture執行程序中,無論遇到什么例外,都會繼續執行yeild后面的代碼(teardown),安靜舉例給大家看看
import pytest @pytest.fixture() def login(): print('輸入賬號,輸入密碼') print('完成登錄功能!!!!') yield print('---退出登錄---') class Test_Login(): def test_01(self,login): print('這是用例01') print('需要用到登錄!') assert 1==2 def test_02(self): print('這是用例02') print('不需要登錄!') def test_03(self,login): print('這是用例03') print('這里需要用到登錄!') if __name__ == '__main__': pytest.main(['-s','test_03.py'])

從例子中很清楚的就發現我們的后置代碼在報錯的情況下也會執行,在自動化測驗程序中,無論測驗結果如何,測驗資料是肯定能清理的很干凈,
安靜簡單的介紹了fixture的用法,其實安靜覺得pytest中最實用的也就是fixture,后續安靜會慢慢的一點點進行補充,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/248008.html
標籤:其他
