省赛败北后的软件测试竞赛复盘:从工具使用到测试思维的全面避坑指南
发布时间:2026/8/30 17:46:17 作者:尧图编辑部 阅读量:1,286

省赛败北佬们一路顺利——一次竞赛失利后的完整复盘与避坑指南打出省赛赛场的门时机器上的计时器还剩下四十分钟。看着其他队伍在紧张地打包代码和报告我们三个人坐在工位上谁也没有先开口。明明赛前准备了那么久刷过的题、练过的环境、背过的命令真到赛场上却像被一层雾罩住关键时刻接二连三地出问题。最终的结果早在下午就已经有预感提交界面显示的成绩远低于平时训练的平均水平。回来的路上群里有人发了句“佬们一路顺利”这句话像一根刺扎了整整一周。这篇文章不是获奖经验分享而是一次失败者的完整复盘。我会把从报名、备赛、赛前准备、比赛当天的全过程以及最终的失败原因全部拆开来讲。里面包含实际踩过的坑、代码层面的教训、团队协作的问题还有一套重新整理的省赛备赛路线。如果你正准备参加省级编程、软件测试或大数据相关的竞赛这篇内容应该能帮你避开我们走过的弯路。1. 赛前从组队到备赛我们做了什么1.1 比赛背景我们参加的是省级职业院校技能大赛中的软件测试赛项。比赛形式是团队赛每队三个人需要在规定时间内完成指定系统的功能测试、性能测试、自动化测试和白盒测试最后提交测试报告。比赛时长是一天上午是环境配置和功能测试阶段下午是性能测试、自动化脚本编写和报告撰写最后还有一轮现场答辩。竞赛系统基于 Java Web 技术栈被测系统是主办方提供的一个模拟商城项目数据库使用 MySQL测试工具限定使用 JMeter、Selenium 和 JUnit。这里先说明一下我们的实际情况。三个人都是计算机相关专业平时在课程里接触过 Java 和 MySQL但对软件测试的理论和工具链接触不多。报名时我们以为比赛考的是编码能力所以把大量时间花在补习 Java 基础语法和 SQL 查询上。这个判断偏差从一开始就为后来的失败埋下了伏笔。1.2 备赛时间线我们是赛前大约一个半月开始正式准备的。备赛计划分为三个阶段第一阶段第 1~2 周主要用于了解赛项规程和比赛工具。我们在网上找了一些往年的样题和模拟文档初步了解了功能测试用例、缺陷报告、性能测试指标这些基本概念。这一阶段的主要成果是认识了比赛要考什么但还没有真正动手操作过。第二阶段第 3~4 周进入实际训练。我们搭建了 JMeter 和 Selenium 环境用一个开源的电商项目做练习对象。功能测试用例写了大概一百多条性能测试脚本调了三四轮自动化脚本也写了一部分。但这个阶段我们暴露出一个很大的问题三个人各有各的习惯测出来的结果没有统一归档缺陷报告格式也不一致等到赛前才发现根本没法合并成一份完整的测试文档。第三阶段第 5~6 周模拟训练和查漏补缺。我们按照比赛时间完整模拟过两次每次都是三个人分工一个写功能测试用例一个盯性能测试一个写自动化脚本。模拟成绩看起来还可以但是细看会发现每次都有环节没做完比如测试报告写得比较潦草或者部分缺陷没有截图留证。我们当时没有足够重视这些“小问题”觉得正式比赛时注意一点就好。事实证明这些小问题不会自动消失只会换一种形式在赛场上重新出现。1.3 环境搭建中踩过的坑赛前训练时我们在环境上花了不少冤枉时间这里挑几个影响比较大的说一下。第一个坑是 JDK 版本问题。比赛机装的 JDK 是 1.8而我们训练时用的电脑上装的是 JDK 17。JMeter 本身对 JDK 版本比较敏感我们一开始用 JDK 17 跑出来的测试数据和后来在 JDK 1.8 环境里跑出来的结果差别很大尤其是响应时间指标。当时差点以为是脚本写错了排查了半天才发现是 JDK 版本不同导致 JVM 参数和垃圾回收行为不一样。第二个坑是 JMeter 分布式压测配置。比赛要求对被测系统进行性能测试需要模拟一定数量的并发用户。我们用的是单机压测但被测系统部署在本地虚拟机里虚拟机的 CPU 和内存配置不高。一旦并发数超过一百被测系统自身就成了瓶颈响应时间暴涨监控曲线非常不稳定。后来我们调整了虚拟机的资源配置同时限制了 JMeter 的聚合报告采样范围数据才勉强稳定下来。但比赛当天机器配置和训练环境不同这个坑又回来了。第三个坑是 Selenium 浏览器的驱动版本。我们训练时用的 Chrome 版本比较新对应的 chromedriver 也更新了。赛前忽略了比赛机的浏览器版本可能不同结果比赛当天早上自动化脚本在启动浏览器那一步直接报错浪费了将近二十分钟才找到匹配的驱动版本。这种环境类问题在训练中一旦遇到一定要记录到自己的环境清单里而不是临时解决完就过去了。2. 比赛现场实录我们是怎么一步步落后的2.1 上午的致命节奏问题比赛当天早上八点半进场九点正式开始。拿到试题后我们按赛前模拟的分工迅速进入状态A 同学负责功能测试用例设计B 同学负责性能测试脚本我负责自动化用例编写。前一个小时还算顺利。功能测试用例的编写思路很清晰按照需求文档把登录、注册、商品列表、购物车、下单、支付这些核心模块逐个过了一遍。但到上午十点半左右问题出现了。被测系统在运行过程中出现了几个之前没有遇到过的异常比如注册时邮箱格式校验在前端和后端不一致购物车删除商品后刷新页面商品数量没有同步更新。我们花了很多时间讨论这些缺陷应该归到哪个功能模块反而耽误了继续往下测的进度。更严重的是JMeter 性能测试开始了才发现比赛机的网卡虚拟化策略和训练环境不同压测时本机 IP 被限制并发连接数导致测试结果里出现了大量连接超时。B 同学反复调整线程组参数从 50 并发调大再调回前前后后折腾了将近四十分钟。等性能测试的数据终于稳定下来已经快十二点了留给自动化测试的时间只剩下半天的一小半。上午结束时的成果是功能测试用例写了八成但缺陷报告只提交了少数几条性能测试脚本能跑但数据收集不完整自动化测试只完成了登录模块的脚本。整个上午的实际完成度可能只到赛前模拟的六成。2.2 下午的自动化崩溃下午的自动化测试阶段问题彻底爆发了。我们在赛前模拟中写好的 Selenium 脚本在比赛机上无法直接运行。问题出在页面元素的定位方式。训练项目用的是基于 Bootstrap 的老式前端模板很多按钮是input标签配合class属性控制样式。而比赛提供的被测系统使用了 Vue 动态渲染部分按钮在页面加载完成后才挂载到 DOM 树上直接使用By.id()和By.name()定位不到元素。我们花了不少时间尝试各种等待方式从Thread.sleep()到WebDriverWait最终改写了大半的定位逻辑才让基础流程跑通。这个过程非常消耗时间。我们原本计划用 Selenium 覆盖登录、搜索、加购、下单、支付五个核心流程最后只完成了前三个。支付流程涉及第三方接口的模拟页面元素在支付成功后发生多次跳转切换我们赛前没有准备这种场景的定位策略赛场上也不可能临时想到完善的方案。写到这里我尤其后悔一点我们在训练时没有实测过不同前端框架下的页面元素定位差异默认只要脚本在自己电脑上能跑比赛就一定没问题。这种侥幸心理在竞赛中是致命的。2.3 测试报告的仓促收场下午三点半左右开始写测试报告。按照评分标准测试报告占很大的分数比例包括测试环境说明、测试用例设计、缺陷报告、性能测试结果分析、自动化测试结果这几大部分。但实际上到这一步时我们手头的数据非常有限。功能测试还有很多模块没有覆盖到缺陷虽然发现了十来个但提交时只完成了部分截图和复现步骤部分缺陷等级划分也不够准确。性能测试因为上午反复调参最后导出的数据里缺少压测前后的环境基线对比报告的完整性明显不足。自动化测试只有登录、搜索、加购三个流程的截图支付部分没有能跑通只能文字描述。我们三个人分工写各自负责的部分但报告格式和图表规范没有统一导致最后拼接时出现了大量的重复与格式不一致。时间还剩半小时的时候我们还在调整报告表格的对齐和图片排版几乎没有时间回头检查测试数据的准确性。最终提交的版本是一个我们自己都清楚不太合格的报告。2.4 答辩环节的准备不足比赛最后一个环节是答辩。评委根据提交的测试报告现场随机抽取问题提问。我们准备了一些常见问题答案比如“你是如何设计测试用例的”“性能测试的指标有哪些”“自动化测试如何保证稳定性”。但真正被问到的问题是“被测系统的数据库出现了唯一约束冲突你会从哪些层面分析这个问题的根因”我们三个人面面相觑。这个问题涉及数据库约束、后端异常处理、并发控制等多个层面我们的回答只停留在表面甚至一度回答偏向了 MySQL 的DUPLICATE KEY语法细节而没有从测试分析的角度给出系统性的排查思路。赛后我们反复回想这个问题的考察点其实非常清晰一个合格的软件测试人员不仅要能发现问题还要能分析问题的产生链路并对不同模块间的相互影响有全局认识。而我们的训练中只练了“怎么测”没有练过“为什么会出现这个问题”更没练过“测出问题后怎么从架构层面去解释它”。3. 赛后复盘败因在哪里3.1 技术层面的真实差距比赛结束后我们花了一个周末把赛题重新做了一遍逐项对比评分标准整理了技术层面的差距清单。能力项赛前自評赛中表现实际差距功能测试用例设计良好中等用例粒度不够细致边界值设计不足缺陷报告撰写中等较差缺少系统性的缺陷分类与影响范围分析性能测试脚本编写良好中等对压测环境和被测系统瓶颈不敏感自动化测试脚本中等较差元素定位策略单一缺乏健壮性处理数据库SQL基础良好中等对约束、索引、事务理解不透彻测试报告编写中等较差数据完整性不足结论缺少依据这组对比里最大的差距不是“会不会用工具”而是“有没有形成完整的测试分析思维”。赛前我们掌握的更多是独立的操作技能比如怎么设置 JMeter 线程组、怎么用 Selenium 的findElement但这些技能是零散的没有串联起来形成一套从需求分析到测试设计再到缺陷追踪的方法论。3.2 训练方法的核心问题我们在备赛时犯了一个很典型的错误过度关注工具操作忽略了对被测系统的理解。整个备赛过程中我们反复训练的都是“如何用 JMeter 压测”“如何用 Selenium 写脚本”但对被测系统的业务逻辑、数据库设计、接口交互流程关注较少。这直接导致比赛时面对一个我们不熟悉的业务系统无法快速拆解测试范围也无法判断发现的异常是前端问题、后端问题还是数据问题。如果重新准备一次我会先花两到三天完整梳理被测系统的架构前端框架是什么、后端接口有哪些、数据库表结构如何设计、核心业务链路是什么。只有对系统有了整体认识测试用例设计才有依据缺陷分析才能找到根因性能测试的瓶颈分析也才能落到具体模块上。另外一个训练方法上的问题是我们没有建立自己的测试模板库。赛前写的功能测试用例、缺陷报告、性能测试报告都是临时拼凑的格式没有统一的标准。比赛时一旦紧张就会在排版和格式上浪费大量时间。正确做法是在训练初期就确定一套自己的模板包括用例编号规则、缺陷等级标准、报告章节结构之后每一轮训练都强制使用这套模板。3.3 时间分配与团队协作的隐患比赛的时间分配是一个非常值得复盘的点。我们现在来看如果重新安排上午应该优先保证“能稳定提交的完整成果”而不是花大量时间追求“覆盖更多模块”。比如功能测试阶段与其花半小时去讨论一个偶发缺陷到底该归为严重还是中等不如先把核心流程的用例跑完、截图存证。又比如性能测试阶段第一次压测已经拿到了一组可用数据就不应该反复调整参数追求“更漂亮”的曲线而应该优先记录环境状态和结果后面有时间再补充测试。团队协作方面的核心问题是三个人的分工边界太模糊。说是各管一个方向但实际上功能测试和缺陷提交有重叠性能测试和自动化测试都要操作被测系统导致出现了“两个人同时改系统数据、另一个人跑测试用例”的情况测试数据互相干扰结果无法复现。赛后我们统一了认识团队赛的分工不能只看模块还要看资源占用。比如功能测试用例执行时是会修改系统数据的而性能测试需要的是相对干净的数据环境这两者的执行时间必须错开否则数据一乱所有测试结果都不可信。3.4 心态和抗压能力心态层面的问题比赛中表现得很明显。上午的性能测试反复出问题时B 同学明显变得急躁起来频繁修改参数每改一次就跑一次压测结果越改数据越差。这种“应急式操作”是竞赛中最容易被忽视的大忌因为每一次错误的调整都会消耗时间而时间的流逝又会加大心理压力形成恶性循环。这个问题在后来的复盘里得到了比较清晰的答案我们在训练中从来没有人为制造过“意外”场景。每次模拟训练环境都是提前配好的工具版本一致被测系统运行正常一切都按计划进行。这样练出来的心态是“只要跟着流程走就不会出问题”而不是“出问题之后如何快速定位并止损”。如果下次再参赛我一定会在训练中主动加入故障演练比如提前把 JMeter 版本换掉、把被测系统的某个接口停掉、在报告写到一半时让电脑内存告警逼着自己习惯处理和预期不一致的情况。4. 省赛备赛避坑指南很多人写竞赛经验时只讲成功案例但失败的教训往往更有参考价值。下面把我这次比赛中踩过的最有代表性的坑整理成一张对照表踩坑点赛场表现根因分析解决建议环境版本不一致脚本无法启动、压测数据异常训练环境与比赛环境脱节提前通过官方渠道确认比赛环境建立环境清单页面元素定位失败自动化脚本大面积报错只练了老式前端没覆盖动态渲染页面训练中主动切换不同前端项目练习元素定位缺陷报告格式不统一报告拼接混乱重复内容多三个人各自为政模板缺失首周就确定统一模板并全程强制使用性能测试反复调参时间浪费数据不完整缺少“一次压测就拿到有效数据”的训练训练时规定只能调整两轮参数其余靠分析数据库相关问题答不上答辩失分对数据库约束、事务、并发理解浅补充数据库原理层面的系统学习时间分配失衡报告仓促收尾前面环节超时没有止损机制赛前制定时间节点清单并严格执行这张表里的每一条都是我们用一场比赛付出的代价换来的。如果你正在准备类似的比赛可以对照检查自己的备赛过程。5. 下一轮备赛的技术路线如果接下来重新准备一轮我会按照下面这个路线来安排训练。5.1 第一阶段工具和基础能力第 1~2 周这一阶段的目标是快速掌握比赛工具的基本用法但不追求深入。JMeter线程组、参数化、断言、聚合报告、监听器。Selenium元素定位、常用等待、截图、TestNG 或 JUnit 集成。MySQL增删改查、多表查询、约束、索引、事务基础。Java 基础面向对象、集合、异常处理。示例用一分钟快速创建一个最简单的 JMeter 测试计划。# 在 JMeter bin 目录下启动 GUI ./jmeter然后在测试计划中添加一个 HTTP 请求访问被测系统首页添加聚合报告监听器运行后查看响应时间、吞吐量等指标。这个阶段不需要追求复杂重点是让每个工具都能跑通。5.2 第二阶段系统化用例设计第 3~4 周这一阶段的核心是建立测试设计思维而不是再学新工具。训练内容功能测试用例编写使用等价类、边界值、场景法、错误推测法。缺陷报告的完整撰写包含标题、前置条件、复现步骤、预期结果、实际结果、优先级和严重程度。性能测试场景设计包括负载测试、压力测试、稳定性测试的区分。这里给出一个功能测试用例的示例模板用例编号TC-LOGIN-001 测试名称登录功能-正确用户名和密码 前置条件注册用户 user01密码为 123456 测试步骤 1. 打开系统登录页面 2. 输入用户名 user01 3. 输入密码 123456 4. 点击登录按钮 预期结果登录成功跳转到系统首页 实际结果待填写 缺陷等级待填写不要小看这种模板化的写法它能在比赛中帮你节省大量时间也让报告的完整性更有保障。5.3 第三阶段综合模拟与故障演练第 5~6 周这一阶段只做一件事模拟比赛。模拟时要注意三点第一严格按比赛时间执行到点必须交卷不能出现“再给我十分钟就写完了”的情况。第二每次模拟都要换一个不同的被测系统可以从 GitHub 上找开源项目提前感受不同技术栈下的测试差异。第三模拟结束后必须做复盘把失败点记录到问题清单里下次模拟前重点检查。第三周开始每周加入至少一次“故障演练”具体做法是# 模拟环境故障将被测系统端口占满 # 在 Linux 终端执行 for i in $(seq 1 100); do curl -s http://localhost:8080 /dev/null done # 此时再用 JMeter 执行压测观察连接超时和响应时间变化 # 要求快速定位是环境问题还是脚本问题这种训练能锻炼对系统状态的敏感度。比赛中最怕的不是出错而是出错之后分不清是自己脚本的问题、系统的问题还是环境的问题。5.4 技术栈的延伸学习除了比赛直接用到的工具我们还应该补三块底层知识数据库原理事务隔离级别、锁机制、索引失效场景、慢查询分析。操作系统基础进程、线程、内存、文件描述符、CPU 和内存监控。网络协议HTTP 请求响应模型、Cookie 与 Session、TCP 连接复用。这三块知识不会直接出现在赛题操作里但它们是分析问题的底层工具。比如性能测试中的连接超时问题如果不懂 TCP 连接数限制只会盲目调高 JMeter 的线程数结果只会更糟。6. 给后来者的一些建议如果你正在准备比赛或者正打算报名下面几条是最想让你知道的第一明确比赛到底考什么。花一周时间把所有官方文档、往年样题、评分标准吃透比盲目刷十天工具教程更有价值。很多队伍包括我们直到比赛前一周才真正弄明白评分侧重点。第二版本和环境问题就是分数。比赛当天最不值钱的失误就是环境类问题。统一 JDK 版本、Chrome 版本、数据库版本提前到比赛场地踩点测试这些细节一定要做充分。第三用例设计能力是基本功。工具只是载体真正拉开分数差距的是同一个功能模块你能想到多少条用例边界覆盖有多全面缺陷分析有多深入。平时可以拿自己学校的系统练习比如教务系统、图书馆系统、选课系统都是很好的测试对象。第四不要忽视团队协作。三个人之间信息要透明谁的测试数据会影响谁谁的操作会占用共同的被测系统这些都要在赛前明确形成一套约定。比赛不是单兵作战配合失误的代价比技术失误更大。第五失败不是终点。省赛只是竞赛道路上的一个节点不是全部。一次失利暴露的是准备层面的问题不一定是能力天花板。把失败的原因拆透反而能让下一轮备赛更有方向。7. 写在最后打完最后一个收尾字符回想这一整轮比赛我最深的感触是竞赛的真实难度不在于题目本身有多难而在于你能否在有限的时间内稳定地输出平时训练中已有的水平。我们输不是输在了不会用某个工具而是输在了准备时对“不确定性”的估计不足。环境会变系统会变题目会变只有提前覆盖了这些问题赛场上才能稳住。离开赛场时看到朋友圈里另一支队伍发了张合影配文是“省赛结束佬们一路顺利”。我知道他们说的“佬们”并不是我们。但换个角度想这也是个好兆头——把“佬们一路顺利”送给继续奋战在实验室里的每一个选手也送给下一次还会站到赛场上的自己。下一次我们会准备得更充分一点。