PyQt5+Python-docx實(shí)現(xiàn)一鍵生成測(cè)試報(bào)告
引言
作為一名測(cè)試工程師,你是否經(jīng)歷過(guò)手動(dòng)填寫(xiě)測(cè)試報(bào)告的痛苦?就像用放大鏡在沙地上寫(xiě)詩(shī)——費(fèi)力、易改、還容易被風(fēng)吹散。
今天,我們將用Python的PyQt5和python-docx庫(kù),打造一款測(cè)試報(bào)告一鍵生成工具,讓你像搭積木一樣快速完成報(bào)告,像做蛋糕一樣優(yōu)雅分配時(shí)間!
工具功能亮點(diǎn)
1.圖形化界面交互:你的“樂(lè)高積木”
- 通過(guò)PyQt5設(shè)計(jì)的界面,就像一盒五顏六色的樂(lè)高積木,
- 每個(gè)輸入框都是一個(gè)模塊,輕輕一搭,數(shù)據(jù)就位!
2.時(shí)間智能劃分:你的“時(shí)間蛋糕”大師
根據(jù)測(cè)試起止時(shí)間,像切蛋糕一樣按比例分配需求評(píng)審、
用例設(shè)計(jì)、執(zhí)行、回歸測(cè)試及報(bào)告編寫(xiě)的時(shí)間。
(例如:需求評(píng)審10%、用例設(shè)計(jì)20%…)
3.模板化報(bào)告生成:你的“填字游戲”助手
基于python-docx庫(kù),像玩填字游戲一樣自動(dòng)填充Word文檔,
模板一放,數(shù)據(jù)自動(dòng)到位。
4.可擴(kuò)展性強(qiáng):你的“建筑藍(lán)圖”
代碼結(jié)構(gòu)清晰,像建筑藍(lán)圖一樣模塊化,
方便后續(xù)集成更多功能(如圖表生成、歷史記錄保存)。
工具設(shè)計(jì)思路
1. 界面設(shè)計(jì):PyQt5實(shí)現(xiàn)數(shù)據(jù)輸入
輸入字段:
- 系統(tǒng)測(cè)試環(huán)境地址 → 類(lèi)比為“快遞地址”,確保報(bào)告能準(zhǔn)確送達(dá)。
- 項(xiàng)目經(jīng)理、測(cè)試經(jīng)理等 → 像“團(tuán)隊(duì)角色卡牌”,明確責(zé)任分工。
- 測(cè)試起止時(shí)間 → 類(lèi)比為“馬拉松起點(diǎn)終點(diǎn)”,為時(shí)間分配提供基準(zhǔn)。
- 用例數(shù)與Bug數(shù) → 像“考試成績(jī)表”,直觀展示測(cè)試成果。
時(shí)間智能劃分:
- 根據(jù)起止時(shí)間,按比例分配階段時(shí)間,
- 就像切蛋糕:需求評(píng)審(10%)、用例設(shè)計(jì)(20%)、執(zhí)行(30%)、
- 回歸測(cè)試(20%)、報(bào)告編寫(xiě)(20%)。每個(gè)階段都有清晰的“時(shí)間標(biāo)簽”。
2. 文檔生成:python-docx填充模板
模板結(jié)構(gòu):
- 標(biāo)題與基本信息 → 類(lèi)比為“簡(jiǎn)歷封面”,展示項(xiàng)目核心信息。
- 時(shí)間安排表 → 像“日程表”,讓時(shí)間分配一目了然。
- 測(cè)試數(shù)據(jù)統(tǒng)計(jì) → 如“成績(jī)單”,用表格展示用例數(shù)、Bug數(shù)。
- 測(cè)試結(jié)論 → 類(lèi)似“總結(jié)發(fā)言”,簡(jiǎn)潔有力。
動(dòng)態(tài)數(shù)據(jù)填充:
- 通過(guò)占位符替換或直接插入段落/表格,
- 像“填字游戲”一樣自動(dòng)填充數(shù)據(jù)。
工具實(shí)現(xiàn)代碼
1. 安裝依賴(lài)
pip install PyQt5 python-docx
2. PyQt5界面代碼
import sys from PyQt5.QtWidgets import QApplication, QWidget, QLabel, QLineEdit, QDateEdit, QPushButton, QVBoxLayout, QHBoxLayout, QFormLayout class TestReportTool(QWidget): def __init__(self): super().__init__() self.setWindowTitle("測(cè)試報(bào)告一鍵生成工具") self.init_ui() def init_ui(self): # 表單布局 form_layout = QFormLayout() # 輸入字段(積木模塊) self.system_url = QLineEdit() self.pm_name = QLineEdit() self.tm_name = QLineEdit() self.tl_name = QLineEdit() self.tester_name = QLineEdit() self.start_date = QDateEdit() self.end_date = QDateEdit() self.func_cases = QLineEdit() self.func_bugs = QLineEdit() self.regression_cases = QLineEdit() self.regression_bugs = QLineEdit() # 添加字段到表單 form_layout.addRow("系統(tǒng)測(cè)試環(huán)境地址:", self.system_url) form_layout.addRow("項(xiàng)目經(jīng)理:", self.pm_name) form_layout.addRow("測(cè)試經(jīng)理:", self.tm_name) form_layout.addRow("測(cè)試組長(zhǎng):", self.tl_name) form_layout.addRow("測(cè)試人員:", self.tester_name) form_layout.addRow("測(cè)試起始時(shí)間:", self.start_date) form_layout.addRow("測(cè)試結(jié)束時(shí)間:", self.end_date) form_layout.addRow("功能測(cè)試用例數(shù):", self.func_cases) form_layout.addRow("功能測(cè)試Bug數(shù):", self.func_bugs) form_layout.addRow("回歸測(cè)試用例數(shù):", self.regression_cases) form_layout.addRow("回歸測(cè)試缺陷數(shù):", self.regression_bugs) # 生成按鈕 self.generate_btn = QPushButton("生成測(cè)試報(bào)告") self.generate_btn.clicked.connect(self.generate_report) # 主布局 main_layout = QVBoxLayout() main_layout.addLayout(form_layout) main_layout.addWidget(self.generate_btn) self.setLayout(main_layout) def generate_report(self): # 收集數(shù)據(jù) data = { "system_url": self.system_url.text(), "pm_name": self.pm_name.text(), "tm_name": self.tm_name.text(), "tl_name": self.tl_name.text(), "tester_name": self.testers_name.text(), "start_date": self.start_date.date().toString("yyyy-MM-dd"), "end_date": self.end_date.date().toString("yyyy-MM-dd"), "func_cases": self.func_cases.text(), "func_bugs": self.func_bugs.text(), "regression_cases": self.regression_cases.text(), "regression_bugs": self.regression_bugs.text(), } # 計(jì)算時(shí)間塊并添加到data time_blocks = calculate_time_blocks(data["start_date"], data["end_date"]) for phase, dates in time_blocks.items(): key = f"{phase}_time" data[key] = dates # 計(jì)算通過(guò)率 func_pass_rate = round((1 - int(data["func_bugs"]) / int(data["func_cases"])) * 100, 2) data["func_pass_rate"] = f"{func_pass_rate}%" reg_pass_rate = round((1 - int(data["regression_bugs"]) / int(data["regression_cases"])) * 100, 2) data["reg_pass_rate"] = f"{reg_pass_rate}%" # 調(diào)用文檔生成函數(shù) from docx_generator import generate_docx generate_docx(data) print("測(cè)試報(bào)告生成成功!") if __name__ == "__main__": app = QApplication(sys.argv) window = TestReportTool() window.show() sys.exit(app.exec_())
3. Word文檔生成代碼
from docx import Document from datetime import datetime, timedelta def calculate_time_blocks(start_date_str, end_date_str): start_date = datetime.strptime(start_date_str, "%Y-%m-%d") end_date = datetime.strptime(end_date_str, "%Y-%m-%d") total_days = (end_date - start_date).days if total_days <= 0: return {} # 按比例劃分階段(時(shí)間蛋糕) phases = { "需求評(píng)審": 0.1, "用例設(shè)計(jì)": 0.2, "用例執(zhí)行": 0.3, "回歸測(cè)試": 0.2, "報(bào)告編寫(xiě)": 0.2 } time_blocks = {} current_date = start_date for phase, ratio in phases.items(): days = int(total_days * ratio) end_phase = current_date + timedelta(days=days) time_blocks[phase] = f"{current_date.strftime('%Y-%m-%d')} - {end_phase.strftime('%Y-%m-%d')}" current_date = end_phase return time_blocks def generate_docx(data): # 讀取模板文檔 doc = Document('template.docx') # 假設(shè)模板文件為 template.docx # 替換段落中的占位符 for paragraph in doc.paragraphs: for key, value in data.items(): if key in paragraph.text: paragraph.text = paragraph.text.replace(f'{{{key}}}', value) # 使用雙大括號(hào)包裹 # 替換表格中的占位符 for table in doc.tables: for row in table.rows: for cell in row.cells: for key, value in data.items(): if key in cell.text: cell.text = cell.text.replace(f'{{{key}}}', value) # 保存文檔 doc.save("TestReport.docx")
模板化樣本
# 測(cè)試報(bào)告模板(變量占位符版)
---
## 一、測(cè)試基本信息
系統(tǒng)測(cè)試環(huán)境地址:{{{system_url}}}
項(xiàng)目經(jīng)理:{{{pm_name}}}
測(cè)試經(jīng)理:{{{tm_name}}}
測(cè)試組長(zhǎng):{{{tl_name}}}
測(cè)試人員:{{{tester_name}}}
---
## 二、測(cè)試時(shí)間安排
需求評(píng)審:{{{需求評(píng)審_time}}}
用例設(shè)計(jì):{{{用例設(shè)計(jì)_time}}}
用例執(zhí)行:{{{用例執(zhí)行_time}}}
回歸測(cè)試:{{{回歸測(cè)試_time}}}
報(bào)告編寫(xiě):{{{報(bào)告編寫(xiě)_time}}}
---
## 三、測(cè)試數(shù)據(jù)統(tǒng)計(jì)
| 測(cè)試類(lèi)型 | 用例數(shù) | 缺陷數(shù) | 通過(guò)率 |
|----------|--------|--------|--------|
| 功能測(cè)試 | {{{func_cases}}} | {{{func_bugs}}} | {{{func_pass_rate}}} |
| 回歸測(cè)試 | {{{regression_cases}}} | {{{regression_bugs}}} | {{{reg_pass_rate}}} |
---
## 四、測(cè)試結(jié)論
{{{test_conclusion}}}
工具使用示例
1.準(zhǔn)備模板:
- 創(chuàng)建一個(gè)名為 template.docx 的Word文檔,內(nèi)容如上所示的模板樣本。
- 確保模板中使用 {{{variable_name}}} 形式的占位符。
2.運(yùn)行界面:
- 打開(kāi)工具后,在界面中輸入測(cè)試數(shù)據(jù)。
- 點(diǎn)擊“生成測(cè)試報(bào)告”按鈕。
3.生成結(jié)果:
自動(dòng)生成名為 TestReport.docx 的Word文檔,內(nèi)容如下:
- 測(cè)試基本信息:系統(tǒng)環(huán)境、人員信息(簡(jiǎn)歷封面)。
- 測(cè)試時(shí)間安排:按比例劃分的各階段時(shí)間(日程表)。
- 測(cè)試數(shù)據(jù)統(tǒng)計(jì):用表格展示功能測(cè)試與回歸測(cè)試的用例數(shù)、缺陷數(shù)、通過(guò)率(成績(jī)單)。
- 測(cè)試結(jié)論:簡(jiǎn)要總結(jié)測(cè)試結(jié)果(總結(jié)發(fā)言)。
擴(kuò)展建議
模板自定義:在模板中添加公司Logo、頁(yè)眉頁(yè)腳或顏色主題,提升專(zhuān)業(yè)度。
數(shù)據(jù)導(dǎo)出:集成 openpyxl 庫(kù),將測(cè)試數(shù)據(jù)導(dǎo)出為Excel表格。
圖表生成:使用 matplotlib 生成缺陷趨勢(shì)圖,并嵌入到Word文檔中。
歷史記錄:將用戶(hù)輸入的數(shù)據(jù)保存為JSON文件,支持歷史記錄查詢(xún)。
結(jié)語(yǔ)
這款工具的核心在于將重復(fù)性工作自動(dòng)化,讓測(cè)試工程師專(zhuān)注于測(cè)試設(shè)計(jì)與執(zhí)行。
通過(guò)PyQt5的圖形化界面和python-docx的文檔生成能力,我們不僅提高了效率,還降低了人為錯(cuò)誤的風(fēng)險(xiǎn)。
到此這篇關(guān)于PyQt5+Python-docx實(shí)現(xiàn)一鍵生成測(cè)試報(bào)告的文章就介紹到這了,更多相關(guān)PyQt5 Python-docx生成測(cè)試報(bào)告內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python去除空格和換行符的實(shí)現(xiàn)方法(推薦)
下面小編就為大家?guī)?lái)一篇python去除空格和換行符的實(shí)現(xiàn)方法(推薦)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-01-01一個(gè)不可思議的Python庫(kù)vnpy示例詳解
這篇文章主要給大家介紹了關(guān)于Python庫(kù)vnpy的相關(guān)資料,vn.py是一個(gè)開(kāi)源的Python交易編程框架,支持多種金融產(chǎn)品的交易,提供全流程支持,它具有模塊化設(shè)計(jì)、多語(yǔ)言支持、跨平臺(tái)、高性能、易用性、社區(qū)支持和文檔齊全等特性,需要的朋友可以參考下2024-11-11Python判斷對(duì)象是否相等及eq函數(shù)的講解
今天小編就為大家分享一篇關(guān)于Python判斷對(duì)象是否相等及eq函數(shù)的講解,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2019-02-02python計(jì)算寄送包裹重量的實(shí)現(xiàn)過(guò)程
要實(shí)現(xiàn)這樣一個(gè)需求寄送包裹小于5kg,每公斤0.5元,大于等于5kg,超出5公斤部分,按照每公斤0.8元計(jì)算,輸入重量,輸出應(yīng)付金額,下面小編給大家分享實(shí)現(xiàn)代碼,感興趣的朋友跟隨小編一起看看吧2022-02-02tensorflow-gpu安裝的常見(jiàn)問(wèn)題及解決方案
這篇文章主要介紹了tensorflow-gpu安裝的常見(jiàn)問(wèn)題及解決方案,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友參考下吧,需要的朋友可以參考下2020-01-01Python實(shí)現(xiàn)緩存的兩個(gè)簡(jiǎn)單方法
緩存是一種用于提高應(yīng)用程序性能的技術(shù),它通過(guò)臨時(shí)存儲(chǔ)程序獲得的結(jié)果,以便在以后需要時(shí)重用它們,本文將學(xué)習(xí)Python中的不同緩存技術(shù),感興趣的可以了解下2024-11-11