Python中有一个自带的单元测试框架是unittest模块,用它来做单元测试,它里面封装好了一些校验返回的结果方法和一些用例执行前的初始化操作。
在说unittest之前,先说几个概念:
- TestCase 也就是测试用例
- TestSuite 多个测试用例集合在一起,就是TestSuite
- TestLoader是用来加载TestCase到TestSuite中的
- TestRunner是来执行测试用例的,测试的结果会保存到TestResult实例中,包括运行了多少测试用例,成功了多少,失败了多少等信息
1. unittest的用法
下面写一个简单的单元测试用例:
1 import unittest2 def calc(a,b):3 return round(a/b,1)4 class TestCalc(unittest.TestCase):5 def test1(self): #测试用例 16 res = calc(1,2)7 self.assertEqual(0.5,res,'计算不正确') #预计结果与返回res比较,'计数不正确',不是必须的8 9 unittest.main() #仅用于查看结果,不能产生报告
注意:
1. 运行时,不要选择Run 'Unittests for ...'这是通过pycharm自带的运行方式,不会产生测试报告的。
2. 要点击菜单栏中的run...(alt + shift + F10) ,选当前py文件,以一个python文件来运行,或者在 Terminal 中运行
3. 在测试用例里面,函数名必须以test开头,否则不会被执行的。类名无所谓。
下面是一些常用的断言,也就是校验结果
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
为用例添加前置条件和用例的执行顺序
1 import unittest 2 class TestCalc(unittest.TestCase): 3 def setUp(self): 4 print('这是setup') 5 def tearDown(self): 6 print('这是teardown') 7 @classmethod 8 def tearDownClass(cls): 9 print('这是tearDownClass')10 @classmethod11 def setUpClass(cls):12 print('这是setUpClass')13 def testa(self):14 print('这是用例testa')15 def testb(self):16 print('这是用例testb')17 18 if __name__ == '__main__':19 unittest.main()
运行结果:
这是setUpClass这是setup这是用例testa这是teardown这是setup这是用例testb这是teardown这是tearDownClass..----------------------------------------------------------------------Ran 2 tests in 0.000sOK
总结:
- 在每一个测试用例前后执行def setup(self),def tearDown(self)
- 在所有用例运行前后执行def setUpClass(cls),def tearDownClass(cls)
- 用例执行顺序:按首字母排序的
2. 生成测试报告
1) HTMLTestRunner 生成报告
那如何生成一个测试报告呢,需要加入另外一个模块:HTMLTestRunner。
下载地址:http://tungwaiyip.info/software/HTMLTestRunner.html
下载HTMLTestRunner.py,放到python安装目录的lib下,使用执行测试用例就会生成一个html的测试报告,里面会有每个测试用例的执行结果,代码如下:
1 import unittest,HTMLTestRunner 2 def calc(a,b): 3 return round(a/b,1) 4 class TestCalc(unittest.TestCase): 5 def test1(self): 6 '''用例描述:计算a/b的正确性''' 7 res = calc(1,2) 8 self.assertEqual(0.5,res,'计算不正确') 9 def test2(self):10 '''用例描述:除数不能为0'''11 res = calc(1,0)12 self.assertIsNone(res) #判断是不是None,如果是None就通过13 14 suite = unittest.TestSuite() #定义了一个测试集合15 suite.addTest(unittest.makeSuite(TestCalc)) #把刚才写的用例加到测试集合,addTests用于py文件,addTest用于类16 f = open('test.html','wb')17 runner = HTMLTestRunner.HTMLTestRunner(f,title='测试用例标题',description='测试用例描述')18 runner.run(suite) #运行用例
生成的 test.html 测试报告如下所示:
2) BeautifulReport 生成报告
手动安装BeautifulReport
下载地址:https://coding.net/u/pengzhuopeng/p/PythonLearner/git/tree/master/%E5%B7%A5%E5%85%B7?public=true
切换到BeautifulReport目录下,执行:python setup.py install
1 import unittest 2 from BeautifulReport import BeautifulReport as bf 3 def calc(a,b): 4 return round(a/b,1) 5 class TestCalc(unittest.TestCase): 6 def test1(self): 7 '''用例描述:计算a/b的正确性''' 8 res = calc(1,2) 9 self.assertEqual(0.5,res,'计算不正确')10 def test2(self):11 '''用例描述:除数不能为0'''12 res = calc(1,0)13 self.assertIsNone(res) #判断是不是None,如果是None就通过14 15 suite = unittest.TestSuite() #定义了一个测试集合16 suite.addTest(unittest.makeSuite(TestCalc)) #把刚才写的用例加到测试集合,addTests用于py文件,addTest用于类17 report = bf(suite)18 report.report(filename='test1',description='必填参数,描述',log_path='.')19 #log_path、filename不是必填,filename不填默认生成文件名为“report.html”,log_path默认当前路径,log_path='.'表当前路径
生成的 test1.html 报告如下图所示