Pytest_基礎知識

作者:Gakki

01 Pytest 用例規(guī)則

Pytest 可以在不同的函數(shù)命迈、包中發(fā)現(xiàn)用例,發(fā)現(xiàn)的規(guī)則如下:

  • 文件名以 test_ 開頭的 py 文件
  • 以 test_ 開頭的函數(shù)
  • 以 Test 開頭的類
  • 以 test_ 開頭的方法
  • 注:所有的包必須要有 init.py 文件

02 Pytest 運行方式

  1. 單獨執(zhí)行某一個 py 文件里所有的用例:
    pytest test_login.py

  2. 執(zhí)行目錄下所有的用例:
    pytest testcase/

  3. 單獨執(zhí)行某個用例

以函數(shù)形式的用例
pytest test_login.py::test_login
 
以類形式的用例
pytest test_login.py::TestClass::test_login

03 setup 和 teardown 函數(shù)

  1. setup和teardown主要分為:模塊級,類級,功能級尉桩,函數(shù)級。
  2. 存在于測試類內部

函數(shù)級別:運行于測試方法的始末,即:運行一次測試函數(shù)會運行一次 setupteardown
類級別:運行于測試類的始末喇辽,即:在一個測試內只運行一次 setup_classteardown_class ,不關心測試類內有多少個測試函數(shù)雨席。

04 裝飾器之 Fixture

Fixture 裝飾器的用途:

  1. 做測試前后的初始化設置菩咨,如測試數(shù)據準備,鏈接數(shù)據庫陡厘,打開瀏覽器等這些操作都可以使用Fixture來實現(xiàn)抽米。
  2. 測試用例的前置條件可以使用Fixture實現(xiàn),比直接使用Pytest框架的setup()和teardown()函數(shù)更加靈活糙置。
  3. Fixture是Pytest用于將測試前后進行預備云茸,清理工作的代碼分離出核心測試邏輯的一種機制。
  4. Fixture可以實現(xiàn)Unittest不能實現(xiàn)的功能谤饭,比如:Unittest中的測試用例和測試用例之間是無法傳遞參數(shù)和數(shù)據的标捺,但是Fixture卻可以解決這個問題。

Fixture 參數(shù)說明:
fixture(scope="function", params=None, autouse=False, ids=None, name=None):

入參說明:

  • scope:表示被 @pytest.fixture() 裝飾器所標識方法的作用域揉抵。作用域有四個級別亡容,函數(shù) function(默認) ,類 class 功舀,模塊 module 萍倡,包 package/session 。說明:function 作用域包含函數(shù)和方法辟汰。
  • params:一個可選的參數(shù)列表列敲,用于做 Fixture 的參數(shù)化阱佛。可將數(shù)據提供給其他的 Fixture 戴而,或者所有測試使用它 凑术。
  • autouse:autouse=Ture 則開啟自動使用 Fixture 功能,也是調用 Fixture 函數(shù)一種方法所意。Fixture 裝飾器會自動執(zhí)行作用域范圍內的所有用例的前后置淮逊。autouse 默認值為 Flase 。
  • ids:一個字符串 id 的列表扶踊,即當使用params參數(shù)化時泄鹏,給每一個值設置一個變量名。如果沒有提供 ID 秧耗, params 將自動生成 ID 备籽。
  • name:表示給被 @pytest.fixture() 裝飾器修飾的方法取一個別名,調用時可以使用別名調用分井。默認為裝飾器所裝飾的函數(shù)名稱车猬。
    注:Fixture裝飾器既可以實現(xiàn)部分用例的前后置,也可以是現(xiàn)實全部用例的前后置尺锚。
import pytest
# 1.py
@pytest.fixture(scope='module', autouse=True)
def test1():
    print('\n開始執(zhí)行module')
@pytest.fixture(scope='class', autouse=True)
def test2():
    print('\n開始執(zhí)行class')
@pytest.fixture(scope='function', autouse=True)
def test3():
    print('\n開始執(zhí)行function')
