1.首先安裝pytest
pip install pytest
2.編寫單測用例
在pytest框架中,有如下約束:
- 所有的單測文件名都需要滿足
test_*.py
格式或*_test.py
格式。 - 在單測文件中,可以包含
test_
開頭的函數,也可以包含Test
開頭的類。 - 在單測類中,可以包含一個或多個
test_
開頭的函數。
此時,在執行pytest
命令時,會自動從當前目錄及子目錄中尋找符合上述約束的測試函數來執行。
import pytest # content of test_sample.py def func(x): return x + 1 def test_answer(): assert func(3) == 5
運行 pytest 或 指定特定文件 pytest -q test_sample.py
2.1 運行pytest 則遍歷當前目錄及子目錄
看紅色圈住的部分,可以得出它是循環遍歷它當前目錄和子目錄
2.2 pytest -q test_class.py 指定文件運行
3.測試用例搜索
定義是: 搜索測試文件和測試用例的過程稱為測試搜索.
想要被搜到,必須遵守pyteset的命名規則:
- 所有的單測文件名都需要滿足
test_*.py
格式或*_test.py
格式。 - 在單測文件中,可以包含
test_
開頭的函數,也可以包含Test
開頭的類。 - 在單測類中,可以包含一個或多個
test_
開頭的函數。
為了好記,測試文件和測試函數必須以 test_開頭,類是Test 開頭.
4.控制台信息講解
4.1. test session starts
這個是每次運行的分割線
4.2. platform 信息
1.win32 代表用的是windows ,MAC 顯示的是darwin
2.接着顯示的是Python 和 pytest的版本 , py 和pluggy是pytest包
3.rootdir 當前的起始目錄, inifile是指配置文件,后邊章節我會詳細講解.
4. collected 5 itemes 一共搜集了多少測試用例.
5. test_run01.py …
測試文件后邊的“.” 代表測試通過, F(Fail),E(error),s(skip),X(xpass)>預期失敗但是成功了
x(xfail)>預期失敗執行也失敗了.(下邊我講解具體詳情)
6. 4 fail,1passed in 0.06 seconds======
表示通過的數量,沒有通過也會總結數量 ,以及花費得時間.
5.使用命令行選項
有了命令行選項使其操作我們的用例變的非常靈活。Unittest 框架如果想執行復雜的場景
變得很雞肋,這是pytest 優勝Unittest的地方.
以下列舉的是常用的命令行選項,已經可以滿足我們使用,如果個人想擴展,可以用
pytest --help 可以查到全部的命令 自己可以嘗試下,在這不截圖了
5.1 -–collect-only
從圖片可以看出 一共搜集了5 個測試用例,在執行結果 是 no tests ran 說明只是搜集並不執行。
5.2. -k 選項
重要功能是利用你使用的表達式來 指定希望運行的測試用例.
比如: 你用 pytest -k “表達式”
pytest 根據 你輸入的表達式內容進行去匹配 測試用例的名字里是否有這個表達式內容進行過濾.
然后再運行. 如果想查找多個內容,可以用 or 進行連接 ,請看下邊的截圖:
5.3.-m 選項
m 是marker的縮寫,功能是執行自己標記的測試用例,我先講解如何標記測試用例
如果我們想執行帶有 first_case 怎么標記呢
請看下邊的實例, 用到了@pytest.mark.first_case, 其中first_case 是裝飾器用於標記的內容.
import pytest def inc(x): return x + 1 def test_answer(): assert inc(3) == 5 @pytest.mark.first_case def test_task01(): assert 1 == 1 def test_task02(): assert 1 == 1 def test_task03(): assert 1 == 1
pytest -m "first_case" --collect-only 或者
pytest -m "first_case"
PS E:\Python_Web\pytest-requests-allure> pytest -m "first_case" --collect-only ================================================= test session starts ================================================= platform win32 -- Python 3.7.2, pytest-4.5.0, py-1.8.0, pluggy-0.12.0 rootdir: E:\Python_Web\pytest-requests-allure plugins: allure-pytest-2.6.3, html-1.20.0, metadata-1.8.0 collected 8 items / 6 deselected / 2 selected <Module test_module.py> <Function test_task01> <Function test_task02> ================================================== warnings summary =================================================== d:\software\python\python37\lib\site-packages\_pytest\mark\structures.py:324 d:\software\python\python37\lib\site-packages\_pytest\mark\structures.py:324: PytestUnknownMarkWarning: Unknown pytest.mark.first_case - is this a typo? You can register custom marks to avoid this warning - for details, see https://docs.pytest.org/en/latest/mark.html PytestUnknownMarkWarning, -- Docs: https://docs.pytest.org/en/latest/warnings.html ====================================== 6 deselected, 1 warnings in 0.11 seconds =======================================
如果想用多個marker ,可以這么寫 “marker1 or marker2” 意思是執行 mark1 和mark2所有測試用例
也可以用not 過濾, “marker1 and not marker2” 意思是 執行marker1 並且不包含marker2用例.
6. -x 選項
這個選項是為debug 准備的,正常的流程 是如果斷言失敗,它會繼續執行並不會斷掉.如果想在第一個斷言失敗我就不讓繼續執行,就可以用-x選項. 遇到斷言失敗就停止執行.有利於我們查找原因.
7.–lf 選項 (lf 是 last failed 的縮寫)
這個選項用處很大,直接過濾出最后一個fail 的測試用例,有利於我們查找失敗的用例,解決好,我們再運行這個if 選項 ,可以再找出最后一個fail,省了我們再執行成功的用例,節省我們的時間 .
8.–ff (是 failed first)
和 --lf 不同是的是,它優先運行失敗的case ,再把之前運行通過的也要運行. 自己嘗試下,這里不做演示
9.-v 選項
這個會在控制台輸出更多的內容,最明顯的區別就是每個文件中的每個測試用例都占一行(先前是每個文件占一行)
我把這兩種情況都打印出來,看下
10 --tb=style 選項
這個選項用於對失敗輸出信息的顯示方式,
輸出的信息一般包括 1. 失敗出現在哪一行2.是什么失敗 3.怎么失敗的 這三要素是信息追溯
我們常用的style 有 short ,no, line
實例如下:
no 屏蔽所有的回溯信息,只是顯示哪個文件哪個case 失敗,
line 具體到哪個assert
short 具體到哪個參數,列舉出更詳細的失敗信息.
實際工作中 -q 和 --tb=line 組合 已經夠用.