Python自带一个单元测试框架,unittest模块,用它来做单元测试,它里面封装好了一些校验返回结果的方法和一些用例执行前的初始化操作
在说unittest之前,先说几个概念:
TestCase:测试用例
TestSuite:多个测试用例集合在一起
TestLoader:用来加载TestCase到TestSuite
TestRunner:执行测试用例,测试的结果保存到TestResult实例中,包括运行了多少测试用例,成功了多少,失败了多少等信息
import unittest class MyTest(unittest.TestCase): # 继承unittest.TestCase def tearDown(self): # 每个测试用例执行之后做操作 print('111') def setUp(self): # 每个测试用例执行之前做操作 print('22222') @classmethod def tearDownClass(self): # 必须使用 @ classmethod装饰器, 所有test运行完后运行一次 print('4444444') @classmethod def setUpClass(self): # 必须使用@classmethod 装饰器,所有test运行前运行一次 print('33333') def test_a_run(self): self.assertEqual(1, 1) # 测试用例 def test_b_run(self): self.assertEqual(2, 2) # 测试用例 if __name__ == '__main__': unittest.main()#运行所有的测试用例
下面是一些常用的断言,也就是校验结果
assertEqual(a, b) a == b assertNotEqual(a, b) a != b assertTrue(x) bool(x) is True assertFalse(x) bool(x) is False assertIsNone(x) x is None assertIsNotNone(x) x is not None assertIn(a, b) a in b assertNotIn(a, b) a not in b
HTMLTestRunner模块,可以生成测试报告,这个模块需要自己安装,使用执行测试用例就会生成一个HTML的测试报告,里面会有每个测试用例的执行结果,
import HTMLTestRunner import unittest class MyTest(unittest.TestCase):#继承unittest.TestCase def tearDown(self): #每个测试用例执行之后做操作 print('111') def setUp(self): #每个测试用例执行之前做操作 print(22222) def test_run(self): # self.assertEqual(1,1) self.assertIs(1,1) #测试用例 def test_run2(self): # self.assertEqual(1,1) self.assertIs(1,1) #测试用例 def test_run3(self): # self.assertEqual(1,1) self.assertIs(1,1) #测试用例 def test_run1(self): # self.assertEqual(1,1) self.assertIs(1,1) #测试用例 if __name__ == '__main__': test_suite = unittest.TestSuite()#创建一个测试集合 test_suite.addTest(MyTest('test_run1'))#测试套件中添加测试用例 #test_suite.addTest(unittest.makeSuite(MyTest))#使用makeSuite方法添加所有的测试方法 fp = open('res.html','wb')#打开一个保存结果的html文件 runner = HTMLTestRunner.HTMLTestRunner(stream=fp,title='api测试报告',description='测试情况') #生成执行用例的对象 runner.run(test_suite) #执行测试套件
如果我们有多个模块,每个模块下都写了很多Python文件,每个Python文件里面都有测试用例,那怎么把这个目录下的用例都执行呢,就是要先找到这个目录下的所有Python文件,然后找到里面的测试用例,逐个执行
import unittest,HTMLTestRunner suite = unittest.TestSuite()#创建测试套件 all_cases = unittest.defaultTestLoader.discover('.','test_*.py') #找到某个目录下所有的以test开头的Python文件里面的测试用例 for case in all_cases: suite.addTests(case)#把所有的测试用例添加进来 fp = open('res.html','wb') runner = HTMLTestRunner.HTMLTestRunner(stream=fp,title='all_tests',description='所有测试情况') runner.run(suite) #运行测试
我们在后续进行持续集成的时候,要让代码自动运行,就会用到Jenkins了,但是上面产生的测试报告都是HTML格式的,Jenkins不认识,就在Jenkins里面显示不出来。那就要生成Jenkins认识的测试报告,Jenkins认识XML格式的报告,那就产生XML格式的报告,这就需要新的模块,xmlrunner,安装直接pip install xmlrunner
import unittest import xmlrunner #导入这个模块 class My(unittest.TestCase): def test1(self,a,b,c): self.assertEqual(a+b,c) if __name__=='__main__': test_suite = unittest.TestSuite() test_suite.addTest(unittest.makeSuite(My)) runner = xmlrunner.XMLTestRunner(output='report')#指定报告放的目录 runner.run(test_suite)
运行之后,就会在report目录生成XML格式的测试报告了,还自动添加了日期