python的unittest模块
- 2019 年 11 月 5 日
- 笔记
unittest 原名为 PyUnit,是由 java 的 JUnit 衍生而来
unittest库提供了test cases, test suites, test fixtures,test runner。
- test cases 通过继承TestCase类,创建一个test或者多个test
- test suites 测试套件,相当于test的容器
- test fixtures 通常为setup + test case + teardown结构
- test runner 执行测试用例tests或suit,可以指定执行方式

整体结构
待测试的类:
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() #默认按照字母和数字顺序执行,等同于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默认是按照字母和数字的顺序运行,倘若需要按照我们指定的顺序执行,可使用
suit.addTest()
的方式去指定 - setUp()、tearDown()会在每个测试用例(test开头)之前和之后执行
- setUpClass(cls)、tearDownClass(cls)仅在用例之前和之后各执行1次,与上述的setUp()、tearDown()不同
- 使用pycharm IDE运行unittest文件,不管是默认的用例执行顺序,还是指定的用例执行顺序,用例执行结果均为默认的顺序,即按照字母和数字的顺序执行。这算是pycharm的一个小小bug,具体做法:进入运行配置界面,在Python 下手动创建指定执行的py文件,而不是Python tests下