unittest同时支持参数化和生成html报告
最近在用python3.6+unittest+requests做自动化接口测试。发现一个问题,unittest中使用第3方插件parameterized进行参数化,再生成html报告时,运行就会失败。很奇怪,最终没有让这2个同时实现。
经过一段时间后,发现有2种方法;
1、用discover+测试报告
在run.py中,使用discover()方法找到要运行的测试用例,然后放到测试报告中:
1 import time 2 import unittest 3 from BeautifulReport import BeautifulReport 4 5 test_dir = './test_case' 6 discover = unittest.defaultTestLoader.discover(test_dir,pattern='*testcase.py') 7 8 if __name__ == '__main__': 9 now = time.strftime("%Y-%m-%d %H_%M_%S") 10 html_file = r'D:\report' 11 suite.addTest(ParametrizedTestCase.parametrize(WorkPlaceTestCase, 'test_b2_addplace')) # 测试用例加入到测试套件 12 runner = unittest.TextTestRunner() 13 BeautifulReport(discover).report(filename='测试报告' + now, description='测试', log_path=html_file) 14 runner.run(discover)
2、使用ParametrizedTestCase类
这个感觉绕了很大的弯,是最开始使用的。
百度到了一个人写的可参数化的ParametrizedTestCase类。再改动了一下,加上比较简单的list。虽然看起来很Low。但是最终目的还算是实现了。
接口测试用例的类如下:
1 import unittest 2 from pylibrary.PyLib import * 3 4 5 class ParametrizedTestCase(unittest.TestCase): #可参数化的类 6 """ TestCase classes that want to be parametrized should 7 inherit from this class. 8 """ 9 def __init__(self, methodName='runTest', param=None): 10 super(ParametrizedTestCase, self).__init__(methodName) 11 self.param = param 12 @staticmethod 13 def parametrize(testcase_klass,defName=None, param=None): #参数化方法 14 """ Create a suite containing all tests taken from the given 15 subclass, passing them the parameter 'param'. 16 """ 17 testloader = unittest.TestLoader() 18 testnames = testloader.getTestCaseNames(testcase_klass) 19 suite = unittest.TestSuite() 20 if defName !=None: 21 for name in testnames: 22 if name==defName: 23 suite.addTest(testcase_klass(name, param=param)) 24 else: 25 for name in testnames: 26 suite.addTest(testcase_klass(name, param=param)) 27 return suite 28 29 list = [('2018-09-26', '2018-09-26', '测试', '2001', 49, 'TotalCallNum'), 30 ('2018-09-26', '2018-09-26', '测试', '2001', 60, 'TotalCallAnswered'), 31 ('2018-09-26', '2018-09-26', '测试', '2001', 60, 'RingNum'), 32 ('2018-09-13', '2018-09-13', '测试', '2001', 4, 'TotalCallNum_Transfer')] 33 34 class Interface_report1(ParametrizedTestCase): 35 def test_Agreport1(self): #要被测试的用例 36 37 self.num = self.param[4] 38 self.report_num1 = PyLib().getAgReport(self.param[0],self.param[1],self.param[2],self.param[3]) 39 self.report_num=self.report_num1[0][self.param[5]] 40 self.assertEqual(self.num,self.report_num)
再用run.py调用上面的testcase
1 from interface.Interface_report1 import * 2 from BeautifulReport import BeautifulReport 3 4 5 6 if __name__ == '__main__': 7 8 now = time.strftime("%Y-%m-%d %H_%M_%S") 9 # # 构造测试集 10 # suite = unittest.TestSuite() 11 # suite.addTest(Interface_report1('test_Agreport1')) 12 # 13 htmlfile = 'D:\\Python_code\\report\\' 14 # fp = open(htmlfile, 'wb') 15 # runner = HTMLTestRunner(stream=fp, title='测试报告', description='用例执行情况') 16 # runner.run(suite) 17 # fp.close() 18 suite = unittest.TestSuite() 19 #suite.addTest(Interface_report1('test_Agreport1')) 20 for i in list: #使用list 21 suite.addTest(ParametrizedTestCase.parametrize(Interface_report1, 'test_Agreport1',param=i)) 22 23 BeautifulReport(suite).report(filename='测试报告'+now,description='测试报告',log_path=htmlfile)
最后运行就可以了,生成的报告用的beautifulreport。感觉还是比较好看的