秋招季刚结束,身边不少学弟学妹问起小米测试开发岗的笔试情况,正好我参加了2024年秋招小米集团测试开发岗第二批笔试,趁着记忆还没完全模糊,把整个过程的体验、题型结构、踩过的坑和备考思路完整复盘一遍。这篇文章不是官方试题答案,而是以一个过来人的视角,聊聊测试开发岗笔试到底考什么、大厂在筛什么样的人,以及从一场笔试反推出来的学习路线。无论你是准备接下来的秋招补录、春招,还是明年才毕业想提前规划,这篇复盘都能帮你少走不少弯路。
1. 第二批笔试的真实画像:题型分布与时间压力
1.1 从投递到笔试:时间线与流程细节
小米的秋招流程通常是网申、笔试、面试、offer发放这几大步,笔试一般分为提前批和正式批,正式批又会有多批次安排。我参加的是第二批笔试,这一批的笔试通知在投递简历后大约一周左右发到邮箱,给了一个准备时间窗口,但说实话这个窗口对很多人来说是不够从容的——因为同一时间往往还有其他互联网公司的笔试,时间冲突是秋招季最常见的尴尬事。
关于笔试形式,线上笔试平台用的是牛客网这类在线评测系统,要求双机位或单机位摄像头监控,需要提前调试好网络和浏览器环境。我那一批的笔试时长为120分钟,题量不小,整体感受是:选择题覆盖面广但难度不算特别深,真正拉开差距的是编程题和测试用例设计题。这和我之前做过的一些互联网公司测试开发岗笔试风格相似,但小米这批在用例设计题上的占比明显更高,这应该和岗位属性有关。
有一点要特别注意:不同批次的笔试难度和题型顺序可能不一样,有的同学反映他们那批选择题偏难,编程题只有一道,而我们这批是两道编程题加一道用例设计大题的配置。所以网上看前人经验帖只能作参考,千万别押题式准备,该覆盖的知识面一个都不能少。
1.2 题型结构与分值权重
我参加的这批笔试,整体结构大概是这样:
| 题型 | 题量 | 建议用时 | 考察重点 |
|---|---|---|---|
| 单选题 | 约20道 | 25分钟 | 计算机基础、测试理论、编程语言细节 |
| 多选题 | 约10道 | 15分钟 | 操作系统、网络协议、测试方法边界 |
| 编程题 | 2道 | 50分钟 | 数据结构、算法设计、边界处理 |
| 测试用例设计题 | 1道 | 30分钟 | 测试思路、覆盖度、工程意识 |
选择题部分涵盖的内容非常杂,从计算机网络(TCP三次握手、HTTP状态码)到操作系统(进程线程区别、死锁条件)、数据结构(二叉树遍历、哈希冲突处理)、数据库(SQL查询、索引原理)、测试理论(等价类划分、边界值分析、V模型和敏捷模型区别)都有涉及。题目的难度并不算高,基本属于“你认真复习过就会,没看过就只能蒙”的类型,真正考察的还是基础是否扎实。
多选题是很多人的丢分重灾区,因为少选多选都不得分,而且选项设计得很有迷惑性。比如考软件测试的覆盖标准时,条件覆盖和判断覆盖的区别、判定-条件覆盖的组合要求,这些概念如果只是背了定义而没有真正理解,看到选项就会犹豫。
1.3 120分钟怎么分配才合理
这是我这次笔试最想分享的教训之一:时间分配会直接影响成绩上限。我前30分钟做选择和多选,节奏还行,但到了编程题时心态出了变化,第一道题本来有思路,结果实现时纠缠在细节里,前前后后花了35分钟才通过,导致第二道编程题时间紧张,最后用例设计题只能仓促写完。
如果重新来一次,我会这样分配:选择题25分钟内完成,遇到拿不准的立刻标记跳过,绝不恋战;多选题15分钟,凭第一直觉快速作答,回头有时间再细想;编程题每道控制在20分钟左右,超过25分钟直接跳到下一道;最后至少留25分钟给用例设计题。因为用例设计题只要思路清晰、覆盖度够,是很容易拿到大部分分数的,而编程题卡住的时候,再花半小时也可能没有进展,投入产出比很差。
2. 高频考点拆解:测试开发笔试真正在筛什么
2.1 计算机基础的选择题,往往是拉开差距的地方
测试开发岗的笔试不会像算法岗那么变态,但计算机基础的选择题绝对是必考且题量最大的部分。我复盘了这批笔试的选择题,发现高频考点集中在下面几个方向:
操作系统方面,进程与线程的区别是必考,死锁的四个必要条件(互斥、持有并等待、不可剥夺、循环等待)也几乎是年年出现。这里提醒一句:很多同学背得下四个条件,但笔试往往会结合具体场景让你判断是否会发生死锁,所以不能只背概念,要能分析。
计算机网络方面,TCP三次握手和四次挥手是经典中的经典,HTTP和HTTPS的区别、GET和POST的区别也是高频。这批笔试还考了一道关于HTTP状态码的题,301(永久重定向)和302(临时重定向)的语义差异,这个细节如果没仔细复习过很容易翻车。
数据库方面,SQL的增删改查是基本功,但笔试更爱考索引失效的场景、事务的ACID特性、内连接外连接的区别这类稍微进阶一点的知识。有一道题问了“哪些操作会导致索引失效”,选项包括在索引列上做函数运算、使用LIKE以通配符开头等,这需要实际写过SQL才会有直观感受。
数据结构与算法的基础题更是跑不掉,HashMap的底层实现原理、链表和数组在插入删除操作上的复杂度差异、二叉搜索树和平衡二叉树的区别,这几类题目在选择题里反复出现。建议准备时不要只看结论,要能说清“为什么”,比如为什么HashMap的扩容是2的幂次,这背后涉及位运算代替取模的优化逻辑。
2.2 编程题:不只是“会写”,还要“写得对”
测试开发岗的编程题难度通常略低于纯开发岗,但绝不是那种白给的难度。我们这批的两道题,一道是数组相关的处理题,核心是双指针思路;另一道是字符串操作的变种题,稍微绕一点,需要仔细读题才能理解清楚要求。整体来看,难度在LeetCode中等偏下这个区间,但有一个很重要的区别:笔试平台的评测机制非常严格,边界条件、极端输入、算法复杂度都在考察范围内。
编程题最大的坑在输入输出处理上。在线笔试平台通常需要自己写完整的输入输出,不像LeetCode那样只写函数逻辑即可。如果忘记处理异常输入,比如空数组、极端值,很可能直接运行不通过。另外,虽然平台一般会提示你使用的语言版本,但如果你习惯在本地IDE里用某个语法特性而在在线环境里不支持,就会出现“本地能跑通过不了”的情况。我建议笔试前至少去牛客网练习几道需要自己处理输入输出的题目,熟悉一下EOF读入、空行处理和字符串分割这些细节。
这里还分享一个策略:编程题千万别一上来就追求最优解。如果一时间想不出最优方案,先写一个暴力解法把部分测试用例通过了,拿到部分分数,然后再逐步优化。笔试成绩是按照通过用例的比例来给分的,暴力解拿到的分数远比交白卷强。我那一批第一道编程题其实暴力解就能过60%左右的用例,如果有人直接放弃就太可惜了。
2.3 测试用例设计题:这是测试开发岗区别于普通开发的特色考题
如果说选择题和编程题是在筛“工程师”的基本盘,那测试用例设计题就是在筛“测试开发”这个岗位的特殊性。我们这批的用例设计题是给一个功能场景,要求写出尽可能完整的测试用例。这种题没有标准答案,但阅卷时看的是你的测试思维是否系统、覆盖度是否全面、有没有工程层面的考虑。
我看到题目后的第一反应是列功能点、正常场景、异常场景、边界场景,按这个思路展开。但事后复盘发现,要拿到高分,光列用例还不够,还要体现出你对这个功能背后业务逻辑的理解。比如设计用例时要考虑权限校验吗?要考虑并发场景吗?需要考虑兼容性(不同浏览器、不同操作系统)吗?这些维度如果在答案中体现出来,会比单纯堆功能用例显得更有层次。
写用例设计题时建议用表格形式组织,至少列清“用例编号”、“测试步骤”、“预期结果”这几列,再把功能测试、异常测试、边界测试、性能测试、兼容性测试分成几个小块写。卷面上清晰的条理本身就在给你加分,因为测试岗位最看重的就是结构化和严谨性。
3. 做题顺序和提交策略:血泪换来的实战经验
3.1 先做哪一道?我的推荐顺序
一个很多人忽视的事实是:在线笔试的做题顺序可以自己掌控,而顺序的选择会直接影响整场考试的心态和得分。我的建议是先扫一遍所有题目,然后按照“有把握的选择题 → 用例设计题 → 编程题”的顺序来做,而不是按系统出题的顺序。
为什么把用例设计题放到编程题前面?因为它是一道“写了就有分”的题,你只要把测试用例列出来,即使覆盖不全面也能得分,而且这道题投入时间越多分数越高,属于典型的“稳定得分项”。编程题则带有不确定性,一旦卡住很容易陷入死循环,既消耗时间又影响心态。所以先把该拿的分拿到手,再攻坚编程题,是比较稳妥的打法。
我这场笔试是先做了选择题,然后直接跳到编程题,结果在第二道编程题上耗了太长时间,最后用例设计题只写了一个粗糙的框架。虽然运气好还是过了笔试,但要是用例设计题多写一些,面试时的底气也会更足。
3.2 编程题的“暴力解优先”策略
编程题这块我再展开说说“暴力解优先”的具体操作。拿到题目后先别急着想最优解法,而是用几分钟快速确认一个暴力解法能不能cover住所有测试用例。比如数组求和类问题,直接双层循环虽然可能超时,但在数据量小的时候能过一部分用例,那就先把这部分分数拿到。
之后如果时间充裕,再考虑如何优化。优化的方向通常就是那几类:把O(n²)的双层循环改成O(n)的哈希表做法、把递归改成动态规划、把暴力枚举改成双指针或滑动窗口。
另外,编程题提交之前务必自己构造几个边界用例测一下,比如空字符串、数组长度为1、所有元素相同、数值达到题设上限等。很多在线评测的失败不是算法逻辑错了,而是边界情况没处理好,比如数组越界、字符串空指针、整数溢出。这些细节是可以在平日刷题时养成习惯的,每道题提交前都跑一遍边界测试,笔试时就不容易翻车。
3.3 关于在线评测环境的重要提醒
在线笔试和平时刷题的环境是有差异的,这个差异足以影响成绩,我在这里专门提醒几个点。
第一,平台的语言版本可能和本地环境不一致。比如本地装的Java 17,平台用的是Java 8,那var关键字、List.of这类新语法可能就无法通过编译。进笔试系统后,先花30秒确认一下语言版本,再决定用哪种语法写代码。
第二,输入输出格式要看清楚。有的题目要求输出结果后要换行,有的则不需要;有的用例是用空格分隔,有的是逗号分隔。读题时如果忽略了这些细节,很可能导致本应通过的用例全部判错。
第三,浏览器和网络环境要提前测试。我见过有同学笔试开始时发现摄像头无法打开,折腾半天浪费了宝贵的答题时间。建议提前一天登录笔试平台测试环境,确认摄像头、麦克风、浏览器兼容性都没问题。
第四,不要过分依赖外部工具,比如IDE自动补全。在线平台的编辑器可能没有代码提示功能,平时背不下来API的话,全靠手写就很容易出bug。我平时刷题时如果有想不起来的函数名都会打开文档查,但这个习惯到了笔试现场就是致命的。所以从准备笔试的前两周开始,建议有意识地“脱离IDE练习”,至少把常用的输入输出方法、集合类的API、字符串处理函数之类背熟。
4. 岗位定位与备考误区:测试开发不是简化版的开发
4.1 “点点点”与“造轮子”的认知纠偏
在聊备考路线之前,我觉得有必要先掰扯清楚一个根深蒂固的偏见:很多人觉得测试开发就是“功能测试的升级版”,平时主要是“点点点”,写点自动化脚本就完事了。但如果你拿这个认知去准备笔试,方向就直接跑偏了。
大厂测试开发岗的定位是“懂测试的开发工程师”,既要能站在测试的视角设计用例、分析质量风险,又要能编码实现自动化测试框架、性能压测工具、持续集成平台。笔试里考算法和计算机基础,不是在为难你,而是因为这份工作确实需要这些硬技能——比如自动化测试代码要写清楚,测试平台的Web后端要能开发,性能测试的结果要能分析。
小米的测试开发岗尤其强调“工程能力”和“测试能力”的双轮驱动。从笔试题目就能看出,编程题加用例设计题的组合,就是在同时考察你能不能写代码、能不能做测试。面试时大概率还会追问测试工具链的使用经验,比如接口测试怎么设计、自动化框架怎么搭建、CI流水线怎么集成。
4.2 从笔试反推岗位技术要求
我见过不少同学把测试开发岗的备考理解为“刷测试理论的八股文”,结果笔试一到手就傻眼了——选择题全是计算机基础,编程题和开发岗的难度不相上下。事实上,从笔试反推岗位技术要求,你会发现真正核心的能力项其实是这几个方面。
首先是测试理论和用例设计能力,这是测试开发区别于普通开发的核心壁垒,包括测试流程、用例设计方法(等价类、边界值、因果图、正交实验法、场景法)、缺陷管理和质量度量。
其次是编码能力,重点是能写出健壮的测试代码,包括接口自动化脚本、UI自动化脚本、测试工具的开发。笔试的编程题就是在为这部分做基础筛选。
再次是测试工具链的掌握,包括接口测试工具(Postman、JMeter)、自动化框架(Selenium、Appium、pytest、TestNG)、持续集成工具(Jenkins、GitLab CI)等。
最后是业务理解能力和系统架构能力,测试开发要能理解被测系统的架构,知道测试数据怎么造、测试环境怎么搭、测试结果怎么监控,这些在笔试的选择题里也会有体现,在面试中更是考察重点。
4.3 AI测试开发:笔试中可能出现的新变量
说到测试开发这个领域,不得不提最近这两年最火的方向之一,就是AI测试开发。我参加笔试的时候虽然没有直接考AI相关的题目,但聊到后续面试和岗位发展时,AI测试开发已经是绕不开的话题。
结合秋招期间的热搜词趋势,目前行业里对AI测试开发的关注点主要集中在三个方面:一是用大模型辅助生成测试用例,通过自然语言描述功能需求,模型自动生成覆盖正常路径和异常路径的用例,这能极大提升测试设计效率;二是智能断言,传统的自动化断言是人为写死的,AI可以根据接口响应和页面状态自动生成合理的校验逻辑;三是测试数据的智能生成,用生成式模型构造覆盖各种边界条件的模拟数据,尤其是隐私受限场景下的脱敏数据。
这个方向的兴起,对测试开发岗笔试的影响已经开始显现。比如一些公司笔试的最后一道“场景设计题”可能不再只是让写用例,而是会考你如何为一个AI应用设计测试策略,比如给一个聊天机器人或推荐系统设计测试方案,这需要你同时懂测试方法和AI应用的基本原理。建议备考时不要太囿于传统的Web测试场景,多了解一些大模型应用的测试思路,哪怕只是在面试时提到“可以用基于大模型的方法加速用例生成”这个方向,也会让面试官眼前一亮。
5. 从一场笔试反推:测试开发岗的系统备考路线
5.1 计算机基础:查漏补缺清单
如果你现在才开始准备测试开发岗的笔试,时间比较紧张的情况下,我建议优先按这个清单做排查:
数据结构与算法方面,数组、链表、栈、队列、哈希表、二叉树、堆、图的基本操作和复杂度是地基,刷题以LeetCode的Hot 100为主,重点写数组、字符串、链表、二分查找、双指针、栈与队列、二叉树、动态规划这几类题。每道题不要只看题解,要能自己推导出复杂度,并想清楚为什么用这种方法而不是另一种。
操作系统方面,进程与线程、进程调度算法、死锁、内存管理(分页分段、虚拟内存)、文件系统,这些是高频考点。复习方式可以用操作系统的教材目录做提纲,每章提炼出十来个核心概念,做到能用自己的话讲清楚的程度。
计算机网络方面,重点在应用层和传输层,HTTP、TCP、UDP、DNS这些是测试开发日常打交道最多的协议。推荐把TCP三次握手四次挥手、TCP与UDP的区别、HTTP和HTTPS的差异、HTTP常见状态码这几个知识点整理成自己的笔记,反复看。
数据库方面,SQL基本语法、索引原理、事务隔离级别、连接查询是核心。测试开发写自动化时经常要构造测试数据,SQL是基本功,笔试也会考。
5.2 测试理论:从入门教材到系统方法论
测试理论这块虽然看起来“软”,但笔试选择题和面试都爱考,而且它是测试开发岗区别于普通开发岗的核心知识网。
入门推荐《软件测试的艺术》这本经典书,篇幅不大,但把测试的基本思想讲得很清楚。之后可以系统看一下软件测试生命周期和测试设计的系统方法论:测试用例设计方法里,等价类划分和边界值分析是必考,因果图、判定表、正交实验法、场景法也要熟悉,笔试的用例设计题可以直接用这些方法作为展开框架。
测试分类这块要能说清楚单元测试、集成测试、系统测试、验收测试的区别,以及V模型、W模型、敏捷测试模型的特点。还要了解自动化测试的分层策略,UI层、接口层、单元层的自动化投入产出比是不同的,经典的测试金字塔模型就是讲这个的。
如果想准备面试,还要额外了解接口测试的要点(API设计规范、鉴权方式、幂等性验证)、性能测试的基本指标(QPS、响应时间、并发数、内存占用)和常见性能瓶颈,以及缺陷的生命周期管理。这些不一定笔试都考,但面试官大概率会顺着简历和笔试作答往深了问。
5.3 工具链与自动化项目:用真实代码证明你行
简历上没有测试相关的项目经历,是很多应届生投测试开发岗时的痛点。笔试前,如果能补上几个“小而完整”的实战项目,对通过笔试后的面试很有帮助。
我的建议是别一上来就搭很重的框架,而是先选一个小而完整的业务系统练手。比如找一个开源电商系统,用Python或Java写一套接口自动化测试代码,覆盖登录、商品查询、下单、支付这几个核心流程,用pytest或TestNG做测试框架,断言做充实,再加一个简单的HTML测试报告。
如果对UI自动化感兴趣,可以基于Selenium或Appium写一套Web页面或App的自动化冒烟测试脚本,覆盖核心用户路径,配合PO设计模式优化代码结构。这部分项目不用做得特别复杂,但一定要亲手写,因为面试官很可能让你现场讲代码思路,甚至追问某一行设计的原因。
数据库和中间件的基本操作也别忘了,比如用Docker起一个MySQL测试环境,用Redis跑一下缓存数据,这些都是测试开发日常要用的基础技能。简历上如果写了熟悉Docker、MySQL、Redis,面试官确实可能会追问,所以没有真实用过就别写太多。
5.4 模拟笔试与心态建设:最后一周怎么准备
距离笔试还有一周左右时,最有效的复习方式已经不是海量刷题了,而是做模拟笔试。牛客网上有不少互联网企业的历年真题和企业题库,虽然不一定能碰到原题,但用这些题目做限时模拟,能帮你适应在线笔试的节奏和题感。
模拟时一定要严格按照考试标准来:设置好120分钟倒计时,开启摄像头,用和真实笔试相同的浏览器,按真实的做题顺序走一遍。我准备期间一共做了三次模拟笔试,每次结束后都复盘错题,尤其是选择题里因为“概念模糊”而错的题。这个阶段千万不要再把时间花在大量刷简单题上了,查漏补缺比刷题数量重要得多。
心态建设这块,我觉得有几句话很重要。第一,笔试题量大是常态,做不完很正常,不要因为前面选择题多纠结了几分钟就慌了神;第二,编程题卡住了就果断跳过,测试开发岗笔试的容错率比很多人想象中高,后面用例设计题写得完整一样能过;第三,笔试只是整个秋招流程中的一环,即使这场失利也不代表能力不行,及时总结,调整策略继续投下一家就好。
最后再分享一点我个人的体会:经历过这次笔试,我最深的感觉是测试开发这个岗位的考题正在变得越来越“综合”,它不再是单纯的测试八股文,也不再是纯算法比拼,而是测试能力、工程能力、业务理解能力的综合筛选。准备的时候不要心存侥幸,基础越扎实,笔试的体验越从容。从我这批的反馈来看,耐心把计算机基础过完、把测试理论体系梳理清楚、再动手做一两个自动化项目的同学,笔试通过率明显高于只刷题不思考的。希望这篇复盘能帮你在下一场笔试中少踩几个坑。