API自动化测试笔记(三):应用多线程+合并测试报告

(一)说明

    说明在API自动化如何使用多线程去执行测试用例,合并测试报告。

    不同测试框架有不同的地方,这里以unittest框架+BeautifulReport为例进行说明。

    步骤大概分为以下几步:

     1、获取所有测试套件。以[(测试套件1,0,),(测试套件, 1,).....]的格式返回

     2、应用concurrent.futures.ThreadPoolExecutor  将第一步的测试套件传给我们执行测试的方法,多线程并发执行用例,将测试报告放到临时目录下。

     3、将临时目录下的测试报告合并为一份测试报告

(二)获得测试套件、执行测试代码(仅供参考)

仅供参考,代码本身就不是完整的。

 1 #!/usr/bin/python
 2 # -*- coding: utf-8 -*-
 3 
 4 from unittest import defaultTestLoader
 5 from common.general import General
 6 from BeautifulReport import BeautifulReport
 7 import concurrent.futures
 8 
 9 
10 class RunTestTool():
11 
12     def __init__(self, temp_report_path, report_path, report_name="report_new.html"):
13         """
14         运行测试公共组件
15         :param temp_report_path: 测试报告临时存放目录(使用多线程生成的测试报告存放目录)
16         :param report_path: 测试报告路径
17         :param report_name: 测试报告文件名称
18         """
19         self.project_path = General.get_project_path()  # 获取工程路径
20         self.temp_report_path = '{}{}'.format(self.project_path, temp_report_path)
21 
22     def get_all_test_suit(self, test_case_path,description="测试报告", pattern='*_test.py'):
23         """
24         返回目录及子目录下的所有测试用例
25         :param description: 测试报告描述
26         :param test_case_path: 测试用例目录,接受list\tuple
27         :param pattern: 匹配测试用例文件的正则表达式
28         :return:
29         """
30         all_test_suit = []
31         test_suit = defaultTestLoader.discover(start_dir=test_case_path[0],
32                                                pattern=pattern,
33                                                top_level_dir=None)
34         if len(test_case_path) > 1:
35             for case_path in test_case_path[1:]:
36                 path = "{}{}".format(self.project_path, case_path)
37                 suit = defaultTestLoader.discover(start_dir=path,
38                                                   pattern=pattern,
39                                                   top_level_dir=path)
40                 test_suit.addTest(suit)
41         num = 0
42         for i in test_suit:
43             if len(list(i)) != 0:
44                 all_test_suit.append((i, num,description))
45                 num += 1
46         return all_test_suit
47 
48     def run_test(self, test_suit):
49         description = test_suit[2]
50         result = BeautifulReport(test_suit[0])
51         result.report(filename='report{}.html'.format(test_suit[1]),
52                       description=description,
53                       report_dir=self.temp_report_path)
54 
55 
56 test_case_path_list = ["目录1",'目录2']
57 temp_report_path = ""  # 测试报告临时目录
58 report_path = "" # 测试报告目录
59 rt = RunTestTool(temp_report_path=temp_report_path, report_path=report_path, )
60 test_suit = rt.get_all_test_suit(test_case_path=test_case_path_list,
61                                      description="描述11",
62                                      pattern="*_test.py")
63 with concurrent.futures.ThreadPoolExecutor(max_workers=5) as executor:   # 多线程执行用例
64         executor.map(rt.run_test, test_suit)

(三)合并测试报告

     代码就不提供了,提供一个思路,会正则表达式应该很容易实现这个功能。

      1、看下BeautifulReport库生成的测试报告,会发现测试结果都放在这个变量里面 var resultData。

      2、 这样我们可以使用正则表达式将每一个临时测试报告中的resultData的值提取出来

       3、然后合并得到最终的结果,再序列化后替换进HTML报告中即可。

 

 

代码只截取了部分。

 

posted @ 2020-04-29 23:08  free赖权华  阅读(756)  评论(0编辑  收藏  举报