1. 安裝pytest及Pycharm
1.pip install pytest
2.Pycharm下載地址:https://www.jetbrains.com/pycharm/download/#section=mac
2. 第一個測試Demo
以簡單的加法運算來開啓我們的pytest學習之旅~
test_add.py
import pytest
def add(num1, num2):
return num1 + num2
testdata_add = [(1, 2, 3)]
# 執行時會根據數據的數量執行對應條數的用例
@pytest.mark.parametrize("num1, num2, expect", testdata_add)
def test_add(num1, num2, expect): # 接收的變量名要和parametrize的一致
result = add(num1, num2)
assert result == expect
2.1 運行pytest
pytest會遞歸遍歷每個目錄及其子目錄,我們可以在pytest中指定需要測試的文件名或目錄,或者先切換到需要運行的目錄。
pytest主要的命名規則(默認的測試搜索規則是可以修改的):
- 測試文件應當命名爲test_xxx.py或者xxx_test.py
- 測試函數、測試類方法應當命名爲test_xxx
- 測試類應當命名爲Testxxx
2.2 控制檯信息
- session
pytest爲每段測試會話session做了明確的分隔,一段會話就是一次pytest的調用,它可能包括多個目錄下被執行的測試用例。 - platform darwin – Python 3.8.2, pytest-5.4.1, py-1.8.1, pluggy-0.13.1
platform表示運行平臺,我的電腦是Mac,顯示爲darwin。後面依次顯示爲 Python、 pytest以及 pytest包的版本。 - rootdir
當前起始目錄,是pytest搜索測試代碼時最常使用的目錄。 - collected 1 item
搜索範圍內找到一個測試條目。 - test_add.py .
test_add.py表示測試文件,每個文件的測試情況只佔據一行,一個點號表示一個用例已通過。 - 1 passed in 0.01s
表示測試通過的數量以及這段會話耗費的時間。
2.3 運行結果
- PASSED(.)
測試通過。 - FAILED(F)
測試失敗。 - SKIPPED(s)
測試未被執行。 - xfail(x)
預期測試失敗,並且確實失敗了。 - XPASS(X)
預期測試失敗,但實際上運行通過,不符合預期。 - ERROR(E)
測試用例之外的代碼觸發了異常,可能由fixture引起,也可能由hook函數引起。
3 常用的命令行選項
可以通過’pytest --help’查看所有的選項。
3.1 --collect-only
使用–collect-only可以展示在給定的配置下哪些測試用例會被執行,可以在測試運行之前,檢查選中的測試用例是否符合預期。
3.2 -k
使用-k可以指定希望運行的測試用例。如果某測試名是唯一的,或者多個測試名的前綴或後綴相同,那麼可以使用表達式快速定位。
在原本代碼的基礎上,新增一條關於減法的測試用例
def minus(num1, num2):
return num1 - num2
testdata_minus = [(5, 2, 3)]
@pytest.mark.parametrize("num1, num2, expect", testdata_minus)
def test_minus(num1, num2, expect):
result = minus(num1, num2)
assert result == expect
先利用–collect-only查看一下:
pytest --collect-only
利用-k來指定有關減法的測試用例:
pytest -k "minus"
利用-k來指定有關減法和加法的測試用例:
pytest -k "add or minus"
ps:未防止歧義,將文件名由test_add.py改爲test_cal.py
3.3 -m
可以標記測試並分組,需要預先做好標記。如:給加法及減法的測試用例均添加標記爲@pytest.mark.run_cal
pytest -m run_cal
也可以使用關係連接符來指定多個標記名
pytest -m mark1 and mark2
pytest -m mark1 and not mark2
pytest -m mark1 or mark2
3.4 -x
正常情況下,pytest會運行每一個搜索到的測試用例。如果某個測試函數被斷言失敗,或者觸發來外部異常,則該測試用例的運行就會到此爲止,pytest將其標記爲失敗後會繼續運行下一個測試用例。
使用-x可以設定遇到失敗時立即停止整個會話。
增加加法測試用例的測試數據如下,第二條測試數據爲失敗:
testdata_add = [(1, 2, 3), (3, 1, 5), (3, 1, 4)]
pytest -k "add"
pytest -x -k "add"
3.5 --maxfail=num
-x選項是一旦遇到測試失敗,就會全局停止。–maxfail可以設定pytest失敗幾次後再停止。
再次調整加法測試用例的測試數據,共存在4組失敗的數據:
testdata_add = [(1, 2, 3), (3, 1, 5), (3, 1, 4), (3, 1, 5), (3, 1, 5), (3, 1, 5), (3, 2, 5)]
pytest --maxfail=3 -k "add"
3.6 -s、–capture=method
-s選項允許終端在測試運行時輸出某些結果,包括任何符合標準的輸出流信息。-s等價於–capture=no。正常情況下,所有的測試輸出都會被捕獲。
信息捕獲的方法還有:
- –capture=fd:若文件描述符file descriptor爲1或2時,則會被輸出到臨時文件中
- –capture=sys:sys.stdout/stderr將會被輸出至內存
3.7 --lf(–last-failed)
當一個或多個測試失敗時,lf能夠定位到最後一個失敗的測試用例並重新運行。
pytest -lf
3.8 --ff(–failed-first)
–ff選項與–lf選項的功能基本相同,不同之處在於–ff會運行完剩餘的測試用例。
pytest --ff
3.9 -v(–verbose)
使用-v(–verbose)選項,輸出的信息會更詳細。
pytest -v
3.10 -q(–quiet)
-q(–quiet)作用與-v(–verbose)相反,簡化輸出信息。
pytest -q
3.11 -l(–showlocals)
使用-l選項,失敗的測試用例由於被堆棧追蹤,所以局部變量及其值都會顯示出來。
pytest -l
3.12 --tb=style
–tb=stylex選項決定捕捉到失敗時輸出信息的顯示方式。
- short:僅輸出assert的一行及系統判定內容,不顯示上下文。
pytest --tb=short
- line:只用一行輸出顯示所有的錯誤信息。
pytest --tb=line
- no:屏蔽全部回溯信息。
pytest --tb=no
- long:輸出最爲詳細的回溯信息。
- auto:默認值,如果有多個測試用例失敗,僅打印第一個和最後一個用例的回溯信息。
- native:只輸出Python標準庫的回溯信息,不顯示額外信息。
3.13 --durations=N
–duration=N選項可以加快測試節奏,它會顯示最慢的N個階段,耗時越長越靠前。如果使用–durations=0,則會將所有階段按耗時從長到短排序後顯示。
每個測試用例大體上都包含三個階段:call、setup、teardown,call、teardown也稱爲fixture。
3.14 --version
顯示當前的pytest版本及安裝目錄。
pytest --version
3.15 -h(–help)
pytest -h
末尾顯示:shown according to specified file_or_dir or current dir if not specified,Pytes允許你在conftest.py和測試文件中自定義測試行爲,其作用域僅是某個項目,甚至只是某個項目的測試子集。