本文先通過基本概念的簡單介紹,再以一個簡單的Python項目為例,講解在工程實踐中如何通過unittest編寫測試用例,同時也簡單介紹了unittest的一些常用寫法。
什么是單元測試?單元測試(unit testing),是指對軟件中的最小可測試單元進行檢查和驗證。對于Python來說,最小可測試單元就是函數或者方法。
Python支持的測試庫有pytest 、unittest等,這篇文件主要介紹如何使用Python內置的標準庫unittest編寫單元測試用例。
項目結構
首先需要介紹一下整個項目的一個目錄結構:
.
├── example.py # 入口文件
├── tests # 測試文件
│ ├── __init__.py
│ └── test_vector.py
└── vector # 所有核心代碼
├── __init__.py
└── vector.py
項目代碼如下:
# vector/__init__.py
from .vector import Vector
# vector/vector.py
class Vector:
def __init__(self, x, y):
if isinstance(x, (int, float)) and \
isinstance(x, (int, float)):
self.x = x
self.y = y
else:
raise ValueError("not a number")
編寫第一個測試用例
我們在'tests'目錄下,以'test_'開頭創建一個Python文件,例如項目中的'test_vector.py'文件,我們后面所有的測試代碼都在里面編寫運行。
通過unittest編寫測試用例,需要繼承unittest.TestCase創建一個類,類名建議以'Test'開頭或結尾,而類方法則一定要以'test_'開頭。
下面的測試用例分別測試了x是否等于1,y是否等于2:
import unittest
from vector import Vector
class TestVector(unittest.TestCase):
def test_init(self):
v = Vector(1, 2)
self.assertEqual(v.x, 1)
self.assertTrue(v.y == 2)
編寫完成后只需要在項目根目錄下輸入以下命令:
python -m unittest
Python就會在你的目錄中自動尋找測試代碼,并且自動運行測試用例,運行結果如下:
.
----------------------------------------------------------------------
Ran 1 test in 0.000s
OK
具體提供哪些測試方法,我們可以參考一下unittest[1]官方文檔。
從上面示例可以看到,官方提供了assertTrue方法,既然如此,為什么我們不直接全部使用這個方法就好了?其他方法還有什么作用呢?
下面對assertEqual和assertTrue做一個簡單對比,來說明其他方法的意義。
先看看assertEqual如果測試不通過,會報什么錯誤:
import unittest
from vector import Vector
class TestVector(unittest.TestCase):
def test_init(self):
v = Vector(1, 2)
self.assertEqual(v.x, 0)
# self.assertTrue(v.x == 0)
測試結果:
F
======================================================================
FAIL: test_init (tests.test_vector.TestVector)
----------------------------------------------------------------------
Traceback (most recent call last):
File "/Users/xuzhanhong/Development/Git/PythonNotes/測試/tests/test_vector.py", line 8, in test_init
self.assertEqual(v.x, 0)
AssertionError: 1 != 0
----------------------------------------------------------------------
Ran 1 test in 0.000s
FAILED (failures=1)
我們看報錯就知道v.x是1,不等于0。
如果我們是使用assertTrue方法,再看一下報錯:
F
======================================================================
FAIL: test_init (tests.test_vector.TestVector)
----------------------------------------------------------------------
Traceback (most recent call last):
File "/Users/xuzhanhong/Development/Git/PythonNotes/測試/tests/test_vector.py", line 9, in test_init
self.assertTrue(v.x == 0)
AssertionError: False is not true
----------------------------------------------------------------------
Ran 1 test in 0.000s
FAILED (failures=1)
那我們只能得到False is not true的錯誤提示,并不知道為什么上面的等式是False。
所以說其他方法也有自己的意義,而不是直接梭哈assertTrue方法就好了。
其他常見測試需求
在測試前后分別執行一些操作
如果想在測試類運行測試之前跟運行結束之后進行一些操作的話,就需要用到setUpClass和tearDownClass:
import unittest
from vector import Vector
class TestVector(unittest.TestCase):
@classmethod
def setUpClass(cls):
print('start')
@classmethod
def tearDownClass(cls):
print('end')
def test_init(self):
v = Vector(1, 2)
self.assertEqual(v.x, 1)
self.assertTrue(v.y == 2)
這樣在運行所有測試方法的時候都會自動執行setUpClass和tearDownClass方法了:
start
.end
----------------------------------------------------------------------
Ran 1 test in 0.000s
OK
跳過某些情況
還有一個很常見的需求就是希望我的測試在某些情況下不運行,這種時候就需要用到unittest.skipIf裝飾器。
這個裝飾器傳入兩個參數,第一個參數是一個boolean,當條件成立測試不運行,第二個參數則是提示信息。
下面的示例表示這個測試不在Python3.8以下版本運行:
@unittest.skipIf(sys.version_info < (3, 8),
"Only support 3.8+")
def test_init(self):
v = Vector(1, 2)
self.assertEqual(v.x, 1)
self.assertTrue(v.y == 2)
由于我的Python版本是3.7,所以運行時會顯示跳過:
start
send
----------------------------------------------------------------------
Ran 1 test in 0.000s
OK (skipped=1)
同理,我們可以編寫其他的跳過條件,例如跳過Windows系統,跳過某些變量值等等。
小結
本文主要內容小結:
單元測試基礎概念。
Python工程實踐項目結構。
如何使用unittest編寫運行一個測試用例。
unittest常用寫法。
以上就是“python單元測試unittest入門初探教程”的詳細內容,想要了解更多Python教程歡迎持續關注編程學習網。
掃碼二維碼 獲取免費視頻學習資料
- 本文固定鏈接: http://www.stbrigidsathleticclub.com/post/11208/
- 轉載請注明:轉載必須在正文中標注并保留原文鏈接
- 掃碼: 掃上方二維碼獲取免費視頻資料
查 看2022高級編程視頻教程免費獲取