xia的小窩

一起來coding和碼字吧

0%

python測試也是個大坑

偶然找到一個名叫 unittest 的套件,也就是單元測試用的,畢竟總不能一個一個給程式做測試。

unittest是原本就裝在 python 裡面的,所以無須另外下載。

現在直接先看一個小程式。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import unittest

def PlusNumber(a, b):
return a + b

# 測試類別,可以繼承並定義測試方法
class ForMyTest(unittest.TestCase):
def test_ReturnMyName(self):
name = "xia"
self.assertEqual(list(name), ['x', 'i', 'a'])
with self.assertRaises(TypeError):
print("check")

def test_number_add(self):
answer = PlusNumber(1, 3)
# 檢查返回值
self.assertEqual(answer, 4)



if __name__ == '__main':
unittest.main()

接著在底下輸入。

1
python -m unittest test.py

會出現以下

這邊我沒有給他一個venv,沒有直接開一個虛擬環境,如果要開的話請輸入

1
python3 -m venv [資料夾]

windows:

1
[資料夾]\Scripts\activate

macOS/Linux:

1
source myenv/bin/activate

再來回到 assert這個單詞,這個字在pathon之中被譯為斷言,用來確認滿足是否符合表達式的條件,如無則直接觸發異常,不會執行到後面的程式碼。

上面的函式只是簡單地進行相加的步驟,所以應該可以很簡單的看出來沒有TypeError

如果需要顯示命令列

1
python -m unittest -h

更多的細節則使用

1
2
3
4
python -m unittest -v [檔名]

...
// test_number_add (test.ForMyTest) ... ok

在 unittest 的命名規範裡,test_ 開頭的測試會被自動運行。
如果要跳過測試呢?

1
2
3
@unittest.skip("demonstrating skipping")
def test_ReturnMyName(self):
# ...

結果會呈現以下

還有跳過裝飾器的

1
@unittest.skip(reason)

裡頭的api還真的蠻多的,到目前的3.11來說坑已經不算少了,後面如果需要的話可以點擊這裡去做更多的查閱。


不過更多的,大家應該都是使用 pytest 或是 vscode 內建的方式,我個人是使用後者,畢竟對我來說比較方便一點。

這裡先提一下 pytest ,在網路上有看到官網的引導,那就隨意的撰寫一個小程式給他運行吧。

安裝

1
pip install pytest

接下來就隨便寫個幾行進去

1
2
def test_passing():
assert ['x', 'i', 'a'] == ['x', 'i', 'a']

運行

1
pytest test_module.py -v

結果

如果要跳過測試

1
@pytest.mark.skip(reason)

當然還有條件

1
2
@pytest.mark.skipif(reason)
# @pytest.mark.skipif(Module.__version__ < '0.1.0', reason = '不支援')

查閱資料