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。感觉还是比较好看的

 

posted @ 2018-10-10 10:16  Mollylin  阅读(988)  评论(0编辑  收藏  举报