肉鴿策略遊戲《大橡樹》5月3日登陸Steam搶先體驗
阿新 • • 發佈:2022-03-28
在unittest測試中,有引數化的概念,那麼在pytest中也有。
如何理解引數化:
當對一個測試函式進行測試時,通常會給函式傳遞多組引數。比如測試賬號登陸,我們需要模擬各種千奇百怪的賬號密碼。可以把這些引數寫在測試函式內部進行遍歷。不過雖然引數眾多,但仍然是一個測試,當某組引數導致斷言失敗。我們想要的是一個的失敗不影響其他的失敗。通過引數化的方式來管理組織。那麼我們看下pytest如何實現引數化的。
pytest.mark.parametrize(argnames, argvalues)
假設要測試密碼的長度必須大於8位且小於16位。設計了幾個密碼
['123','12345678','1234567890123456','12345678901234561']
我們看下如何使用
import pytest @pytest.mark.parametrize('passwd', ['123','12345678','1234567890123456','12345678901234561']) def test_passwd_length(passwd): assert len(passwd) >= 8 assert len(passwd)<=16
正常應該執行四個測試用例
失敗用例:
符合我們預期,可以看到用引數化的思路可以減少程式碼編寫。
如果我們要驗證使用者名稱和密碼呢,兩個引數如何實現呢。
import pytest @pytest.mark.parametrize('user,passwd', [ ('lowen', '123'), ('lowen', '12345678'), ('lowen', '1234567890123456'), ('lowenlowen', '12345678901234561') ]) def test_passwd_length(user, passwd): assert len(passwd) >= 8 assert len(passwd) <= 16 assert user == 'lowen'
當然還可以給每組引數增加id
import pytest @pytest.mark.parametrize('user,passwd', [pytest.param('lowen', '123', id='User:lowen'), pytest.param('lowen', '12345678', id='User:lowen'), pytest.param('ll', '1234567890123456', id='User:ll'), pytest.param('lowenlowen', '12345678901234561', id='User:lowenzishuoceshikwaifa')]) def test_passwd_length(user, passwd): assert len(passwd) >= 8 assert len(passwd) <= 16 assert user == 'lowen'
執行結果為:
上面的都是寫固定的,但是,實際的工作中呢,很多時候的引數都是實時讀取的。這些引數資料都是動態讀取來的,那麼看下如何給引數動態傳遞呢,這裡獲取資料,寫了一個demo。
import pytest def getparame() -> list: return [('lowen', '123'), ('lowen', '12345678'), ('ll', '1234567890123456'), ('lowenzishuoceshikaifa', '12345678901234561')] @pytest.mark.parametrize('user,passwd',getparame()) def test_passwd_length(user, passwd): assert len(passwd) >= 8 assert len(passwd) <= 16 assert user == 'lowen'
執行結果為: