『德不孤』Pytest框架 — 3、Pytest的基礎說明
1、Pytest引數介紹
-v
:列印用例執行的詳細過程。-q
:只顯示整體測試結果。(顯示簡略過程)-s
:用於顯示輸出除錯資訊,包括測試函式中print()
函式輸出的資訊。-x
,--exitfirst
:在第一個錯誤或測試失敗時立即退出。
示例:在第N個用例失敗以後,結束測試執行。
第1次失敗,就停止測試:pytest -x ./test_a.py
--maxfail=num
:表示出現幾個用例失敗就停止執行測試。
出現兩個失敗就終止測試:pytest --maxfail=2 ./test_a.py
-h
:幫助。-n
:支援多執行緒或者分散式執行測試用例。
例如:pytest -vs /testcase/test_login.py -n 2
-n 2
表示支援分散式執行測試用例,並且分配兩個執行緒來執行。
或者pytest.main(['-vs','test_a.py'],'-n=2')
--reruns NUM
:失敗用例重跑。
示例:
pytest.main(['-vs','test_a.py'],'--reruns=2')
表示如果一個用例測試失敗了,再重新執行兩次,也就是一共執行三次該用例。-k args
:根據測試用例的名字,搜尋匹配字串,來執行匹配上的測試用例。
例如:pytest -vs ./test_a.py -k "ao"
--collect-only
:收集將要執行的用例,但不會執行用例。
例如:pytest --collcet-onty
-r option
:生成簡略的指定需求的報告。
提示:
以上功能直接帶引數執行啟動命令就能夠實現,而且還是很多其他的引數,以後在實際工作中好好總結,這裡就不一一演示了。
前提要安裝好前面提到的Pytest外掛要安裝好。
pytest-rerunfailures
:失敗case
重複執行。pytest-xdist
:測試用例分散式執行,也可以說是多CPU分發。
2、Pytest框架用例命名規則
Pytest可以在不同的函式中、包中發現用例,發現的規則如下:
- 測試檔名以
test_’
_test’
結尾.py
檔案。(必須有下劃線) - 以
test_
開頭的函式。(以下有沒有下劃線都可以) - 以
test_
開頭的方法。 - 測試類以
Test
開頭,並且類中不能帶有init
方法。
要注意的是所有的包必須要有init.py
檔案,在使用PyCharm編輯器時會自動生成。
3、Pytest Exit Code說明
Exit Code 0
:所有用例執行完畢,全部通過。Exit Code 1
:所有用例執行完畢,存在Failed
的測試用例。Exit Code 2
:使用者中斷測試執行。Exit Code 3
:測試執行過程中發生了內部錯誤。Exit Code 4
:Pytest命令列使用錯誤。Exit Code 5
:未採集到可用測試用例檔案。
提示:
Exit Code
是公共API的一部分,可以使用以下方法直接匯入和訪問:也就是在編寫測試用例的時候,我們也可以通過列舉的方式獲取
Exit Code
進行判斷或者斷言。步驟1:匯入
from pytest import ExitCode
步驟2:呼叫(都是常量)
pytest.ExitCode.OK
4、pytest.ini
全域性配置檔案
通過全域性的配置檔案執行測試用例,這種方式才是在實際企業自動化中的應用方式。(前面三種方式是自己測試的時候使用)
pytest.ini
檔案是Pytest的主配置檔案,可以改變Pytest的執行方式,pytest.ini
檔案的名字是固定的,不能改動。
pytest.ini
檔案可以改變Pytest測試框架預設的行為(查詢執行測試用例的行為),Pytest會讀取pytest.ini
檔案中配置資訊,按指定的方式去執行測試用例。
pytest.ini
檔案要注意:
- 存放位置:一般放在專案的根目錄(即當前專案的頂級資料夾下)。
- 編碼格式:必須是ANSI編碼格式,可以使用
notpad++
修改編碼格式。 pytest.ini
檔案中不能使用任何中文符號(也可以用,最好少用)。- 配置了
pytest.ini
檔案後,不管是主函式模式執行用例,還是命令列模式執行用例,都會去讀取pytest.ini
配置檔案中的內容。 - CMD命令列中執行
pytest -h
命令,可以檢視pytest.ini
的設定選項。
下面是最基礎的pytest.ini
檔案的編寫,如下:
[pytest]
# 命令列的引數,用空格分隔
addopts = -s --alluredir report
# 測試用例的路徑
testpaths = scripts
# 模組名的規則
python_files = test_parametrize.py
# 類名的規則
python_classes = Test*
# 方法名的規則
python_functions = test*
提示:用的時候把中文全部刪除掉。
5、Pytest執行測試用例的順序
Unittest
測試框架,預設是以用例名的ascll
大小,來決定測試用例的執行的順序。
Pytest
測試框架:預設從上到下順序執行測試用例,也就是檔案中先寫的誰,誰就先執行。
我們可以通過函式裝飾器的方式,標記被測試函式來決定用例執行的順序。
需要使用pytest-ordering
外掛。
安裝⽅式:pip install pytest-ordering
使用方法:
- 標記於被測試函式之上,
@pytest.mark.run(order=x)
。 - 根據
order
傳入的引數來解決執行順序。 order
值全為正數或全為負數時,執行順序:值越小,優先順序越高。- 正數和負數同時存在:正數優先順序高。
示例:
"""
1.學習目標
掌握pytest中用例執行順序的控制
2.操作步驟
pytest框架下用例執行的預設順序: 是按照書寫順序從上到下執行
控制測試用例執行順序,需要安裝pytest-ordering庫(外掛)
pip install pytest-ordering
控制用例執行順序方法:
在測試用例前新增一個裝飾
@pytest.mark.run(order=數字)
執行順序問題:order=數字
0 > 較小的正數 > 較大正數 > 不使用order > 較小負數 > 較大負數
3.需求
"""
# 1.匯入pytest
import pytest
# 2.編寫測試用例
@pytest.mark.run(order=2)
def test_login():
"""登入用例"""
print("登入步驟")
assert "abcd" in "abcdefg"
@pytest.mark.run(order=1)
def test_register():
"""註冊用例"""
print("註冊步驟")
assert True
@pytest.mark.run(order=4)
def test_shopping():
"""購物下單"""
print("購物流程")
assert True
@pytest.mark.run(order=3)
def test_cart():
"""購物車用例"""
print("購物車流程")
assert True
if __name__ == '__main__':
pytest.main()
"""
執行結果:
test_order.py::test_register PASSED [ 25%]註冊步驟
test_order.py::test_login PASSED [ 50%]登入步驟
test_order.py::test_cart PASSED [ 75%]購物車流程
test_order.py::test_shopping PASSED [100%]購物流程
============================== 4 passed in 0.06s ==============================
Process finished with exit code 0
"""