# TPG **Repository Path**: phygerr/tpg ## Basic Information - **Project Name**: TPG - **Description**: TPG测试报告生成器 - **Primary Language**: Unknown - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2021-12-05 - **Last Updated**: 2022-06-28 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # TPG
#### 介绍 TPG测试报告生成器 #### 个人公号 Python研究所 #### 源码 ```python from pywebio.input import * from pywebio.output import * from pywebio.pin import * from pyecharts import options as opts from pyecharts.charts import Bar from pyecharts.globals import ThemeType from pywebio import start_server from pywebio.platform import path_deploy,run_event_loop import pandas as pd import logging handler = logging.FileHandler("tpg.log") formatter= logging.Formatter("%(asctime)s - %(message)s") handler.setFormatter(formatter) def ReportGenerate(): basic_info = input_group('基础信息',[ input( '请输入版本号', name='version1', type=TEXT, placeholder='版本号,例:v3.0.1', # 占位 #value='v3.0.1', #help_text='This is help text', # 提示 required=True, # 必填 datalist=['v3.0.1', 'v3.0.2', 'v3.0.3'] # 常驻输入联想 ), input( '请输入迭代', name='version2', type=TEXT, placeholder='迭代,例:1月迭代', # 占位 #value='1月迭代', #help_text='This is help text', # 提示 required=True, # 必填 datalist=['1月迭代', '2月迭代', '3月迭代', '4月迭代', '5月迭代', '6月迭代', '7月迭代', '8月迭代', '9月迭代', '10月迭代', '11月迭代', '12月迭代'] # 常驻输入联想 ), input( '请输入起始测试时间', name='test_time1', value='2022-2-0', type=DATE, required=True, # 必填 ), input( '请输入结束测试时间', name='test_time2', value='2022-2-2', type=DATE, required=True, # 必填 ), input( '请输入测试用例链接', name='test_case_url', type=URL, required=True, # 必填 help_text='Jira上测试用例文档的链接', ), ]) issue_info = input_group('缺陷信息',[ input( label='缺陷列表URL', name='issue_url', type=URL, required=True, ), input( label='缺陷总数', name='issue_total', type=NUMBER, required=True, # 必填 value=40 ), input( label='致命的缺陷数', name='die', type=NUMBER, required=True, # 必填 value=1 ), input( label='严重的缺陷数', name='critical', type=NUMBER, required=True, # 必填 value=4 ), input( label='一般的缺陷数', name='normal', type=NUMBER, required=True, # 必填 value=8 ), input( label='建议的缺陷数', name='low', type=NUMBER, required=True, # 必填 value=10 ), input( label='关闭的缺陷数', name='closed', type=NUMBER, required=True, value=10 ), input( label='拒绝的缺陷数', name='refused', type=NUMBER, required=True, value=1 ), # input( # label='修复的缺陷数', # name='fixed', # type=NUMBER, # required=True, # value=1 # ), input( label='未解决的缺陷数', name='error', type=NUMBER, required=True, value=3 ), ]) issue_analyse = input_group('缺陷分析',[ input( label='模块1', name='portal', type=NUMBER, required=True, value=121 ), input( label='模块2', name='cmp', type=NUMBER, required=True, value=22 ), input( label='模块3', name='nova', type=NUMBER, required=True, value=12 ), input( label='模块4', name='net', type=NUMBER, required=True, value=7 ), input( label='模块5', name='storage', type=NUMBER, required=True, value=4 ), input( label='模块6', name='common', type=NUMBER, required=True, value=9 ), input( label='模块7', name='product', type=NUMBER, required=True, value=15 ), input( label='模块8', name='RDS', type=NUMBER, required=True, value=18 ), input( label='模块9', name='arch', type=NUMBER, required=True, value=0 ), input( label='模块10', name='devops', type=NUMBER, required=True, value=1 ), input( label='运维', name='ops', type=NUMBER, required=True, value=0 ), ]) issue_analyse_2 = input_group('缺陷分析-致命&严重',[ input( label='模块1', name='portal', type=NUMBER, required=True, value=1, help_text='请填写致命+严重的缺陷数' ), input( label='模块2', name='cmp', type=NUMBER, required=True, value=1 ), input( label='模块3', name='nova', type=NUMBER, required=True, value=1 ), input( label='模块4', name='net', type=NUMBER, required=True, value=1 ), input( label='模块5', name='storage', type=NUMBER, required=True, value=1 ), input( label='模块6', name='common', type=NUMBER, required=True, value=1 ), input( label='模块7', name='product', type=NUMBER, required=True, value=1 ), input( label='模块8', name='RDS', type=NUMBER, required=True, value=1 ), input( label='模块9', name='arch', type=NUMBER, required=True, value=0 ), input( label='模块10', name='devops', type=NUMBER, required=True, value=0 ), input( label='运维', name='ops', type=NUMBER, required=True, value=0 ), ]) result_info = input_group('测试结论和建议',[ textarea( label='测试结论', value='根据测试数据分析,当前版本缺陷总数较多,严重缺陷相对较少,所有缺陷均已解决,版本质量良好。', help_text='例:根据测试数据分析,当前版本缺陷总数较多,严重缺陷相对较少,所有缺陷均已解决,版本质量良好。', name='res', type=TEXT, required=True, rows=3, ), input( label='测试建议', value='继续加强代码review管控,模块7设计评审。', help_text='例:继续加强代码review管控,模块7设计评审。', name='suggest', type=TEXT, required=True, ), select( label='发布结果', value='可以发布', options=['可以发布','不可发布'], name='fb', required=True, ), input( label='缺陷主要原因', name='reason', type=TEXT, value='模块7设计缺失、需求不完整、代码BUG等导致', required=True, ), ]) # =============== xlsx转换为html table================ files = file_upload("请上传未解决的缺陷文件.xlsx", accept=['.xlsx','xls'],) pf = pd.read_excel(files.get('content')) import time times=time.strftime('%Y-%m-%d %T' , time.localtime()) test_time = '测试时间' # ===============Part One======================= put_markdown(f"# Python研究所 {basic_info['version1']} 版本 {basic_info['version2']} 测试报告").style('display:flex;justify-content: center;') put_markdown(f"## 1、概述") put_markdown(f"本测试报告为Python研究所{basic_info['version1']}版本功能测试报告;本报告目的在于评估{basic_info['version1']}/{basic_info['version2']}的基本功能是否满足发布要求。") put_markdown("本报告预期参与人员包括测试执行人员、测试负责人员、项目管理人员、模块10人员和其他开发团队成员。") # ===============Part Two======================= put_markdown("## 2、测试参考文档") put_column([ put_markdown("- [x] 需求文档"), put_markdown("- [x] 概要设计"), put_markdown("- [x] 详细设计"), put_markdown("- [x] 环境部署文档"), put_markdown("- [x] 自测报告"), put_markdown("- [x] 转测申请"), put_markdown("- [x] 测试计划"), put_markdown("- [x] 测试用例"), ] ) # ===============Part Three======================= put_markdown("## 3、测试设计") put_markdown("### 3.1、测试环境与配置") put_column( put_table([ [span('Python研究所',row=2), span('测试环境', col=2)], ['环境地址','规模'], ['IaaS', 'Python研究所','3控+3管+4模块3'], ['Portal', 'Python研究所', 'xx'], ['模块2', 'Python研究所', 'xx'], ])).style('display:flex;justify-content: center;') put_markdown("### 3.2、测试用例设计") put_markdown("测试用例的设计按场景、模块等多个层次进行用例设计。通过基础核心功能、基础非核心功能以及异常场景下的功能可用性将用例分为了P0、P1、P2、P3四种级别。") put_markdown(" - P0:基础核心功能") put_markdown(" - P1:基础高频功能") put_markdown(" - P2:基础低频功能") put_markdown(" - P3:UI布局&用户体验") put_markdown("### 3.3、测试方法") put_markdown("本次测试采用黑盒测试方法。通过手动执行功能测试用例结合自动化回归进行测试。") # ===============Part Four======================= put_markdown("## 4、测试计划") put_markdown("### 4.1、测试时间和人员") put_markdown(f" > 测试时间:{basic_info['test_time1']}-{basic_info['test_time2']}") # put_table([ # ['模块','模块3','模块5','模块4','模块8','SLB','审计','组织','运营-模块7','运营-计费','运营-其他','模块1-其他'], # ['主测试','Python研究所','Python研究所','Python研究所','Python研究所','phyger','Python研究所','Python研究所','Python研究所','Python研究所','Python研究所','all',], # ['备测试','all','phyger','phyger','phyger','Python研究所','Python研究所','all','Python研究所','Python研究所','all','all'] # ]) put_table([ ['模块3', 'Python研究所', 'all'], ['模块5', 'Python研究所', 'phyger'], ['模块4', 'Python研究所', 'phyger'], ['模块8', 'Python研究所', 'phyger'], ['ok', 'phyger', 'Python研究所'], ['ko', 'Python研究所', 'Python研究所'], ['xx', 'Python研究所', 'all'], ['运营-模块7', 'Python研究所', 'Python研究所'], ['运营-计费', 'Python研究所', 'Python研究所'], ['运营-其他', 'Python研究所', 'all'], ['模块1-其他', 'all', 'all'], ], header=['模块', '主测试', '备测试']) put_markdown("### 4.2、功能覆盖") put_link(name="1. ★历史版本存量功能",url='https://u1s1.vip',new_window=True) put_html('