单元测试unittest及报告生成(两种报告模板)
Python中有一个自带的单元测试框架是unittest模块,用它来做单元测试,它里面封装好了一些校验返回的结果方法和一些用例执行前的初始化操作。
在说unittest之前,先说几个概念:
TestCase 也就是测试用例
TestSuite 多个测试用例集合在一起,就是TestSuite
TestLoader是用来加载TestCase到TestSuite中的
TestRunner是来执行测试用例的,测试的结果会保存到TestResult实例中,包括运行了多少测试用例,成功了多少,失败了多少等信息
1.单元测试:
开发自己测自己写的代码;
2.导入模块unittest:
import unittest #导入unittest模块
import HTMLTestRunner #导入HTMLTestRunner 报告模板模块
from BeautifulReport import BeautifulReport #导入BeautifulReport 报告模板模块
3.运行一个简单的unittest:
import unittest #单元测试模块 class TestCalc(unittest.TestCase): def test1(self): #函数名要以test开头,否则不会被执行 self.assertEqual(1,1) def test2(self): self.assertEqual(1,2) unittest.main() #会运行当前python文件里面的所有测试用例
4.unittest单元测试的基本流程:
用例集/测试套件:存放测试用例的
①.先把所有的测试用例都放到用例集
②.运行这些测试用例
③.产生报告
代码:
一.生成报告模板HTMLTestRunner模块(比较丑且相对不好用)
注:1.安装并导入HTMLTestRunner 模块,该模块是可以生成报告的模块。
2.运行代码时,要以Run xx.py方式运行,不能以unittest方式运行,否则不会生成报告。
import unittest #单元测试模块 import HTMLTestRunner #用来生成报告的模块 class TestCalc(unittest.TestCase): def testcc(self): #函数名要以test开头,否则不会被执行 '''这是第一个测试用例''' #用例描述,在函数下,用三个单引号里面写用例描述 self.assertEqual(1,1) print('第一个用例') def testaa(self): '''这个是第二个测试用例''' self.assertEqual(1,2) print('第二个用例') def testdd(self): '''用例描述3''' print('第三个用例') def testbb(self): '''用例描述4''' print('第四个用例') suite = unittest.TestSuite() #定义一个测试集合 suite.addTest(unittest.makeSuite(TestCalc)) #把写的用例加进来(将TestCalc类)加进来 f = open('test.html','wb') #以二进制模式打开一个文件 runner = HTMLTestRunner.HTMLTestRunner(f,title='unittest用例标题',description='这是用例描述') runner.run(suite) #运行用例(用例集合)
在浏览器打开生成的test.html文件,HTMLTestRunner报告如图:
5.setup()/teardown()与setUpClass/tearDownClass。如图:
import unittest #单元测试模块 import HTMLTestRunner #用来生成报告的模块 class TestCalc(unittest.TestCase): def setUp(self): #每个用例运行之前运行的 print('setup是啥时候运行的') def tearDown(self): #每个用例运行之后运行的 print('teardown是啥时候运行的') @classmethod def setUpClass(cls): #在所有用例执行之前运行的 print('我是setUpclass,我位于所有用例的开始') @classmethod def tearDownClass(cls): #在所有用例都执行完之后运行的 print('我是tearDownClass,我位于多有用例运行的结束') def testcc(self): #函数名要以test开头,否则不会被执行 '''这是第一个测试用例''' #用例描述,在函数下,用三个单引号里面写用例描述 self.assertEqual(1,1) print('第一个用例') def testaa(self): '''这个是第二个测试用例''' self.assertEqual(1,1) print('第二个用例') def testdd(self): '''用例描述3''' print('第三个用例') def testbb(self): '''用例描述4''' print('第四个用例') unittest.main() #会运行当前python文件里面的所有测试用例
运行结果:
二.报告模板BeautifulReport(模板相对好用)
代码:
import unittest #单元测试模块 from BeautifulReport import BeautifulReport as bf #导入BeautifulReport模块,这个模块也是生成报告的模块,但是比HTMLTestRunner模板好看 class TestCalc(unittest.TestCase): def setUp(self): #每个用例运行之前运行的 print('setup是啥时候运行的') def tearDown(self): #每个用例运行之后运行的 print('teardown是啥时候运行的') @classmethod def setUpClass(cls): #在所有用例执行之前运行的 print('我是setUpclass,我位于所有用例的开始') @classmethod def tearDownClass(cls): #在所有用例都执行完之后运行的 print('我是tearDownClass,我位于多有用例运行的结束') def testcc(self): #函数名要以test开头,否则不会被执行 '''这是第一个测试用例''' #用例描述,在函数下,用三个单引号里面写用例描述 self.assertEqual(1,1) print('第一个用例') def testaa(self): '''这个是第二个测试用例''' self.assertEqual(1,1) print('第二个用例') def testdd(self): '''用例描述3''' print('第三个用例') def testbb(self): '''用例描述4''' print('第四个用例') suite = unittest.TestSuite() #定义一个测试集合 suite.addTest(unittest.makeSuite(TestCalc)) #把写的用例加进来(将TestCalc类)加进来 run = bf(suite) #实例化BeautifulReport模块 run.report(filename='test',description='这个描述参数是必填的')
浏览器查看生成的报告页面: