首页 > 系统相关 >python3 unittest+BeautifulReport单个进程输出多个测试报告

python3 unittest+BeautifulReport单个进程输出多个测试报告

时间:2024-07-31 09:17:18浏览次数:10  
标签:测试报告 testsuit unittest filename interface result BeautifulReport name

最近一个项目中需要由于输出的案例内容非常多(上万条),导致BeautifulReport输出的报告内容非常大(几百兆)。浏览器无法正常处理这么大的测试报告,就算打开了,也不方便阅读和处理,因此需要将报告分成多个输出。

经修改代码,发现单个进程内输出多个测试报告出现问题:第一个测试报告能正常数据对应加入到unittest.testSuite的中的案例,但是后面每一个报告会输出前面所有报告的案例。

如果进行多进程改造的话改造量又比较大,因此还是采用的单进程多线程方案。

经排查发现是BeautifulReport中用于存放测试结果的变量FIELDS是一个全局变量,因此就算新建多个BeautifulReport的实例也没办法正常输出每个实例中unittest.testSuite的报告内容,需修改BeautifulReport中关于FIELDS变量的使用。

结合unittest和BeautifulReport测试api接口的的使用代码如下:

 1 #!/usr/bin/python
 2 import os,sys
 3 from concurrent.futures import ThreadPoolExecutor, ProcessPoolExecutor, as_completed
 4 from multiprocessing import Process, Lock, Queue
 5 import unittest
 6 import time
 7 import  copy
 8 sys.path.append(r'')
 9 
10 from BeautifulReport import BeautifulReport
11 
12 def output_report(testsuit, filename, interface_name):
13     try:
14         log.info(f"output_report filename:{filename} interface_name:{interface_name}")
15         now = time.strftime("%Y-%m-%d_%H_%M_%S")
16         result = BeautifulReport(testsuit)
17         result.report(filename=now + "_" + filename + f"_{interface_name}" +'_测试报告.html', description='测试报告', log_path='../report')
18 
19         log.info(f"output_report filename:{filename} interface_name:{interface_name} over")
20         print(f"******output_report filename:{filename} interface_name:{interface_name} over******")
21 
22         return {'result':True}
23     except Exception as e:
24         print(f"output_report filename:{filename} interface_name:{interface_name} exception! error_info:{e}")
25         return {'result':False, 'interface_name':interface_name, 'error_info':e}
26 
27 def demo_run(cases):
28     #省略一些准备代码
29     #......
30     
31     #多线程执行api接口测试任务
32     with ThreadPoolExecutor(max_workers=thread_num) as ts:
33         for case in cases:
34             if len(case['req']) == 1 and len(case['file_rsp']) != 1:
35                 log.error(f"case_id:{case['TestCaseID']} file_rsp len:{len(case['file_rsp'])} != 1 error!")
36                 continue
37             task.append(ts.submit(test.send_request, api, case))
38 
39     #收集任务返回结果
40     result_msg_list = [future.result() for future in as_completed(task)]
41 
42     #将执行结果加入到testsuit中
43     #todo:输出报告如果太大内容太多导致输出时间长,则需要改造为多线程处理
44     test_suit_dict = {}
45     result_msg_list.sort(key=lambda x:x["TestCaseID"])
46     for result_msg in result_msg_list:
47         interface_name = result_msg['interface_name']
48         log.info(f"TestCaseID:{result_msg['TestCaseID']} interface_name:{interface_name} func_name:{result_msg['func_name']}")
49 
50         if interface_name in test_suit_dict:
51             testsuit = test_suit_dict[interface_name]
52             testsuit.addTest(ParametrizedTestCase.parametrize(Test_Cash_Order_Api, "test_case_ATP", param=(result_msg,key)))
53         else:
54             testsuit = unittest.TestSuite()
55             test_suit_dict[interface_name] = testsuit
56             testsuit.addTest(ParametrizedTestCase.parametrize(Test_Cash_Order_Api, "test_case_ATP", param=(result_msg,key)))
57 
58     #检查输出报告目录是否存在
59     if os.path.exists("../report") != True:
60         os.makedirs("../report")
61 
62     #BeautifulReport输出testsuit中的比对结果
63     #注意这里输出多个测试报告需改造Beautifulreport源码中存放测试结果的FIELDS的使用,否则无法正常输出多个测试报告(每个测试报告会输出前面加入的测试集的结果)
64     #因为Beautifulreport源码中用的FIELDS变量是个全局变量,单个进程中加入到FIELDS中的测试结果会不断累计。需要将FIELDS变为类的成员变量。这样新建多个BeautifulReport的实例才能正常输出多个测试报告
65     #另外使用多进程输出多个测试报告比较难实现。需要多进程中使用功能的内容都是进程安全的,涉及到的logging等组件的使用都需要做改造。这里直接改造Beautifulreport中的FIELDS较为容易实现
66     for interface_name, testsuit in test_suit_dict.items():
67         log.info(f"add process filename:{filename} interface_name:{interface_name}")
68         output_report(testsuit, filename, interface_name)

 

