
简介这份PDF是一份完整的软件测试方向毕业实习报告面向计算机科学与技术、软件工程等专业的在校生与即将进入测试岗位的求职者可用于撰写实习报告、整理实习材料或了解企业测试工作的真实流程。报告以葛洲坝集团电力有限责任公司的四周实习为主线依次记录企业背景与产品认知、软件测试基础知识学习测试用例、测试流程、测试类型与常用工具、测试环境搭建与功能测试、用例编写与执行、bug提交与回归验证以及测试进度计划、日报周报等文档规范另含实习目的、单位介绍、过程记录与总结反思等章节可直接参照其结构组织自己的报告。资源为1个PDF文件压缩包约745KB体积轻巧便于下载查阅。目前已有63人学习下载适合想了解测试岗位日常职责、文档写作要求与实习报告框架的读者参考借鉴。1. 软件测试毕业实习报告.pdf一份能拿得出手的交付物长什么样实习三个月需求评审参加了七次接口用例写了两百多条缺陷提了四十个回归跑了三轮。到答辩前一天这些动作绝大部分还躺在禅道的列表页、Jira 的看板、和同事的聊天记录里。最后交上去的实习报告往往是几张贴图加一段「在本次实习中我学到了很多」——面试官翻两页就放下了。这个标题要解决的是把散落的测试动作收敛成一份结构固定、数据可核对、能全文检索的 PDF内容侧要覆盖软件测试流程、用例设计、缺陷跟踪和度量指标工程侧要能从 Markdown 或 HTML 稳定产出带目录、页码、中文字体的 PDF 文档。它适合正在准备实习答辩和秋招简历的测试新人也适合带实习生的测试组长直接拿去做模板。下面按内容骨架、PDF 生成、数据来源、交付自检四段推进每段都给出可复现的命令和代码。2. 软件测试毕业实习报告的内容骨架测试流程、用例与缺陷怎么落笔2.1 先定章节一份实习报告该有哪些固定模块实习报告和测试总结报告不是一回事。测试总结面向项目讲版本质量实习报告面向个人成长讲你在这套软件测试流程里承担了哪一段、用什么方法做的、结果能不能被别人复算。我一般会把它拆成六个固定模块顺序别乱第一段写项目背景与被测系统边界一两段就够说清被测的是 Web 后台、移动端 App 还是嵌入式固件测试环境是什么版本。第二段写参与的测试流程环节这是后面所有内容的骨架。第三段写用例设计方法与产出用等价类、边界值、场景法各举一个真实例子比列二十条用例编号更有效。第四段写缺陷跟踪按严重等级和状态分布给数据。第五段写度量与结论用执行率、缺陷密度、缺陷收敛趋势三个指标收口。第六段写复盘只写具体的能力短板不写客套话。模块定好之后每个模块标题直接对应一个 Markdown 二级标题后面生成 PDF 时目录会自动抽出来。这也是为什么我不建议先开 Word 再想结构——结构没定就排版改一次要重排一次。2.2 软件测试流程怎么写成可核对的证据链软件测试流程常见的划分是需求评审 → 测试计划 → 用例设计 → 用例评审 → 执行 → 缺陷提交与跟踪 → 回归 → 测试报告。实习报告里最容易写虚的就是这一段因为「参加了需求评审」这句话谁都能写。把它写成证据链的办法是给每个环节挂一个可验证的产出物和一次参与记录。需求评审环节产出物是评审意见条目写清楚你提了几条、被采纳几条比如「针对订单超时关闭逻辑提出 3 条歧义点其中 2 条进入需求澄清记录」。测试计划环节产出物是范围与排期表写清你负责的模块占整体用例的比例。用例设计环节产出用例集执行环节产出执行记录缺陷环节产出缺陷单。回归环节写清回归范围和触发条件例如「修复单影响支付回调触发支付链路全量回归」。注意每个环节的产出物必须是别人能查到的写「禅道项目 XX 下第 3 轮迭代」比写「参与了缺陷管理」有用得多。这样写还有个副作用面试时被追问「你负责的部分边界在哪」时你可以直接用模块占比和用例数量回答不需要现场回忆。2.3 用例与缺陷表格字段和度量口径缺陷单的字段不是随便定的它决定了你后面能不能算出有意义的指标。下面这张表是我在报告里固定用的字段集前六列直接从测试管理工具导出后三列是补充口径。字段类型说明用途缺陷编号字符串工具内唯一标识追溯与去重所属模块枚举与用例模块保持一致缺陷密度分母对齐严重等级枚举致命/严重/一般/提示分布统计优先级枚举P0-P3修复排期核对发现阶段枚举冒烟/系统/回归/验收缺陷逃逸分析状态枚举新建/修复中/已修复/关闭/挂起收敛趋势首次发现轮次整数第几轮执行发现收敛曲线横轴关联用例字符串触发缺陷的用例编号反向验证用例有效性是否重复布尔重复单标记剔除后重算总数口径上有两个坑。一是重复缺陷必须剔除后再算缺陷密度否则同一模块的总数会虚高。二是「已修复」不等于「已关闭」收敛趋势应该按「未关闭缺陷数」画而不是按「新建缺陷数」画因为前者才反映版本是否真的收敛。度量公式也要在报告里显式写出让读者能复算用例执行率等于已执行用例数除以计划用例总数缺陷密度等于去重后缺陷数除以对应模块的用例数遗留缺陷率等于关闭前未关闭缺陷数除以总缺陷数。三个数都保留两位小数。2.4 用脚本把执行数据算成报告里的结论手工数这三组数字很容易出错尤其是跨轮次统计的时候。我一般把工具导出的用例执行记录存成 CSV用一段脚本直接算结果直接贴进报告避免手抖。# metrics.py 从测试管理工具导出的 CSV 计算报告核心指标 import csv from collections import defaultdict def load(path): with open(path, newline, encodingutf-8-sig) as f: return list(csv.DictReader(f)) rows load(cases_export.csv) # 期望字段: case_id, module, status(通过/失败/阻塞/未执行), round, bug_id, is_duplicate plan_total len(rows) executed [r for r in rows if r[status] ! 未执行] exec_rate len(executed) / plan_total # 用例执行率 module_cases defaultdict(int) # 每模块用例数做密度分母 bugs set() for r in rows: module_cases[r[module]] 1 if r[bug_id] and r[is_duplicate] 0: bugs.add(r[bug_id]) # 去重后缺陷集合 density {m: round(sum(1 for r in rows if r[module] m and r[bug_id] and r[is_duplicate] 0) / c, 2) for m, c in module_cases.items()} print(f计划用例 {plan_total}执行率 {exec_rate:.2%}) for m, d in sorted(density.items(), keylambda x: -x[1]): print(f{m}: 缺陷密度 {d})脚本里status字段的取值必须和工具导出口径对齐如果有「未执行」和「跳过」两种状态要在过滤条件里都排除否则执行率会偏低。is_duplicate用 0/1 而不是布尔值是因为 CSV 导出常见的是字符串直接比较会更稳。密度分母用的是「该模块用例数」而不是「该模块执行用例数」这两个口径的差别要在报告里注明否则换个人算出来的数对不上。3. 从 Markdown 到软件测试毕业实习报告.pdfPandoc 与 WeasyPrint 两条路线3.1 工具选型为什么我不推荐直接在 Word 里排版Word 排版的问题不在好不好看在于不可版本化。每次改一处用例数据就要重新对齐图注、页码和目录改到第三版基本就放弃维护了。用纯文本写内容、用工具生成 PDF改数据只需要改一行文字重新跑一次命令。常见路线有四条差异主要在中文支持和排版控制力上路线输入中文支持排版控制适合场景Pandoc LaTeXMarkdown需配 CJK 字体强模板复杂长文档、公式多WeasyPrint CSSHTML好直接用系统字体强CSS 分页报告类、图表多reportlabPython 代码需注册字体中需手写布局程序化生成固定版式Word 导出docx好弱易错版必须交 docx 时实习报告这种图表多、公式少、要反复改数据的文档我倾向 WeasyPrint如果报告里要塞测试覆盖率公式和大量数学符号Pandoc 更省事。3.2 Pandoc LaTeX 路线的最小可用命令# 1. 先装好 TeX 发行版和 pandoc确认中文字体存在 # fc-list :langzh | head Linux/macOS 下查可用中文字体 pandoc report.md \ -o 软件测试毕业实习报告.pdf \ --pdf-enginexelatex \ --toc --toc-depth3 \ -V mainfontNoto Serif CJK SC \ -V monofontNoto Sans Mono CJK SC \ -V geometry:margin2.5cm \ -V fontsize11pt \ --number-sections--pdf-enginexelatex是必须的pdflatex 处理中文要走复杂的 CJK 宏包xelatex 直接调系统字体。--toc生成目录--toc-depth3表示抽到三级标题报告里###一般是小节抽三级刚好。mainfont和monofont要分开放正文用衬线、代码用等宽如果只配一个代码块里的中文会变成方块。--number-sections给章节自动编号但要注意它会把一级标题编号成 1、2、3如果你的报告里已经手写了「1.1」这种编号会变成双重编号那就去掉这个参数。geometry:margin2.5cm是页边距报告要打印的话别低于 2cm否则装订边会被裁掉。3.3 WeasyPrint CSS 路线中文字体与分页控制WeasyPrint 走的是 HTML CSS 分页媒体好处是 CSS 里能直接写分页规则控制力比 LaTeX 模板直观。# build_pdf.py 把 Markdown 转 HTML 再生成 PDF import markdown from weasyprint import HTML, CSS with open(report.md, encodingutf-8) as f: text f.read() # tables 扩展让 2.3 节的表格正常渲染toc 扩展自动生成目录锚点 html_body markdown.markdown( text, extensions[tables, fenced_code, toc, codehilite], extension_configs{toc: {toc_depth: 2-3}} ) html_doc f!DOCTYPE htmlhtmlheadmeta charsetutf-8 title软件测试毕业实习报告/title/headbody{html_body}/body/html # 显式指定字体避免容器里缺字体导致中文变方块 base_css CSS(string page { size: A4; margin: 2.5cm 2cm; bottom-center { content: counter(page) / counter(pages); } } body { font-family: Noto Serif CJK SC, Source Han Serif SC, serif; font-size: 11pt; line-height: 1.7; } pre, code { font-family: Noto Sans Mono CJK SC, monospace; font-size: 9pt; } table { border-collapse: collapse; width: 100%; font-size: 10pt; } th, td { border: 1px solid #999; padding: 4px 8px; } h1 { page-break-before: always; } /* 每章另起一页 */ h2, h3 { page-break-after: avoid; } /* 标题不与正文分离 */ img { max-width: 100%; } ) HTML(stringhtml_doc, base_url.).write_pdf(软件测试毕业实习报告.pdf, stylesheets[base_css]) print(done)extension_configs里的toc_depth写2-3只在##和###上生成目录项一级标题如果就是文档标题不进目录更干净。bottom-center里用counter(page)和counter(pages)生成「当前页 / 总页数」这是 CSS 分页媒体的标准写法比后处理 PDF 加页码可靠。h1 { page-break-before: always; }会把每个一级标题强制推到新页报告体量不大时可以去掉省纸。base_url.是给相对路径图片用的2.4 节生成的趋势图放在同目录Markdown 里写就能引到。如果字体报 warning用fc-list :langzh确认字体名CSS 里的名称必须和系统注册名完全一致差一个空格都会回退到默认字体。3.4 目录、页眉页脚与图表编号的落地配置WeasyPrint 支持用target-counter做「目录页码」但需要手写锚点链接。更省事的做法是用markdown的toc扩展生成带id的标题再在 CSS 里给目录链接补页码配置复杂度不低。实习报告这种十几页的文档我的选择是目录不标页码只列层级页码靠 PDF 阅读器的书签导航——生成的 PDF 已经带书签检索和跳转都够用。图表编号建议手工写进题注不要指望工具自动编号。比如图注统一写成「图 4-1 缺陷收敛趋势第 1-3 轮」章号对齐章节序号正文里用「见图 4-1」引用。理由很简单工具自动编号在插入新图后会全部重排而手工编号配合版本管理改动范围可控。页眉如果需要放报告名和日期在page里加top-right { content: 软件测试毕业实习报告; }但注意page默认对所有页生效封面页要去掉的话得单独定义一个命名页规则并在封面元素上引用。4. 报告里的数据从哪来pytest、JUnit XML 与缺陷趋势图4.1 自动化执行结果导出成可解析的结构实习期间如果做过接口自动化pytest 是大概率用过的工具它可以直接把结果输出成 JUnit XML这个格式几乎所有测试平台和 CI 都认也是报告数据最稳的来源。# 生成 JUnit XML 和 HTML 两份结果XML 用来算数HTML 用来截图放附录 pytest tests/ \ --junit-xmlresults/junit.xml \ --htmlresults/report.html --self-contained-html \ -m not slow \ -q--junit-xml输出的是标准 XML字段有tests、failures、errors、skipped和时间属性。-m not slow排除慢用例实习报告里通常统计的是主链路用例慢用例单列。--self-contained-html把 CSS 和图片内联进单个 HTML 文件避免发给别人时丢样式但它不适合直接转 PDF因为分页控制差正确做法是 HTML 只作附录截图。4.2 解析 JUnit XML 统计通过率与失败分布XML 里的失败信息带堆栈直接统计会把同一个根因重复计数。我一般按「失败用例所属模块」聚合再看模块维度上哪块最弱。# parse_junit.py 按模块统计通过率与失败分布 import xml.etree.ElementTree as ET from collections import defaultdict tree ET.parse(results/junit.xml) root tree.getroot() suite root if root.tag testsuite else root.find(testsuite) stat defaultdict(lambda: {total: 0, fail: 0, error: 0, skip: 0}) for case in suite.iter(testcase): # classname 形如 tests.test_order.TestOrder取模块段做分组键 module case.get(classname, ).split(.)[1] or unknown stat[module][total] 1 if case.find(failure) is not None: stat[module][fail] 1 elif case.find(error) is not None: stat[module][error] 1 elif case.find(skipped) is not None: stat[module][skip] 1 for m, s in sorted(stat.items(), keylambda x: -(x[1][fail] x[1][error])): passed s[total] - s[fail] - s[error] - s[skip] rate passed / s[total] if s[total] else 0 print(f{m:20s} 用例 {s[total]:3d} 通过率 {rate:.1%} f失败 {s[fail]} 错误 {s[error]} 跳过 {s[skip]})分组键取classname的第二段是因为 pytest 默认把tests/test_order.py::TestOrder::test_x映射成tests.test_order.TestOrder第一段固定是tests第二段才是模块名。如果你的目录结构不是这样直接打印几个classname看实际格式再改切分下标。跳过用例不参与通过率分母还是参与两种口径都能用但必须在报告里写清楚。我一般让跳过用例参与分母因为跳过通常意味着环境缺失这类风险应该被计入。4.3 缺陷趋势图用 matplotlib 生成并嵌入 PDF收敛趋势图是报告里最有说服力的一张图横轴是执行轮次纵轴是未关闭缺陷数。数据从缺陷导出表里按「首次发现轮次」和「关闭轮次」两张字段算。# bug_trend.py 画缺陷收敛曲线输出矢量图供 PDF 引用 import matplotlib matplotlib.use(Agg) import matplotlib.pyplot as plt # rounds: 轮次opened: 各轮新增closed: 各轮关闭 rounds [1, 2, 3, 4] opened [18, 12, 6, 2] closed [0, 9, 15, 20] plt.rcParams[font.sans-serif] [Noto Sans CJK SC] # 中文字体 plt.rcParams[axes.unicode_minus] False remain, cur [], 0 for o, c in zip(opened, closed): cur o - c remain.append(max(cur, 0)) fig, ax plt.subplots(figsize(6, 3.2), dpi150) ax.plot(rounds, remain, markero, color#c0392b, label未关闭缺陷) ax.bar(rounds, opened, alpha0.25, color#7f8c8d, label新增缺陷) ax.set_xlabel(执行轮次); ax.set_ylabel(缺陷数) ax.set_xticks(rounds); ax.grid(axisy, linestyle--, alpha0.4) ax.legend() fig.tight_layout() fig.savefig(bug_trend.svg) # 矢量图PDF 里放大不糊 print(saved bug_trend.svg)fig.savefig的格式选 SVG 而不是 PNG因为 PDF 是矢量容器嵌 SVG 后放大打印不糊如果用的是 WeasyPrintSVG 也能直接引用。plt.rcParams[font.sans-serif]必须显式指定中文字体不然图例里的中文会变成一堆方框这个问题和 3.3 节的字体是同一类坑。max(cur, 0)是防御性写法当关闭数大于累计新增时累计剩余会出现负数图表上会画出很怪的下沉钳到 0 更符合实际含义。figsize用 6×3.2 是按 PDF 正文宽度约 16cm 反推的图片插入后基本满宽不缩放字看着最舒服。dpi150对 SVG 无影响但对同时导出的 PNG 版本有效报告中需要嵌入 Word 或聊天工具时用得上。4.4 手工测试数据的采集口径与清洗实习期间手工测试占比通常不低于自动化这部分数据靠人在工具里录清洗规则要提前定。我自己的三条规则是第一执行记录必须带轮次没有轮次的记录不进趋势图第二同一用例同一轮只保留最后一条状态前面的算覆盖写第三缺陷的「发现阶段」字段必填否则无法做逃逸分析——也就是有多少缺陷是回归阶段才暴露的这个数直接反映用例覆盖率。清洗后的数据再和 4.2 的自动化统计做交叉核对如果自动化显示某模块通过率 100%但手工又在该模块提了缺陷说明自动化用例覆盖不到这类场景这条结论写进报告比单列一堆数据有价值得多。常见做法是把交叉结果放进「用例有效性」一小节用两句话说明结论不需要额外图表。5. 交付前的 PDF 自检文本提取、字体嵌入与一页纸摘要PDF 生成完不要直接交。在线投递和系统解析都会读 PDF 文本层如果字体没嵌好或者文字被转成曲线检索和复制会直接失效面试官搜「缺陷密度」搜不到你的报告。自检第一步就是提取文本确认可读# verify_pdf.py 交付前自检文本层、页数、关键词覆盖 import pdfplumber REQUIRED [测试流程, 用例设计, 缺陷密度, 回归, 测试报告] with pdfplumber.open(软件测试毕业实习报告.pdf) as pdf: print(f总页数: {len(pdf.pages)}) text \n.join((p.extract_text() or ) for p in pdf.pages) for kw in REQUIRED: print(f{OK if kw in text else MISS} {kw}) # 检查是否出现方块字中文字符占比过低说明字体回退失败 zh sum(1 for ch in text if \u4e00 ch \u9fff) print(f中文字符 {zh}占比 {zh / max(len(text), 1):.1%})extract_text()返回空字符串通常意味着该页是纯图片或文字被转曲这两种情况都要重做转曲一般来自把 PDF 又过了一遍虚拟打印。关键词列表按报告结构挑五个缺哪个就说明对应章节被漏掉或者标题写得太口语化。中文占比低于 20% 要警惕正常中文报告这个值在 35% 以上。第二步查字体嵌入命令行一条就够pdffonts 软件测试毕业实习报告.pdf输出里每一行的 emb 列必须是 yes。有 no 的行说明该字体依赖阅读器本机字体换台机器就可能显示异常尤其是用到思源、Noto 这类不一定预装的字体时。第三步做一页纸摘要。实习报告二十页很正常但面试官只看前三分钟。摘要放封面之后用一张表列关键数计划用例数、执行率、去重缺陷数、缺陷密度、遗留缺陷率、自动化用例占比每个数字后面标出对应的报告章节号。这张表也是简历里「软件测试实习」那一条的数据来源写简历时直接抄不用再回头翻正文。最后一个小技巧投递用的文件名把版本和日期带上比如软件测试毕业实习报告_v3_20250610.pdf。系统解析和人工归档都靠文件名区分同名文件覆盖一次你就得重新导一遍 PDF。本文还有配套的精品资源点击获取