unittest框架(二)单元测试及测试报告
如果要自测代码,可使用单元测试,需要导入unittest模块,import unittest即可。
例如,自测一个计算连个数相除的函数,代码如下:
import unittest def calc(a,b): return round(a/b,1) #返回a除以b的结果,保留1位小数 class TestCacl(unittest.TestCase): def test1(self): #测试用例要以test开头,不然不会被执行 res = calc(1,2) self.assertEqual(0.5,res,'计算不正确') #判断实际结果是不是等于预期结果 def test2(self): res = calc(1,0) self.assertIsNone(res,'原因,写不写都可以') #判断返回值是不是None,如果是None就通过了 unittest.main() #会运行当前python文件里面的所有测试用例
在测试完成后,需要获取测试结果,那么此时就需要产生测试报告,下面介绍两种产生测试报告的模块,一个是HTMLTestRunner,另一个是BeautifulReport。
第一种HTMLTestRunner需要打开文件,而且生成的报告相对于BeautifulReport模块产生报告来说,没那么美观,所以,在工作中一般使用好看的报告模块。
import unittest import HTMLTestRunner from BeautifulReport import BeautifulReport as bf class TestCalc(unittest.TestCase): def setUp(self): #每条用例运行之前自动运行 print('我是setUp,是啥时候运行的') def tearDown(self): #每个用例运行之后自动运行的,不需要去调用 print('tearDown是啥时候运行的') @classmethod #类方法 def setUpClass(self): #所有用例运行之前运行的 print('setUpClass是啥时候运行的') @classmethod def tearDownClass(self): #所有用例运行完成之后运行的 print('tearDownClass是啥时候运行的') def testh(self): '''用例注释''' print('testh') self.assertEqual(1,1) def testb(self): #用例的运行顺序是按照测试用例名称的字母顺序来运行的 '''用例注释''' print('testb') self.assertEqual(1,2) def testa(self): print('testa') self.assertEqual(1,1) def testc(self): print('testc') self.assertEqual(1,2) #测试套件(用例集),也就是存放测试用例的 #1、先把所有的测试用例都放到用例集里面 #2、运行这些测试用例 #3、产生报告 suite = unittest.TestSuite() #测试集合 suite.addTest( unittest.makeSuite(TestCalc)) #把刚才写的用例加进来 f = open('test.html','wb') runner = HTMLTestRunner.HTMLTestRunner(f,title = '双鱼座用例标题',description='这是用例描述') runner.run(suite) #运行用例
下面介绍好看的测试报告怎么产生的吧。。。。
import unittest import HTMLTestRunner from BeautifulReport import BeautifulReport as bf class TestCalc(unittest.TestCase): def testb(self): '''用例注释''' print('testb') self.assertEqual(1,2) def testa(self): print('testa') self.assertEqual(1,1) def testc(self): print('testc') self.assertEqual(1,2) suite = unittest.TestSuite() #测试集合 suite.addTest( unittest.makeSuite(TestCalc)) #把刚才写的用例加进来 run = bf(suite) run.report(filename='test',description='这是描述信息,必须写') #log_path是默认在当前目录下,可以不写,如果要生成在指定目录下就可以写上路径