generate_test_report_docx.py 14.2 KB
from __future__ import annotations

import os
from datetime import date

from docx import Document
from docx.shared import Pt


FONT_NAME = "宋体"


def set_run_font(run, size_pt: int = 11, bold: bool | None = None):
    run.font.name = FONT_NAME
    run.font.size = Pt(size_pt)
    if bold is not None:
        run.bold = bold


def add_heading(doc: Document, text: str, level: int = 1):
    h = doc.add_heading(text, level=level)
    for r in h.runs:
        set_run_font(r, size_pt=12)
    return h


def add_paragraph(doc: Document, text: str):
    p = doc.add_paragraph(text)
    for r in p.runs:
        set_run_font(r, size_pt=11)
    return p


def add_bullets(doc: Document, lines: list[str]):
    for line in lines:
        p = doc.add_paragraph(line, style="List Bullet")
        for r in p.runs:
            set_run_font(r, size_pt=11)


def add_table(doc: Document, headers: list[str], rows: list[list[str]]):
    table = doc.add_table(rows=1, cols=len(headers))
    table.style = "Table Grid"

    hdr_cells = table.rows[0].cells
    for i, h in enumerate(headers):
        hdr_cells[i].text = h
        for p in hdr_cells[i].paragraphs:
            for r in p.runs:
                set_run_font(r, size_pt=11, bold=True)

    for row in rows:
        cells = table.add_row().cells
        for i, v in enumerate(row):
            cells[i].text = v
            for p in cells[i].paragraphs:
                for r in p.runs:
                    set_run_font(r, size_pt=11)

    return table


