unittest 原名為 PyUnit,是由 java 的 JUnit 衍生而來
unittest庫提供了test cases, test suites, test fixtures,test runner。
- test cases 通過繼承TestCase類,創(chuàng)建一個test或者多個test
- test suites 測試套件,相當于test的容器
- test fixtures 通常為setup + test case + teardown結(jié)構(gòu)
- test runner 執(zhí)行測試用例tests或suit,可以指定執(zhí)行方式
整體結(jié)構(gòu)
待測試的類:
class Count:
def __init__(self,a,b):
self.a = a
self.b = b
def add(self):
return self.a+self.b
示例1:
import unittest
class TestDemo(unittest.TestCase):
def setUp(self):
print("setUp")
def test_add(self):
z = Count(2,3)
self.assertEqual(z.add(),5)
def test_invid_add(self):
z = Count(2, 3)
self.assertNotEqual(z.add(),6)
def tearDown(self):
print("tearDown")
if __name__=="__main__":
suit=unittest.TestSuite()#在pycharm中,手動修改以一般python文件方式去運行
suit.addTest(TestDemo("test_invid_add"))
suit.addTest(TestDemo("test_add"))
runner=unittest.TextTestRunner()
runner.run(suit)
# unittest.main() #默認按照字母和數(shù)字順序執(zhí)行,等同于unittest.makeSuite(test)
示例2:
import unittest
lass TestDemo(unittest.TestCase):
@classmethod
def setUpClass(cls):
print("setUpClass")
def test_add(self):
print("test_add")
z = Count(2,3)
self.assertEqual(z.add(),5)
def test_invid_add(self):
print("test_invid_add")
z = Count(2, 3)
self.assertNotEqual(z.add(),6)
@classmethod
def tearDownClass(cls):
print("tearDownClass")
if __name__=="__main__":
suit=unittest.TestSuite()
suit.addTest(TestDemo("test_time"))
suit.addTest(TestDemo("test_add"))
suit.addTest(TestDemo("test_invid_add"))
runner=unittest.TextTestRunner()
runner.run(suit)
從以上2個示例可知道:
- unittest默認是按照字母和數(shù)字的順序運行,倘若需要按照我們指定的順序執(zhí)行,可使用
suit.addTest()
的方式去指定 - setUp()、tearDown()會在每個測試用例(test開頭)之前和之后執(zhí)行
- setUpClass(cls)、tearDownClass(cls)僅在用例之前和之后各執(zhí)行1次,與上述的setUp()、tearDown()不同
- 使用pycharm IDE運行unittest文件,不管是默認的用例執(zhí)行順序,還是指定的用例執(zhí)行順序,用例執(zhí)行結(jié)果均為默認的順序,即按照字母和數(shù)字的順序執(zhí)行。這算是pycharm的一個小小bug,具體做法:進入運行配置界面,在Python 下手動創(chuàng)建指定執(zhí)行的py文件,而不是Python tests下