unittest單元測試框架
先貼一下unittest官網地址。unittest文檔開頭介紹了四個重要的概念:test fixture,test case, test suite, test runner。
test fixture
test fixture表示執行一個或多個測試所需的准備。怎么去理解這句話呢?比如我們執行一條創建文章的測試用例,但是如果我們調用創建文章的接口,需要我們進行登錄。那么我們可以把登錄作為一個test fixture。
test case
測試用例,這個不必多說,沒有測試用例就不能叫做接口測試了。
test suite
我們在做接口測試的時候,一般都是執行多條測試用例。這就有了test suite概念,簡單來說,就是把想要執行的測試用例進行組裝然后進行測試。
test runner
執行測試用例。
為了方便大家的理解,會用一個實例對上面四個概念進行解釋。請看如下代碼:
import unittest
class AddTest(unittest.TestCase):
def setUp(self):
print("在每個用例執行之前")
def tearDown(self):
print("在每個用例執行之后")
@classmethod
def setUpClass(cls):
print("在用例執行之前,只執行一次,優先於setUp")
@classmethod
def tearDownClass(cls):
print("所有用例運行之后只執行一次")
def add(self, a, b):
if type(a) == int and type(b) == int:
return a + b
else:
return "請輸入數字"
def test_add1(self):
self.assertEqual(self.add(2, 3), 5, "驗證加法")
def test_add2(self):
self.assertEqual(self.add(2, 4), 6, "驗證加法")
if __name__ == '__main__':
# unittest.main()
# test suite(構造測試集)
suite = unittest.TestSuite()
suite.addTest(AddTest("test_add1"))
suite.addTest(AddTest("test_add2"))
# test runner (執行測試)
runner = unittest.TextTestRunner()
runner.run(suite)
上面代碼輸出如下內容:
在用例執行之前,只執行一次,優先於setUp
在每個用例執行之前
在每個用例執行之后
在每個用例執行之前
在每個用例執行之后
所有用例運行之后只執行一次
我們來根據代碼拆解一下,看哪部分對應test fixture,test case, test suite, test runner。首先,在使用unittest單元測試框架之前,我們需要導包,我們先import unittest
,然后創建一個AddTest類,這個類繼承unittest.TestCase。然后我們創建一個add方法(注意:一般類中的函數我們稱作為方法),然后創建了2條測試用例test_add1,test_add2,注意!測試用例必須以test開頭!然后使用test fixture中setUp、tearDown、setUpClass 、tearDownClass。然后使用test suite把2條測試用例加進去,當然需要注意一點,用例執行是有順序的(按照 ASCII 碼的從小到大的順序),比如test_add1和test_add2,前面都是一樣的,但是最后1位1排在2前面,所以先執行1,最后使用test runner執行測試用例。到這里想必大家都已經明白。最后畫一張思維導圖,更方便大家的理解。
細心的人可以看到,測試用例中有一個assertEqual,這就是我們說比assert更好用的斷言,那么這些斷言有哪些呢?請看下面表格:
Method | Checks that |
---|---|
assertEqual(a, b) | a == b |
assertNotEqual(a, b) | a != b |
assertTrue(x) | bool(x) is True |
assertFalse(x) | bool(x) is False |
assertIs(a, b) | a is b |
assertIsNot(a, b) | a is not b |
assertIsNone(x) | x is None |
assertIsNotNone(x) | x is not None |
assertIn(a, b) | a in b |
assertNotIn(a, b) | a not in b |
assertIsInstance(a, b) | isinstance(a, b) |
assertNotIsInstance(a, b) | not isinstance(a, b) |
小結:本章內容只是簡單介紹了一下unittest的使用方法以及相關概念,unittest框架使用起來很簡單也很方便,建議大家多去官網學習,當然不管是UI自動化也好,還是接口自動化也好,如果使用Python實現,一般都不會繞過Unittest這個概念,希望大家可以熟練掌握。
歡迎關注微信公眾號:軟件測試汪。軟件測試交流群:809111560