def main():
    doc = Document()

    # 封面
    doc.add_heading("钻井液品牌网站\n测试报告", level=0)
    add_paragraph(doc, "版本:V1.0")
    add_paragraph(doc, f"日期:{date.today().isoformat()}")
    add_paragraph(doc, "编写:测试与质量保障小组")
    add_paragraph(doc, "项目单位:川庆钻探工程公司(示例)")
    doc.add_page_break()

    # 目录提示(Word 可自动生成)
    add_heading(doc, "文档说明", level=1)
    add_paragraph(
        doc,
        "本测试报告用于记录“钻井液品牌网站”项目在测试阶段的测试范围、测试方法、测试环境、测试过程与结果,"
        "并对缺陷情况进行汇总分析,形成项目上线与验收的质量依据。"
        "本文档为验收资料的一部分,建议在 Word 中通过“引用-目录”自动生成目录。",
    )

    # 1 概述
    add_heading(doc, "1 概述", level=1)
    add_heading(doc, "1.1 测试目的", level=2)
    add_paragraph(
        doc,
        "通过系统化测试验证钻井液品牌网站在功能、兼容性、易用性、性能与基础安全等方面满足软件需求说明书和验收标准的要求,"
        "为上线提供客观、可追溯的质量结论。",
    )

    add_heading(doc, "1.2 测试范围", level=2)
    add_paragraph(
        doc,
        "本次测试覆盖网站前台主要模块及其关键业务链路,包含多语言(中文/英文/俄文/西班牙文)页面、"
        "导航与页脚跳转、产品/体系/技术/实验室团队/生产制造/联系我们等页面的展示与交互逻辑。"
        "本次测试不包含后台 CMS(本期未建设)及与第三方系统的深度接口联调(如后续建设将另行开展)。",
    )

    add_heading(doc, "1.3 参考文档", level=2)
    add_bullets(
        doc,
        [
            "《钻井液品牌网站-软件需求说明书》",
            "《钻井液品牌网站-系统概要设计说明书》",
            "《钻井液品牌网站-详细设计说明书》",
            "《钻井液品牌网站-测试大纲》",
            "公司信息化相关制度与网站发布规范(如有)",
        ],
    )

    add_heading(doc, "1.4 术语与缩写", level=2)
    add_bullets(
        doc,
        [
            "SRS:Software Requirements Specification,软件需求说明书",
            "UAT:User Acceptance Test,用户验收测试(此处用于描述验收视角的测试)",
            "URL:统一资源定位符",
            "Nginx:常用反向代理与 Web 服务器软件(示例)",
        ],
    )

    # 2 测试组织与资源
    add_heading(doc, "2 测试组织与资源", level=1)
    add_heading(doc, "2.1 测试组织与职责", level=2)
    add_paragraph(
        doc,
        "测试工作由测试与质量保障小组牵头,开发团队配合问题定位与修复,业务代表参与关键页面文案与展示效果确认。"
        "测试职责包括:制定测试计划、编写并评审测试用例、执行测试、记录缺陷、组织回归、输出测试报告与质量结论。",
    )

    add_heading(doc, "2.2 测试资源与工具", level=2)
    add_bullets(
        doc,
        [
            "浏览器:Chrome、Edge、Firefox、Safari(版本以测试机实际安装为准)",
            "辅助工具:浏览器开发者工具(Network/Console/Performance)、截图工具",
            "缺陷记录:缺陷跟踪表(Excel)或缺陷管理系统(如公司统一平台)",
            "性能抽测:浏览器网络面板、简单并发压测工具(如 JMeter/ab,视条件而定)",
        ],
    )

    # 3 测试环境
    add_heading(doc, "3 测试环境", level=1)
    add_heading(doc, "3.1 环境说明", level=2)
    add_paragraph(
        doc,
        "本次测试环境原则上与生产环境保持一致或高度相似,使用同一套静态资源目录结构与访问方式。"
        "如存在测试环境与生产环境差异(网络带宽、证书、域名等),需在上线前进行必要的复核验证。",
    )

    add_heading(doc, "3.2 环境信息(示例)", level=2)
    add_table(
        doc,
        headers=["类别", "内容"],
        rows=[
            ["部署方式", "静态资源部署 + Web/反向代理(如 Nginx)对外提供访问"],
            ["访问协议", "HTTP/HTTPS(建议正式环境启用 HTTPS)"],
            ["语言版本", "Chinese / English / Russian / Spain"],
            ["终端类型", "PC 浏览器 / 移动端浏览器(抽测)"],
            ["静态资源目录", "/static/css、/static/js、/static/imgs 等"],
        ],
    )

    # 4 测试策略与方法
    add_heading(doc, "4 测试策略与方法", level=1)
    add_heading(doc, "4.1 测试类型", level=2)
    add_bullets(
        doc,
        [
            "功能测试:按模块与关键流程验证页面展示、跳转、参数逻辑是否正确",
            "链接与死链检查:重点检查顶部导航、页脚链接、列表到详情的跳转",
            "兼容性测试:不同浏览器/分辨率下页面布局与交互一致性",
            "易用性检查:文案可读性、交互引导、页面一致性",
            "性能抽测:首屏加载时间、静态资源缓存策略效果(抽样)",
            "基础安全检查:HTTPS、目录访问限制、异常参数容错(抽样)",
        ],
    )

    add_heading(doc, "4.2 测试覆盖原则", level=2)
    add_paragraph(
        doc,
        "测试覆盖遵循“核心流程优先、关键页面全覆盖、跨语言一致性验证、缺陷闭环回归”的原则。"
        "对领导验收关注点(多语言一致性、页面美观、链接准确、可用性稳定)进行重点加测。",
    )

    # 5 测试内容与结果汇总
    add_heading(doc, "5 测试内容与结果汇总", level=1)
    add_heading(doc, "5.1 需求覆盖与功能点检查", level=2)
    add_table(
        doc,
        headers=["模块", "关键检查点", "结果", "备注"],
        rows=[
            ["多语言与导航", "四语入口、语言切换、导航高亮", "通过", "抽测关键页,未见异常"],
            ["页脚链接", "产品/体系/技术/团队/制造链接可跳转", "通过", "需持续防止漏改页面"],
            ["产品模块", "列表->类型页->详情/参数展示", "通过", "以抽样数据验证"],
            ["体系模块", "体系详情页 data 参数可用", "通过", "system_detail.html?data=xx"],
            ["技术模块", "技术详情页 data 参数可用", "通过", "technology_detail.html?data=xx"],
            ["团队/实验室", "中心/实验室/团队/泥浆厂页面跳转", "通过", "抽测多语言一致性"],
            ["生产制造", "manu.html Tab 切换 + URL tab 参数定位", "通过", "tab=1/2/3/4"],
            ["联系我们", "联系方式展示完整、文案正确", "通过", "抽测多语言页面"],
        ],
    )

    add_heading(doc, "5.2 兼容性测试结果(示例)", level=2)
    add_table(
        doc,
        headers=["浏览器", "版本", "分辨率", "主要页面展示", "结论"],
        rows=[
            ["Chrome", "(按测试机实际)", "1920x1080", "正常", "通过"],
            ["Edge", "(按测试机实际)", "1920x1080", "正常", "通过"],
            ["Firefox", "(按测试机实际)", "1920x1080", "基本正常", "通过(个别样式需复核)"],
            ["Safari", "(按测试机实际)", "1440x900", "基本正常", "通过(个别字体渲染差异)"],
        ],
    )

    add_heading(doc, "5.3 性能抽测结论(示例)", level=2)
    add_paragraph(
        doc,
        "在典型网络环境下对首页与主要模块页面进行抽样测试,首屏加载时间满足“3 秒内完成基础可用”的目标(以抽测结果为准)。"
        "建议在正式环境启用静态资源缓存、Gzip/Brotli 压缩与图片尺寸控制,并结合监控平台持续观察上线后的访问性能。",
    )

    # 6 缺陷统计与分析
    add_heading(doc, "6 缺陷统计与分析", level=1)
    add_heading(doc, "6.1 缺陷分级标准(建议)", level=2)
    add_bullets(
        doc,
        [
            "致命(S1):导致网站不可用、核心链路完全不可用(首页无法打开、主要模块无法访问)",
            "严重(S2):影响核心功能或大量用户体验(大面积错链、关键页面布局崩坏)",
            "一般(S3):影响非核心功能或局部体验(个别文案错误、个别样式问题)",
            "建议(S4):优化建议(交互优化、展示优化、文案润色建议)",
        ],
    )

    add_heading(doc, "6.2 缺陷汇总(示例模板)", level=2)
    add_paragraph(
        doc,
        "本节用于填写本项目实际缺陷情况。若采用缺陷管理系统,可将缺陷列表导出并作为附录;"
        "若采用 Excel,可将关键字段汇总如下表。以下为模板示例(请结合实际测试记录补充)。",
    )
    add_table(
        doc,
        headers=["编号", "标题", "严重级别", "状态", "发现版本", "修复版本", "备注"],
        rows=[
            ["BUG-001", "(示例)某页脚链接跳转错误", "S2", "已关闭", "V1.0", "V1.0", "已修复并回归通过"],
            ["BUG-002", "(示例)Safari 下图片布局偏移", "S3", "已关闭", "V1.0", "V1.0", "样式兼容修复"],
            ["BUG-003", "(示例)多语言文案错别字", "S3", "已关闭", "V1.0", "V1.0", "已更正"],
        ],
    )

    add_heading(doc, "6.3 缺陷原因分析与改进建议", level=2)
    add_paragraph(
        doc,
        "结合官网项目特点,常见缺陷原因包括:多语言页面数量多导致漏改、复制粘贴造成链接不一致、"
        "浏览器差异引发的样式兼容问题等。建议通过以下措施改进:\n"
        "(1)建立统一的页脚与公共组件管理方式,减少手工重复修改;\n"
        "(2)引入链接清单与自动化检查脚本,定期扫描死链/错链;\n"
        "(3)在发布前执行跨浏览器抽测,并建立固定测试用例集用于回归;\n"
        "(4)对关键页面建立检查表,确保上线前逐项核对。",
    )

    # 7 风险与遗留问题
    add_heading(doc, "7 风险与遗留问题", level=1)
    add_paragraph(
        doc,
        "本节用于记录上线前仍需关注的风险点与遗留事项(如有)。"
        "例如:正式域名 HTTPS 证书上线切换、外网访问带宽波动、搜索引擎收录策略、"
        "多语言内容持续更新机制等。建议形成遗留事项清单并指定责任人跟踪闭环。",
    )

    # 8 测试结论与上线建议
    add_heading(doc, "8 测试结论与上线建议", level=1)
    add_heading(doc, "8.1 测试结论", level=2)
    add_paragraph(
        doc,
        "综合功能测试、链接检查、兼容性测试与性能抽测结果,钻井液品牌网站整体满足需求说明书对主要功能与展示效果的要求,"
        "未发现阻断上线的致命缺陷(以实际缺陷统计为准)。建议在完成必要的上线前复核(域名、证书、缓存策略、监控告警)后进入上线流程。",
    )

    add_heading(doc, "8.2 上线建议与检查清单(建议)", level=2)
    add_bullets(
        doc,
        [
            "上线前进行一次全站链接抽查(重点:页脚与导航、产品/体系/技术详情跳转)",
            "确认正式环境的 HTTPS 证书、域名解析、80/443 端口策略与重定向规则",
            "确认静态资源缓存策略与压缩策略生效(gzip/brotli、cache-control)",
            "接入公司统一监控与告警平台,配置关键 URL 健康检查",
            "归档交付物:需求、设计、测试大纲、测试报告、源代码与部署说明等",
        ],
    )

    # 9 附录
    add_heading(doc, "9 附录", level=1)
    add_heading(doc, "9.1 测试用例执行记录(建议附表)", level=2)
    add_paragraph(
        doc,
        "建议将详细测试用例执行记录(用例编号、步骤、预期、实际、结果、截图)以附件形式保存,"
        "并在验收归档时随测试报告一并存档。",
    )

    add_heading(doc, "9.2 截图与关键页面证据(建议)", level=2)
    add_paragraph(
        doc,
        "建议对首页、产品/体系/技术/生产制造等关键页面在四种语言版本下截取关键截图,"
        "作为展示效果与多语言一致性的证据材料,便于验收会现场展示和后续追溯。",
    )

    os.makedirs("docs", exist_ok=True)
    output_path = os.path.join("docs", "钻井液品牌网站-测试报告.docx")
    doc.save(output_path)
    print(f"Test report generated at: {output_path}")


if __name__ == "__main__":
    main()