文章目錄
-
- Pytest簡介
- Pytest安裝指令
- Pytest編寫規則
- 項目結構目錄
- 執行測試方法
- 常見指令參數
- Pytest插件使用
-
- Pytest-ordering
- 參考連結
Pytest簡介
Pytest是一個易用、強大、靈活的功能測試架構,并且相容unittest和nose的測試用例。
- 易用: 用例編寫簡單, 斷言友善
- 強大: 全能的mark, 強大的fixtures
- 靈活: 靈活的執行控制及豐富的插件
Pytest安裝指令
pip install pytest
Pytest編寫規則
- 測試檔案以test_開頭,或以_test結尾
- 測試類以Test開頭,并且不能帶有 init 方法
- 測試函數以test_開頭
- 斷言使用python自帶的assert
項目結構目錄
假設我的項目結構如下圖所示,在項目目錄下專門建立了一個test檔案夾,裡面存放的都是與測試相關的檔案。
├── my_project
├── src
├── main.py
└── test
├── pytest.ini
├── test_1.py
└── test_2.py
其中,
pytest.ini
為pytest的配置檔案,名稱是固定的不能随便更改,假設配置檔案如下,這裡我隻是簡單配置了下标簽mark,後面會使用到mark:
[pytest]
markers =
mo1: module 1
假設在
main.py
中實作了一個非常簡單的方法:
import math
def func(x: int, y: int):
return math.pow(x, y)
然後在測試檔案中調用該方法,進行測試(在這裡去實作自己需要測試的方法),假設
test_1.py
為(判斷結果是否正确,主要是使用assert語句):
import pytest
from main import func
@pytest.mark.mo1
def test_interface1():
assert func(1, 1) == 1
@pytest.mark.mo1
def test_interface2():
assert func(2, 1) == 2
def test_interface3():
assert func(2, 2) == 4
注意,其中有些函數上添加了
@pytest.mark.mo1
裝飾器,
mo1
是我們在
ini
檔案中提前聲明了的,後面可以指定去執行哪些标簽mark下的測試方法。
執行測試方法
在項目根目錄打開系統終端
- 執行test檔案夾下所有測試檔案
pytest -v ./test/
- 執行指定測試檔案
pytest -v ./test/test_1.py
- 執行指定測試檔案指定方法
pytest -v ./test/test_1.py::test_interface1
- 執行指定标簽mark下的測試方法(這裡就測試之前标注的
标簽下的方法)mo1
pytest -v -m 'mo1' ./test/
通過終端輸出可以看到,一共有6個測試方法,但屬于
mo1
标簽的隻有2項,并僅測試這兩項方法。
常見指令參數
-
表示輸出更加詳細的測試資訊-v
-
表示一旦遇到測試失敗就立即退出(預設情況是會執行所有測試樣例的,無論是否有測試失敗的情況)-x
-
為安靜模式,測試過程中不會輸出測試環境以及測試進度等資訊,隻傳回測試結果-q
-
列印測試函數中的-s
輸出,預設是不列印的print
-
僅執行指令标簽mark下的測試方法-m
更多指令參數可檢視pytest的幫助文檔:
pytest -h
對于常用的參數指令可以直接寫在
pytest.ini
檔案的
addopts
中,這樣就不需要手動輸入了。
[pytest]
addopts = -v
markers =
mo1: module 1
Pytest插件使用
Pytest-ordering
有時在測試代碼中可能需要按照一定的順序去執行測試代碼,此時可以使用
pytest-ordering
包來控制執行的順序。
- 安裝
pytest-ordering
pip install pytest-ordering
- 在測試代碼中加上裝飾器
,其中order代表着執行順序,數字越小執行優先級越高。@pytest.mark.run(order=1)
import pytest
from main import func
@pytest.mark.run(order=1)
def test_interface1():
print("test1")
assert func(1, 1) == 1
@pytest.mark.run(order=3)
def test_interface2():
print("test2")
assert func(2, 1) == 2
@pytest.mark.run(order=2)
def test_interface3():
print("test3")
assert func(2, 2) == 4
- 再次執行測試程式
pytest -vs ./test/test_1.py
通過終端的輸出,可以發現執行的順序是按照我們給定的
order
順序來執行的。pytest -vs ./test/test_1.py
參考連結
Pytest - 使用介紹
Pytest基礎使用教程
pytest文檔18-配置檔案pytest.ini
Pytest系列 - pytest-ordering用例的執行順序