Python中有一个自带的单元测试框架是unittest模块,用它来做单元测试,它里面封装好了一些校验返回的结果方法和一些用例执行前的初始化操作,概念见下:
- TestCase 也就是测试用例
- TestSuite 多个测试用例集合在一起,就是TestSuite
- TestLoader是用来加载TestCase到TestSuite中的
- TestRunner是来执行测试用例的,测试的结果会保存到TestResult实例中,包括运行了多少测试用例,成功了多少,失败了多少等
import unittest class MyTest(unittest.TestCase): @classmethod def setUpClass(cls): print('什么时候运行我呢,我是setUpClass') #这个类下面所有用例运行之前先运行的 @classmethod def tearDownClass(cls): print('什么时候运行我呢,我是tearDownClass') #这个类下面所有用例运行完之后运行的 def setUp(self): print('每个用例运行之前都会先运行我') def tearDown(self): print('每个用例运行之后都会再运行我') def test_ggy(self): self.assertEqual(1,1) print('第一条') def test_zyl(self): print('第二条用例') self.assertEqual(1,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
三,生成html格式报告,需要安装另一个模块:pip install HTMLTestRunner
import unittest import HTMLTestRunner class My(unittest.TestCase):#继承unittest.TestCase def testa(self): '''测试哈哈''' self.assertEqual(1,1) def test_gy(self): self.assertEqual('a','a') if __name__=='__main__': suite=unittest.TestSuite()#创建一个空的测试集合 suite.addTest(My('testa'))#添加某个测试用例到集合中 suite.addTest(My('test_gy')) fw=open('test_new.html','wb')#打开一个保存结果的html文件 runner=HTMLTestRunner.HTMLTestRunner(stream=fw,title='niuniuTEST',description='这里是描述信息')#生成执行用例的对象 runner.run(suite)#运行测试套件
四,生成xml格式报告,实际工作中会跟jenkins做持续集成,需要生成xml格式报告,才能在jenkins中查看,又需要安装另一个新的模块了:pip install xmlrunner
import unittest import xmlrunner class My(unittest.TestCase): def testa(self): '''测试哈哈''' self.assertEqual(1,1) def test_gy(self): self.assertEqual('a','a') class My2(unittest.TestCase): def testb(self): self.assertEqual(1,1) def test2(self): '''TEST测试未通过''' self.assertEqual(1,2) if __name__=='__main__': suite=unittest.TestSuite() suite.addTest(unittest.makeSuite(My))#使用makeSuite方法添加所有的测试用例到套件中 suite.addTest(unittest.makeSuite(My2)) runner2=xmlrunner.XMLTestRunner(output='report')#指定报告存放的目录为report runner2.run(suite)
生成测试报告存在在report下,每一个类,生成一个报告,并且自动加上了时间戳
五,实际工作中,会有多个模块,为了分类测试每个模块,会写多个python文件,每个文件中包含多个测试用例,那么怎么把这个目录下所有用例都执行了呢,找到目录下所有python文件,然后再找里面的测试case,逐一执行
import HTMLTestRunner import unittest suite=unittest.TestSuite()#定义测试集合 all_case=unittest.defaultTestLoader.discover( r'D: iuniu2018_codingday11AUTOcase','p*.py')#找到case下所有.py文件 for case in all_case: print('case...',case) suite.addTest(case) fw=open('report.html','wb') runner=HTMLTestRunner.HTMLTestRunner(stream=fw,title='多个文件运行') runner.run(suite)