秋招笔试这种东西最怕的不是题难而是考完发现连题型都没摸清楚。2021年小米秋招测试开发方向第一场笔试我踩过坑也总结出一些门道。这份回忆帖写给正在准备测试开发岗校招的同学不管你是科班出身还是半路转测试搞清楚这份卷子到底在考什么、怎么答才能拿分比盲目刷题有用得多。这篇文章会从题型分布、高频考点、编程题思路、测试设计题框架、考后复盘和避坑经验几个维度完整拆解尽量还原当时考场的真实感受和解题过程保证你看完能直接用上。1. 整体印象这场笔试到底在考什么1.1 题型分布与分值逻辑先说一下整张卷子的结构我记得很清楚时长大概90分钟分为三个部分选择题单选加多选约30道、编程题两道、测试设计题一道大答题。从时间分配就能看出来选择题占了接近一半的分值但单题分值低编程题分值高却最容易让人在调试上卡死测试设计题看着字数多其实反而是最好拿分的部分只要你提前练过框架。这三部分的出题逻辑其实很有层次。选择题考察的是基础知识面的宽度网上俗称“八股文”实际上就是计算机基础四大件计算机网络、操作系统、数据结构、数据库加上软件测试理论。编程题考察的是代码基本功和问题拆解能力两道题难度有明显梯度第一道偏简单第二道会拐个弯。测试设计题则是回归测试开发的岗位本质考察你能不能站在测试的角度去审视一个真实功能。这里想多说一句很多同学在准备测试开发岗的时候容易把重心全压在刷算法题上结果到了测试设计题就懵了。但从第一场笔试来看测试思维和开发能力是五五开的甚至测试设计题的区分度比编程题还高。因为编程题大家都刷过能拉开的差距就是时间和细节而测试设计题如果你没练过可能连答题的角度都找不到。1.2 考察维度的真实权重从具体的分数占比来看我的体感是选择题45%左右编程题35%左右测试设计题20%左右。这说明什么说明小米对测试开发岗的要求是既要有扎实的基础又要有能落地的代码能力还要有测试岗位特有的思维方式。再往细了说选择题里计算机网络和操作系统各占三四道数据结构和数据库各占两三道软件测试理论大概五道左右。这个比例其实和其他大厂的测试开发岗笔试没有本质区别说明行业对测试开发工程师的通用能力画像已经非常成熟了。我当时备考的时候还在纠结要不要把重点放在某个方向上考完才发现均衡才是王道。还有一点容易被忽略的是选择题里会有两三道偏实际场景的题比如给你一段日志让你判断是哪种错误或者给你一个线上问题描述让你推测最可能的原因。这种题不考纯理论考的是你有没有真实接触过线上问题对没有实习经验的同学来说是最难啃的骨头。2. 逐题拆解计算机基础部分的高频考点2.1 计算机网络三次握手与状态码选择题里计算机网络的部分我记得最清楚的是有一道关于TCP三次握手的状态变化题问的是客户端发出SYN之后进入什么状态。答案是SYN_SENT这个不难但如果它换个问法问服务端收到SYN并回复SYNACK后进入什么状态那就变成SYN_RCVD很多人会跟ESTABLISHED搞混。这类题的坑在于它不会直接问你“三次握手过程是什么”而是把过程拆成节点来考你的细节记忆。另外一道比较有意思的题是给了几个HTTP状态码让你选出代表“服务器内部错误”的那个答案是500。题目本身没难度但它背后的知识密度很高。测试开发做接口测试的时候状态码是你判断问题归属的第一道线索。我后来在实际工作中发现很多同学会把404和403搞混401和403也分不清。403是服务器理解请求但拒绝执行401是未认证或认证失败这俩在接口测试里完全是两个排查方向。网络部分的复习建议是不要只背状态码的数字要把每个状态码对应的场景、响应头、可能的错误原因串起来。比如503和504的区别前者是服务不可用通常是被限流或降级了后者是网关超时通常是上游服务处理太慢这在实际排查中非常常用。小米笔试虽然只考了最基础的但准备的时候往深了准备才能保证选择题不丢分。2.2 操作系统进程线程与死锁操作系统考得比较常规我记得有一道题是问进程和线程的根本区别选项里有“进程是资源分配的基本单位线程是CPU调度的基本单位”这个正确表述也有“线程拥有独立的地址空间”这种错误干扰项。这个考点几乎是笔试必出难点在于理解地址空间的分配进程之间地址空间相互独立同一进程内的线程共享地址空间但每个线程有自己的栈和寄存器上下文。另一道题是死锁产生的必要条件四个选项分别是互斥、请求与保持、不可剥夺、循环等待。这道题不难但它属于那种“看着简单选项里一混淆就错”的题。比如把“请求与保持”改成“资源静态分配”很多人就会懵掉。资源静态分配策略其实是可以预防死锁的它要求进程一次性申请所有资源这本质上就打破了“请求与保持”这个条件。所以笔试考的不只是你对四个必要条件的记忆还有你对预防措施的敏感度。进程调度算法也是高频考点我记得卷子里有一道关于时间片轮转的简单计算题给了一个就绪队列和每个进程的服务时间问轮转一圈之后哪个进程先完成。这种题就是要沉下心画甘特图别心算。我在考场上一开始想心算结果算错了后来老老实实在草稿纸上画时间轴算是及时止损。2.3 数据库索引与事务的经典陷阱数据库的选择题主要围绕索引和事务展开。有一道题问的是“在什么情况下索引会失效”选项里有“对索引列使用函数”“使用LIKE %abc”“符合最左前缀原则的查询”等。正确答案是前两个。这个考点在实际工作中太重要了测试开发写SQL去验证数据的时候如果查询很慢第一反应就应该是看索引有没有生效。事务的考点集中在ACID四大特性和隔离级别上。我记得有道题专门问“脏读”是在哪个隔离级别下可能发生的答案是READ UNCOMMITTED。但更值得关注的是“不可重复读”和“幻读”的区别很多人在这里搞混。简单来说不可重复读是同一个查询在事务内两次执行返回了不同行因为别的提交改了这行的数据幻读是两次执行返回了不同数量的行因为别的提交插入或删除了行。MySQL InnoDB的可重复读级别通过MVCC解决了不可重复读但幻读还需要间隙锁来防御。这个知识点在笔试里可能只考一道选择题在面试里却经常被深挖。数据库部分我的备考心得是与其去背概念不如装个MySQL自己练。自己建一张表插几万条数据加索引和不加索引分别跑一下慢查询看看执行计划隔离级别的各种异常也自己开两个事务窗口演示一遍。这样操作下来选择题里那些看着抽象的描述你一眼就能看出哪个是对的。3. 编程题实战从题目要求到完整解法3.1 第一道编程题字符串处理与哈希思想的结合第一道编程题题干不长大意是给定一个只包含小写字母的字符串请找出第一个只出现一次的字符如果不存在则返回-1。字符串长度不超过100000。这道题其实蛮经典LeetCode 387题的原型。在笔试环境下它考察的核心是用合适的数据结构来降低时间复杂度。最直接的思路是两层循环暴力遍历第一层循环选字符第二层循环查重复时间复杂度O(n²)。当字符串长度到100000的时候这个复杂度在在线评测环境里大概率会超时。更合适的做法是用哈希表记录每个字符出现的频次第一遍遍历统计第二遍遍历查找第一个频次为1的字符时间复杂度O(n)空间复杂度O(1)——因为字符集只有26个字母。我当时写的Java版本大致是这样的public int firstUniqChar(String s) { int[] count new int[26]; for (char c : s.toCharArray()) { count[c - a]; } for (int i 0; i s.length(); i) { if (count[s.charAt(i) - a] 1) { return i; } } return -1; }这里有个小细节值得注意用数组代替HashMap来统计字符频次是这类“字符集限定”题目的常见优化手段。数组的访问比HashMap的哈希计算和链地址法查找更快代码也更简洁。笔试考察的不只是你会不会做还有你熟不熟悉这些常规优化。另一个容易丢分的地方是边界条件。字符串为空怎么办长度为1怎么办题目说“不存在则返回-1”那空字符串也属于不存在。很多同学代码主逻辑没问题但忘记考虑空串在在线评测里就会挂掉一个测试用例。这个习惯需要平时刷题就养成我见过太多人栽在“题目没说空串所以不处理”这个误区上实际上判题数据里一定会有空串。3.2 第二道编程题链表的反转与局部操作第二道编程题我记得是链表的反转但加了个条件给定一个链表每两个相邻节点为一组进行反转。这个就是LeetCode 24题的Swap Nodes in Pairs。它比完全反转链表难在需要维护的指针更多非常考验对链表指针操作的熟练度。我在考场上的第一反应是递归解法因为递归的思路很直接先把前两个节点交换然后递归处理剩下的部分。写出来大概是def swapPairs(head): if not head or not head.next: return head first head second head.next first.next swapPairs(second.next) second.next first return second但考场上我自己写的是迭代版本因为害怕递归深度太高导致栈溢出。其实这道题的链表长度没有明确限制理论上递归也是安全的但迭代版本更容易让阅卷人看到你的思路也更稳。迭代版本的写法是引入一个虚拟头节点dummy让它的next指向head然后通过prev、first、second、temp四个指针来回跳。关键点在于每完成一组交换后要把prev移动到新的位置并且不能断链。我交卷前特意检查了奇数个节点的情况如果最后只剩一个节点应该保持不变。这里想多说一句链表题在笔试中的出现频率非常高因为它的输入输出格式简单但边界条件多非常适合区分层次。复习的时候一定要把链表的基础操作练到肌肉记忆包括反转、删除倒数第N个节点、合并两个有序链表、判断是否有环。每一道题都不必刷得太深但必须保证在十分钟内能写出bug free的版本。3.3 编程题的答题策略与代码规范编程题这块我踩过最大一个坑是时间分配。第一道字符串题我大概花了10分钟第二道链表题我越想越复杂最后花了30多分钟才调通。事后复盘其实第二道题的节点两两反转本质就是在反转整个链表的基础上加了一个“分组”的概念应该先想清楚整体思路再动手写而不是边写边想。还有几个实际有用的建议。第一在线编程环境通常支持切页但你切出去搜索语法是会被监控的与其冒险不如平时就把常用的API记牢。第二提交前务必跑一遍题目给的示例加几个自己想到的边界用例比如空输入、单元素输入、全重复输入。第三如果时间不够可以只写核心逻辑用注释说明思路阅卷老师看重的是你的逻辑能力而不是你非要AC。代码规范方面变量命名、缩进、还有一些无效代码的清除都会影响你的整体印象分。我见过有同学在代码里留了大段被注释掉的调试代码这在正式的笔试评分里虽然不是扣分点但会给阅卷者留下“思路不干净”的印象。在实力接近的情况下这些细节可能就是区分你和他人的因素。4. 测试设计题怎么答才不像没做过测试的人4.1 登录功能测试用例的完整设计框架最后一道大答题考的是测试设计我记得非常清楚题目是请为Web端登录功能设计测试用例要求覆盖功能、安全性、兼容性和性能四个维度。这道题没有标准答案但它的评分点非常明确你能否用工程化的方式组织你的测试思路。我当时是按照标准的测试用例设计框架来写的表头包括用例编号、所属模块、前置条件、测试步骤、输入数据、预期结果、优先级。先把整体结构搭出来再往里填内容。功能测试这里我分了几类正常登录正确的用户名和正确密码、异常输入错误的用户名、错误的密码、用户名为空、密码为空、用户名或密码包含特殊字符、账号状态账号被锁定、账号不存在、密码过期。安全测试方面要考虑到暴力破解的防护、密码在传输过程中是否加密、登录状态下的会话管理。兼容性测试要覆盖主流浏览器Chrome、Firefox、Edge、Safari和不同操作系统Windows、macOS、Linux。性能测试要验证登录接口在并发压力下的响应时间。这道题想拿高分光列用例还不够还要说明你的设计依据。比如为什么要把“密码错误5次后账号锁定”单独列出来因为在真实的系统设计里这就是一个典型的边界值场景也是安全测试的必测点。我当时的策略是在每个维度后面加一段简短的测试说明解释这个维度的风险点和测试意图。4.2 从缺陷报告展示测试思维除了用例设计这道题还有一小问是如果你在日常测试中发现了一个偶现的登录失败问题你会怎么排查和报告这个问题问得很刁钻因为它考察的不是你写用例的能力而是你面对真实缺陷的处理流程。我的答题思路分四步第一先尝试复现记录复现步骤和失败时的网络请求日志看是前端报错还是后端返回异常第二缩小复现范围逐个排除浏览器环境、网络环境和操作系统环境的影响第三找到原因后写缺陷报告标题按“模块现象触发条件”的模式命名附上日志、截图和复现频率第四如果不是必现问题要在缺陷报告里标注“偶现约5次中复现1次”并附上自己编造的复现脚本或测试数据。这一步其实是整个测试设计题里我最想提醒大家重视的部分。因为面试官和阅卷人都很清楚用例设计谁都能背一套框架但能不能把一个偶现问题排查清楚才真正体现你有没有做过测试。如果你没有任何实习经验也建议你在简历里写一两个自己调试过的项目问题哪怕是自己写代码时遇到的也可以套用这个流程来描述。4.3 测试理论题的答题逻辑与避坑选择题里的测试理论题有一道是关于等价类划分的题目大意是输入框要求输入11位手机号那么下列哪组数据是最好的等价类测试用例A. 1和2、B. 10位和12位、C. -1和11位正常、D. 11位正常、9位、12位、空值。正确答案应该是D因为等价类划分要求覆盖有效等价类和无效等价类而选项D覆盖了正常、长度不够、长度超长、空值这四种典型场景。这道题本身不难但它提示了一个重要的答题逻辑遇到测试理论题不要只凭感觉选而要先想清楚它考的是哪个概念。等价类划分的核心思想是把输入数据按“是否等效”分组同一组内的数据用任意一个代表即可不同组的数据都要覆盖到。边界值分析则是在等价类划分的基础上关注每个等价类的边界值比如手机号11位那10位、11位、12位就是边界。还有一个高频考点是测试金字塔问的是单元测试、集成测试、E2E测试的层级和比例关系。这个知识点在笔试里可能只占两分但面试时几乎必问因为你进入公司后可能会直接面对“如何分层设计自动化用例”的具体问题。备考时一定要把测试理论框架完整过一遍而不是只看零散的概念题。5. 考后复盘笔试反映出的能力缺口与学习路线5.1 从真题反馈到知识体系的查漏补缺笔试结束后的复盘其实比笔试本身更值钱。我的做法是把每道错题都还原成知识点标记成三类完全不记得的、知道但选错的、会做但时间不够的。这三类对应完全不同的复习策略。完全不记得的知识点要重新学知道但选错的是因为理解不够深会做但时间不够的是熟练度问题需要多刷题。拿我自己举例我在选择题里错了一个关于TCP状态迁移的题这说明我对三次挥手和四次挥手的细节掌握还不牢。复习的时候我没有只看教材而是直接打开Wireshark发起一次真实的TCP连接观察了SYN、SYNACK、ACK的报文交互。这种方式比背书深刻得多以后再遇到状态迁移题我在脑子里能直接浮现出抓包的截图。对于测试开发岗来说知识体系的宽度和深度同样重要。基础四大件是底线测试理论是专业线编程能力是动手线这三条线缺一不可。我当时用一个Excel表管理自己的知识点清单每掌握一个知识点就打个勾考前复习的时候只看没打勾的部分效率非常高。5.2 自动化测试和工具链的学习路径从笔试题目反推岗位需求可以发现小米对测试开发岗的期待不只是“会手工测试”而是要具备自动化测试的能力。笔试虽然没有直接考工具的使用但了解主流测试工具和框架能让你在后续面试中拉开差距。我给自己的学习路径是先从接口测试入手掌握Postman和Python的requests库因为接口是自动化测试最容易落地的层次。然后学习pytest框架把断言、fixture、参数化这些核心机制搞明白用真实的HTTP接口服务练手。单元测试层可以看看pytest如何覆盖Python代码UI自动化则放到最后因为它的成本和稳定性都不容易控制但至少要能写简单的Selenium脚本。工具链方面除了测试框架还要了解CI/CD的基本流程知道如何在Jenkins里配置定时任务、在测试失败时发送通知。现在很多公司在测试开发岗位的JD里都写了“熟悉业务监控和日志系统”所以Tomcat、Nginx、ELK这些中间件的简单使用也应该有基本了解。5.3 测试开发面试“八股文”的取舍与准备网上流传的“测试开发面试八股文”很多但笔试里真正会考的就是那些计算机基础、测试理论和算法的基础题。与其把所有八股文都背下来不如把高频考点有取舍地复习。我的建议是按优先级排最高优先级是数据结构与算法因为它直接对应编程题其次是操作系统和网络的笔试高频题比如进程线程、死锁、TCP/UDP、HTTP状态码再次是数据库索引和事务最后才是软件测试理论。测试理论虽然分值占比不一定最高但它是你区别于纯开发候选人的核心标签所以也不能放。准备“八股文”的正确姿势是“理解后再用自己的话转述”。比如死锁这个考点你如果只是背“互斥、请求与保持、不可剥夺、循环等待”四个词面试官换个问法你就答不上了。但如果你能结合一个具体场景比如两个线程各自持有一把锁同时等待对方的锁再说明这四个条件如何在这个场景中成立面试官就会觉得你是真懂。6. 考场实操经验与避坑指南6.1 时间分配和做题顺序的血泪教训先说做题顺序我的建议是发卷后先花2分钟扫一遍所有题目把选择题里一眼会做的先选掉不会的标记出来不要恋战。然后直接做编程题因为编程题需要时间调试越晚做越紧张。最后回头处理选择题里比较难的题目以及测试设计题。我为什么这么建议因为选择题虽然占比高但单题分值小与其在两道不会的选择题上纠结8分钟不如把这8分钟拿去检查编程题的错误。我在实际考试中就是先做选择题结果在一道网络题上卡了5分钟导致后面编程题时间紧张这个教训应当引以为戒。时间分配的参考值可以是选择题25分钟、编程题35分钟、测试设计题20分钟、检查10分钟。当然每个人的速度不一样但这个比例大方向是对的。尤其是检查环节千万不要省你要检查的不是答案对不对而是有没有漏题、有没有把答题卡选项涂错。6.2 在线笔试平台的几个隐性坑现在的线上笔试平台五花八门小米当时用的平台我记得是有自动保存功能的但这个功能有时候也会成为你的敌人。比如你在本地IDE里写好了代码粘贴到平台编辑器里时可能会因为缩进不一致或特殊字符而报错。我的建议是粘贴后务必先编译一次再做几个简单测试用例跑一遍确认平台环境没问题再提交。还有一类坑是输入输出格式。编程题有时候要求从标准输入读取多行测试用例有时候是函数接口形式这两种形式对代码结构的要求完全不同。2021年小米的编程题我记得是函数接口形式不需要自己处理输入输出这其实是更友好的。但如果遇到需要自己处理输入的题一定要先写一个demo去跑示例确认读取逻辑正确后再开始写算法。另外要特别提醒的是笔试过程中如果网络波动导致页面卡顿不要反复刷新先截图保留证据再联系平台客服。曾见过有同学因为网络问题交了白卷后面申诉流程非常麻烦。6.3 一些容易被忽略的细节最后说几个容易被忽略但很关键的细节。第一简历上写了Linux技能笔试的选择题里就真的出现了基本的Linux命令考点比如查看进程用ps、查看端口占用用netstat或ss。这类题不会难但你如果简历写了就得保证能答对。第二笔试通知里通常会附一个工具下载链接提前安装好并测试不要等到开考前5分钟才手忙脚乱地配环境。从第一场笔试到最终拿到Offer中间还会经历面试和HR面但笔试作为第一个筛选关卡它的重要性被很多人低估了。它在往往能把你备考的成果做一次系统性的检验让你看到自己在知识结构上的真正缺口。基于我个人经历踏踏实实刷好真题、练好代码、储备好测试思维比临时抱佛脚有用得多。如果你正在准备测试开发岗不妨从弄懂这份笔试题开始一步步推进自己的复习计划。