pytest 是整合了 setup/teardown, fixture 等等做測試常用的功能的一個測試框架, 本文會將 pytest 作為api test 來使用
奉上官網:
https://docs.pytest.org/en/7.1.x/
下面這篇寫得很詳細, 如果有基礎的大大也滿建議直接跟著做一遍
基於 Pytest 框架的自動化測試開發實踐 (萬字長文入門篇)
https://iter01.com/504335.html
$ pip3 install pytest
$ pytest --version
如果有版本跑出來表示安裝成功, 沒有的話可能要debug一下
$ cat test_first.py //這邊意思是建立一個 test_first.py 的檔案, 用指令偷懶一下xD
內容輸入
def test_first_testcase():
print("hihihihi")
assert 1 == 1
$ pytest
$ pytest test_first.py
$ pytest test_first.py::test_first_testcase
以上三個指令都可以執行成功, 預期結果會 1個pass, 但這時候不會看到 hihihihi 的顯示, 因為預設通過就不會顯示print的東西, 錯誤時就會顯示, 所以可以使用他提供的變數
$ pytest test_first.py --capture=no
這樣就把顯示都印出來, 方便debug
pytest runtime(就是pytest程式本身), 他會認識 test_abc.py這樣前綴帶test的檔案, 並且function名稱也要前綴test, 所以 def test_first.py 也是為了讓 pytest 能抓得到才這樣取名
$ cat Makefile
加入以下內容
run:
pytest test_first.py::test_first_testcase --capture=no
$ make run
這時候應該會得到相同的實行結果, 但是指令變短了很多, 非常方便推薦使用
cat test_second.py
import pytest
@pytest.fixture()
def my_data():
return "dataset"
class MyTest2:
def test_second_testcase(self, my_data):
print("data: ", my_data)
assert my_data == "dataset"
$ pytest test_second.py::MyTest2::test_second_testcase --capture=no
預期結果pass, 並會看到 data: dataset
說明:
將上方 fixture 區塊內的程式碼 fixture 部份拆分到設定檔 conftest.py 內
cat conftest.py
import pytest
@pytest.fixture()
def my_data():
return "dataset"
剛剛的 fixture 不能傳入參數(因為是資料), 所以這次目標把 fixture做成function
cat test_fourth.py
import pytest
@pytest.fixture()
def get_user_id():
def fn(user_id):
return user_id
return fn
class MyTest4:
def test_fourth_testcase(self, get_user_id):
user_id = get_user_id("jackie")
assert user_id == "jackie"
$ pytest test_fourth.py
預期結果 pass
說明:
傳入參數 get_user_id 就是 這個function的指標(記憶體位置)
所以當我們做 function call 並傳入 "jackie" 的時候, function 才真正執行並return回 "jackie"
自己工作上的程式大量使用這個結構去完成一些測試案例, 不確定是不是 best practice, 但自己覺得滿好用的
makefile 加個 phony 比較好。
test 應該會用 test 當 phony 吧
謝謝大大幫補充, 我有補在0x05 Makefile那邊, 非常感謝^^