def test_a():
    print('---用例a執(zhí)行---')
def test_d():
    print('---用例d執(zhí)行---')
class TestCase:
    def test_b(self):
        print('---用例b執(zhí)行---')
    def test_c(self):
        print('---用例c執(zhí)行---')
if __name__ == '__main__':
    pytest.main(['-s', '1.py'])

輸出結果:

collected 4 items

1.py 
開始執(zhí)行module

開始執(zhí)行class

開始執(zhí)行function
---用例a執(zhí)行---
.
開始執(zhí)行class

開始執(zhí)行function
---用例d執(zhí)行---
.
開始執(zhí)行class

開始執(zhí)行function
---用例b執(zhí)行---
.
開始執(zhí)行function
---用例c執(zhí)行---
.

============================== 4 passed in 0.04s ==============================

05 跳過(Skip)及預期失斨槿颉(xFail)

根據特定條件,不執(zhí)行標識的測試函數(shù)瘫辩。

  • 方法:
    skipif(condition, reason=None)
  • 參數(shù):
    • condition:跳過的條件伏嗜,必傳參數(shù)
    • reason:標注原因,必傳參數(shù)
  • 使用方法:
    @pytest.mark.skipif(condition, reason="xxx")

跳過執(zhí)行測試函數(shù)

  • pytest.mark.skip(reason=" ") 可傳入一個非必須參數(shù)reason表示原因

自定義@pytest.mark.skip()標簽

  • skip_test = pytest.mark.skip() 或 myskip = pytest.mark.skipif(condition=...)
  • 裝飾時用該變量代替標簽即可:@skip_test

標記為預期失敗函數(shù)

  • 方法:
    xfail(condition=None, reason=None, raises=None, run=True, strict=False)
  • 常用參數(shù):
    • condition:預期失敗的條件杭朱,必傳參數(shù)
    • reason:失敗的原因阅仔,必傳參數(shù)
  • 使用方法:
    • @pytest.mark.xfail(condition, reason="xx")

使用xfail標記指示你希望測試失敗吹散。運行用例的時候弧械,在失敗時不會報告回溯。相反,終端報告會將其列在“預期失敗”(XFAIL)或“意外傳遞”(XPASS)部分中空民。

06 裝飾器之 mark

函數(shù)數(shù)據參數(shù)化刃唐,方便測試函數(shù)對測試數(shù)據的獲取。

  • 方法:
    • parametrize(argnames, argvalues, indirect=False, ids=None, scope=None)
  • 常用參數(shù):
    • argnames:參數(shù)名
    • argvalues:參數(shù)對應值界轩,類型必須為list
      當參數(shù)為一個時格式:[value]
      當參數(shù)個數(shù)大于一個時画饥,格式為:[(param_value1,param_value2.....), (param_value1,param_value2.....)]
  • 使用方法:
    • @pytest.mark.parametrize(argnames,argvalues),參數(shù)值為N個浊猾,測試方法就會運行N次