BeautifulReport中改造FIELDS的代码如下。左侧为改造前代码,右侧为改造后代码。思路是将FIELDS变为类的成员变量,而不是使用全局变量。

基类中初始化FIELDS为类成员变量:

输出的报告内容使用成员变量存储:

 

标签:测试报告,testsuit,unittest,filename,interface,result,BeautifulReport,name
From: https://www.cnblogs.com/youxue-helloworld/p/18333790

相关文章

  • Jmeter+Ant生成优化HTML的接口测试报告
    为什么要这么做?在实际测试场景遇到这样一种情况,开发重构了接口实现逻辑,该接口主要用于查询操作,接口的入参有上千种可能,查询出来的内容很多,需要与原来接口比对,检查是否一致那此时,单纯用jmeter跑一遍的话,很难直观的看到测试之后的结果,所以就需要这样一种报告来展示,供开发修改在这......
  • 06-UnitTest框架
    DAY-09课堂笔记UnitTest基本使用UnitTest框架介绍框架什么是框架?1.框架英文单词framework2.为解决一类事情的功能集合UnitTest框架是Python自带的一个单元测试框架-⾃带的,可以直接使⽤,不需要单外安装-测试⼈员⽤来做⾃动化测试,作为⾃动化测试的执⾏框......
  • requsts、pytest、unittest区别
    在开始本文之前,我想跟大家澄清两个概念,一个是测试框架一个是测试工具。很多人容易把他们搞混了,测试框架是诸如Unittest、Pytest、TestNG这类,而测试工具指的则是Selenium、Appium、Jmeter这类。测试框架测试框架的作用是,帮助我们管理测试用例、执行测试用例、参数化、断言......
  • 当值来自函数 python unittest 时,如何模拟全局变量
    我必须在python中模拟全局变量,但变量值来自另一个函数。当我导入文件时,这个函数正在运行,但我想要那里的模拟值。secrets.pyimporttracebackimportloggingimportboto3importosimportjsonlogger=logging.getLogger()logger.setLevel(logging.INFO)secret_......
  • DC4靶机渗透测试报告
    概述测试目的测试范围序号系统IP1本地192.168.152.1282靶机DC4192.168.152.134详细测试流程1、发现测试目标2、信息收集开放了22端口和80端口访问80端口,发现没什么可用的,就用BP暴力破解最后得到密码是happy登录3、漏洞利用登录以后可以看到有执行命令的单选框,这个时候我们选择第一......
  • DC5靶机渗透测试报告
    概述测试目的测试范围序号系统IP1本机192.168.152.1282DC5靶机192.168.152.136详细测试流程1、发现测试目标2、信息收集3、漏洞利用访问80端口,这个页面我什么都没有发现,目录扫描好像也没什么用没办法,看一下大佬的WPVulnHub靶机DC-5打靶渗透测试详细过程_dc-5主机渗透试验-CSDN......
  • DC1主机渗透测试报告
    概述测试目的通过模拟黑客的渗透测试,评估目标系统是否存在可以被攻击者真实利用的漏洞以及由此引起的风险大小,为制定相应的安全措施与解决方案提供实际的依据。分析客户WEB应用系统的安全现状,检测WEB应用系统的漏洞和安全问题,并验证其他已知的脆弱点。对系统的任何弱点、技术缺陷......
  • 学之思系统测试报告(接口测试postman+性能测试jmeter+自动化测试selenium)
    学之思系统测试报告(接口测试postman+性能测试jmeter+自动化测试selenium)自动化测试脚本和执行学之思管理端+学之思学生端每个测试均需提交测试用例文档接口测试用例接口测试需要有缺陷文档性能测试每个接口需要提供聚合报告(每次请求前,清理数据)(测试计划+功......
  • 性能测试:性能测试报告
    简介性能测试报告是性能测试的产出物之一,它是对系统性能测试结果和数据的总结和分析,记录了系统在不同负载和场景下的性能表现和性能问题。性能测试报告提供了有关系统性能的详细信息,供项目团队、开发人员和其他相关利益相关者参考。性能测试报告作用性能测试报告的输出是非常重......
  • python接口自动化(二十五)--unittest断言——下(详解)
    1.简介 本篇还是回归到我们最初始的话题,想必大家都忘记了,没关系看这里:传送门 没错最初的话题就是登录,由于博客园的登录机制改变了,本篇以我找到的开源免费的登录API为案例,结合unittest框架写2个用例。同样我们先来看一下接口文档。2.接口文档2.1登录接口请求方式......