07 pytest 參數(shù)

  • -K EXPRESSION:執(zhí)行某個關鍵字的用例抖甘,用例要匹配給出的表達式;使用python的語法葫慎,匹配的范圍是文件名衔彻、類名薇宠、函數(shù)名為變量,用and來區(qū)分艰额。
  • --maxfail=num:當錯誤個數(shù)到達給定數(shù)時澄港,退出測試,這里就不列舉實例了柄沮,結果與-x類似回梧。
  • -m MARKEXPR:只能運行有相應標識的測試用例,使用這個參數(shù)祖搓,測試用例要使用@pytest.mark.marker修飾狱意。
  • -v:詳細結果
  • -q:極簡結果顯示,簡化控制臺的輸出
  • -s:輸入我們用例中的調式信息拯欧,比如print的打印信息等
  • -V:可以輸出用例更加詳細的執(zhí)行信息髓涯,比如用例所在的文件及用例名稱等
  • --junit-xml=path:輸出xml文件格式,在與jenkins做集成時使用
  • --result-log=path:將最后的結果保存到本地文件中
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末哈扮,一起剝皮案震驚了整個濱河市纬纪,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌滑肉,老刑警劉巖包各,帶你破解...
    沈念sama閱讀 212,816評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異靶庙,居然都是意外死亡问畅,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,729評論 3 385
  • 文/潘曉璐 我一進店門六荒,熙熙樓的掌柜王于貴愁眉苦臉地迎上來护姆,“玉大人,你說我怎么就攤上這事掏击÷言恚” “怎么了?”我有些...
    開封第一講書人閱讀 158,300評論 0 348
  • 文/不壞的土叔 我叫張陵砚亭,是天一觀的道長灯变。 經常有香客問我,道長捅膘,這世上最難降的妖魔是什么添祸? 我笑而不...
    開封第一講書人閱讀 56,780評論 1 285
  • 正文 為了忘掉前任,我火速辦了婚禮寻仗,結果婚禮上刃泌,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好耙替,可當我...
    茶點故事閱讀 65,890評論 6 385
  • 文/花漫 我一把揭開白布鲤遥。 她就那樣靜靜地躺著,像睡著了一般林艘。 火紅的嫁衣襯著肌膚如雪盖奈。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 50,084評論 1 291
  • 那天狐援,我揣著相機與錄音钢坦,去河邊找鬼。 笑死啥酱,一個胖子當著我的面吹牛爹凹,可吹牛的內容都是我干的。 我是一名探鬼主播镶殷,決...
    沈念sama閱讀 39,151評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼禾酱,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了绘趋?” 一聲冷哼從身側響起颤陶,我...
    開封第一講書人閱讀 37,912評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎陷遮,沒想到半個月后滓走,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 44,355評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡帽馋,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,666評論 2 327
  • 正文 我和宋清朗相戀三年搅方,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片绽族。...
    茶點故事閱讀 38,809評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡姨涡,死狀恐怖,靈堂內的尸體忽然破棺而出吧慢,到底是詐尸還是另有隱情涛漂,我是刑警寧澤,帶...
    沈念sama閱讀 34,504評論 4 334
  • 正文 年R本政府宣布娄蔼,位于F島的核電站怖喻,受9級特大地震影響,放射性物質發(fā)生泄漏岁诉。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 40,150評論 3 317
  • 文/蒙蒙 一跋选、第九天 我趴在偏房一處隱蔽的房頂上張望涕癣。 院中可真熱鬧,春花似錦、人聲如沸坠韩。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽只搁。三九已至音比,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間氢惋,已是汗流浹背洞翩。 一陣腳步聲響...
    開封第一講書人閱讀 32,121評論 1 267
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留焰望,地道東北人骚亿。 一個月前我還...
    沈念sama閱讀 46,628評論 2 362
  • 正文 我出身青樓,卻偏偏與公主長得像熊赖,于是被迫代替她去往敵國和親来屠。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,724評論 2 351

推薦閱讀更多精彩內容

  • 本文參考了官方文檔和一些樂于分享的大佬的博客震鹉,結合自己的理解完成俱笛。學習pytest框架的小白,需要按照教程自己敲一...
    成都_阿木木閱讀 14,221評論 1 5
  • 目錄: 安裝及入門 使用和調用方法 原有TestSuite使用方法 斷言的編寫和報告 Pytest fixture...
    韓志超閱讀 1,945評論 0 2
  • 導包 import unittest 測試類以Test開頭 測試方法名稱必須以test開頭 pytest命令行運行...
    xiaohan_zhang閱讀 409評論 0 0
  • 1传趾、前置和后置裝飾器 注意這里的方法名都是固定的:setup前置方法放在所有用例的上方嫂粟,teardown放在用例的...
    牧野上川閱讀 1,788評論 0 4
  • 目錄: 安裝及入門 使用和調用方法 原有TestSuite使用方法 斷言的編寫和報告 Pytest fixture...
    韓志超閱讀 5,123評論 0 4