1. 这个岗位到底考什么:2018年秋招测试开发笔试全景拆解
每年八月下旬到九月初,各大厂的秋招笔试就陆续开闸了,小米的测试开发工程师岗位在2018年那波招聘里算是热度很高的一批,主要原因倒不是薪资被炒得多高,而是岗位本身覆盖的技术面特别宽——从软件测试理论到代码功底,从Linux操作到网络协议,基本把计算机基础课从头到尾扫了一遍。
很多同学看到“测试开发”四个字,第一反应是“这不就是点点点吗”,这个误解在笔试现场会死得很惨。小米的测试开发笔试客观题,实际上是把测试工程师的工程素养和开发工程师的代码能力混在一起考,题目表面上是选择题,但每一道题背后都藏着一个真实的测试场景。换句话说,它不考你背了多少概念,而是考你在实际测试工作中能不能做出正确的技术判断。
先说题型分布。2018年秋招小米测试开发的客观题大致分为四个板块:软件测试基础、计算机基础知识、编程与算法、场景分析题。其中软件测试基础大概占三成,计算机基础占三成,编程与算法占两成半,场景分析占一成半。这个比例说明一个很关键的信息——测试开发不是纯测试岗,它要求你同时具备测试思维和开发能力。
再看出题逻辑。客观题里的选择题,选项干扰项设计得相当有水平,不是那种一眼就能排除的弱智干扰项,而是“看似都对,实际上只有一个在特定条件下成立”的陷阱题。我印象很深的一道题,问的是等价类划分中无效等价类的取值该如何设计,四个选项里有两个都是常见的错误做法,一个是把无效等价类设计成多个值的组合,另一个是在边界值附近取值。这种题目如果只是背了概念,没有真正做过测试用例设计,基本会掉坑里。
还有一类题目是给出一段代码,问这段代码的圈复杂度是多少,或者问你用哪种测试方法能覆盖到某个分支。这种题考的就是白盒测试的基本功,需要对控制流图、判定节点、路径覆盖这些概念有实打实的理解,而不是停留在“白盒测试也叫结构测试”这种名词记忆层面。
小米这个岗位的笔试,还有一个特色就是会结合自家产品的场景来出题。比如给你一个MIUI升级包的下载流程,让你判断哪些测试点是必须覆盖的;或者给你一个路由器固件刷写的操作序列,让你分析哪个环节最容易出现兼容性问题。这种题对没有实际项目经验的同学来说难度最大,因为它考的是一种测试敏感度——你看到一套业务流程,能不能本能地意识到哪些地方容易出问题。
所以我的建议是,准备这份笔试,不要把它当成一次单纯的考试来准备,而要把自己代入一个真实的测试开发工程师角色,去思考“如果这个功能上线,我要怎么保证它不出问题”。有了这个视角转换,再做那些客观题,你会发现题目突然变得简单了许多。
1.1 小米测试开发岗位定位与笔试题型分布
想弄明白一份笔试卷子为什么这么出,首先得搞清楚这个岗位到底在招什么样的人。
小米的测试开发工程师,从岗位名称上就能看出来,它不是传统意义上的QA,而是要求你既能写测试工具、开发自动化脚本,又能承担功能测试、性能测试、兼容性测试这些具体的验证工作。换句话说,这是一个“开发能力+测试思维”的复合型岗位。2018年那会儿,移动互联网的迭代速度已经到了一个峰值,MIUI几乎每周都有更新版本,测试团队如果没有自动化和工具开发能力,根本扛不住这种发布节奏。
笔试客观题的设计,本质上是在用最短的时间筛出两类人:第一类是计算机基础扎实、代码能力过关的人;第二类是具备测试思维、能站在用户角度思考质量问题的人。如果你这两方面都有,那这份卷子对你来说就是展示自己的舞台;如果你只占一头,另一头就会成为你的失分重灾区。
从题型占比来看,软件测试基础部分主要考察测试理论、测试用例设计方法、测试流程管理、缺陷生命周期这些内容。计算机基础部分则涵盖数据结构、操作系统、计算机网络、数据库四个方向,其中操作系统和网络的分值略高于数据结构和数据库,这和测试开发的实际工作内容是匹配的——你在做性能测试时要懂操作系统资源调度,在做接口测试时要懂HTTP协议状态码。
编程与算法部分,客观题形式局限了它的考察深度,所以它主要通过代码填空、复杂度分析、边界条件判断这些方式来考察。场景分析题则最灵活,往往是一段业务描述配四个测试方案,让你选出最优的测试策略。
我建议准备的时候,不要平均用力。如果你的数据结构基础比较弱,想在客观题里靠选择题蒙混过关是不现实的,因为代码相关的选择题往往会在细节上挖坑,比如链表删除操作时指针的先后顺序、递归函数的退出条件,这种题会的就是会,不会就是不会,没有蒙的余地。
1.2 客观题的出题逻辑与筛人逻辑
客观题虽然只是笔试的第一关,但它承载的筛选任务其实非常重。小米这样的公司,校招简历投递量是几万份起步的,线上笔试系统要在有限时间内完成初筛,客观题就成了性价比最高的筛选工具。
它的筛人逻辑有两条线。
第一条线是知识面的完整性。测试开发工作里遇到的绝大多数问题,都不是某一个单一学科能解决的。举个最简单的例子:当你发现一个接口在高并发下返回超时,你需要懂HTTP协议来定位请求链路,需要懂操作系统来排查文件描述符耗尽问题,需要懂数据库来检查连接池配置,还需要懂一点Linux命令去抓日志和看监控。笔试客观题把这些知识散落在不同板块里,就是为了考察你的知识结构是否完整。
第二条线是细节敏感度。测试开发这个岗位,本质上就是和细节较劲的岗位。一个边界条件没覆盖到,一个异常分支没考虑到,线上就会出事故。客观题的干扰项设计,恰恰就是在模拟这种细节战场。经常有同学出考场后说“我觉得有两道题选C都有道理”,这就是掉进了细节陷阱。
明白了这层逻辑,你就知道该怎么答题了。遇到拿不准的题,不要凭感觉蒙,而是回到第一性原理去推理:这道题在考察哪个知识点,这个知识点在真实场景中是怎么应用的,哪个选项更符合工程实践的常识。这套推理过程,本身就是测试开发工程师的核心能力。
2. 客观题核心考点逐一击破:从测试理论到基础编程
前面说了那么多宏观的东西,下面进入正题,把客观题涉及的几个核心考点掰开揉碎讲一讲。我会结合2018年小米秋招测试开发客观题的实际考察方向,把每个板块最容易被考到、也最容易出错的知识点拎出来。
2.1 软件测试理论基础:必考的用例设计与流程概念
软件测试基础部分,最核心的考点是测试用例设计方法,其中等价类划分、边界值分析、因果图法、场景法这四个是绝对的高频考点。
等价类划分这题,常考的是有效等价类和无效等价类的设计原则。你以为它考的是定义,实际它考的是思辨。比如输入条件是一个“6到18位字符”的密码,有效等价类当然是“6到18位的字符串”,无效等价类则要拆成“少于6位”和“多于18位”两个。有些同学会把“非字符类型”也算作无效等价类,这在逻辑上没错,但在等价类划分的规范里,这就属于分类粒度的问题,命题人往往会在这个点上设置干扰。
边界值分析是另一个必考点。边界值分析不是让你取边上的值测一测就完事了,而是要你理解“上点、内点、离点”这三个概念。还是在“6到18位”这个例子里,上点是6和18,内点是中间任意一个数比如12,离点是5和19。选择题里最容易挖坑的就是离点的取值规则——闭区间和开区间的离点取值方式完全不同,很多同学记混了就会选错。
因果图法在笔试题里通常不会让你真的画因果图,而是给一个业务规则,问你用哪种用例设计方法最合适。比如“登录时,账号存在且密码正确才能登录成功,账号不存在或密码错误都给出提示”,这种多条件组合的场景,正确的方法是因果图法,而不是简单的等价类划分。这里考察的是你对不同用例设计方法适用场景的理解。
场景法也常考,尤其是结合小米产品的场景,比如“用户在弱网环境下点击下载,下载中断后恢复网络,进度条应如何显示”。这种题没有绝对的对错标准,命题人给的是“最合理”的测试方案,这时候你需要用测试思维去判断:用户最关注什么,功能最容易在哪个环节出错,什么样的验证顺序能让风险暴露得最充分。
然后还有一批概念辨析题,比如验证(Verification)和确认(Validation)的区别,回归测试和冒烟测试的适用场景,测试计划、测试方案、测试用例三者的层级关系。这类题纯考记忆,但也有规律可循——命题人喜欢把“相似但不同”的概念放在一起做干扰,你只要抓住每个概念最核心的区别点,就不会被带偏。
2.2 编程语言与数据结构:选择题里的代码思维
测试开发岗位的笔试,编程题不一定有,但客观题里一定会有和代码相关的题目。2018年那场笔试,选择题中代码题呈现的方式主要有三种:给代码问输出、给需求选代码、给代码算复杂度。
给代码问输出是最直接的一种。它常考的知识点是变量的作用域、值传递与引用传递、循环中的边界条件、递归的终止条件。这种题对刷过LeetCode的同学来说基本是送分题,但要注意的是,笔试题里的代码风格往往不是标准的最佳实践,而是有些“野路子”的写法,容易在细节上误导你。比如循环里用了前置递增和后置递增,在C系语言里两个运算结果可能都一样,但在C++中如果涉及对象,就会有行为差异。
给需求选代码是更有测试开发特色的题型。比如题目说“写一个函数判断一个字符串是否是合法的IP地址”,然后给你四个代码片段,让你选一个正确的。这类题不仅考你能不能读懂代码,还考你能不能发现代码中的边界条件遗漏。一个合法的IP地址判断,需要考虑四段、每段范围0到255、不能有前导零(在某些规范下)、不能有非数字字符。四个选项里通常有一个是主逻辑正确但漏了边界条件的,一个是对空字符串和null没有处理的,还有一个是看似正确但用了不安全函数的,只有一个是真正健壮的实现。
给代码算复杂度是数据结构的基础。这个没啥捷径,就是刷题过程中培养的直觉。比如嵌套循环是O(n²),递归如果没有记忆化就是指数级复杂度。需要单独注意的是某些看似普通实则特殊的写法,比如双指针扫一遍数组是O(n),但在循环内部使用了列表删除操作,在Python里这可能是O(n²)。
对于测试开发这个岗位,数据结构的核心考察点其实很聚焦:数组和链表的区别与应用场景、栈和队列的特性与互相实现、哈希表的冲突处理方式(你不需要能手写Redis的哈希结构,但至少要知道链地址法和开放定址法的基本思想)、二叉树的遍历方式、排序算法的稳定性和时间复杂度。其中排序算法的稳定性是选择题的常客,快排不稳定、归并排序稳定、堆排序不稳定,这些结论要刻在脑子里。
2.3 操作系统、网络与数据库:三大件一个都不能少
操作系统方面,进程与线程的区别是永恒的高频考点,但测试开发的笔试更喜欢把考点落到工程场景里。比如给你一个多线程程序,问你在什么情况下会出现死锁;或者问你在性能测试中看到CPU使用率100%,应该优先排查什么。
死锁的四个必要条件——互斥、占有并等待、非抢占、循环等待——需要记住,但更重要的是能识别一个场景是否满足这些条件。笔试题常考的是“如何避免死锁”,答案和现实中的做法一样:破坏四个必要条件中的任意一个。在数据库层面这叫锁的粒度控制,在代码层面这叫锁的顺序约定,在操作系统层面这叫资源分配策略。
处理机调度算法也是常客,先来先服务(FCFS)、短作业优先(SJF)、时间片轮转(RR)各自的特点和适用场景要能区分。选择题里经常会给你一组进程的到达时间和执行时间,让你算平均等待时间,这需要你熟练掌握甘特图的画法。
内存管理方面,分页和分段是重点。分页是物理上分割内存,分段是逻辑上分割程序,两者最大的区别在于分页可能产生内部碎片,分段会产生外部碎片,以及分页地址空间是一维的,分段是二维的。虚拟内存的页面置换算法——最佳置换算法(OPT)、先进先出(FIFO)、最近最久未使用(LRU)——也会考,其中LRU的栈式实现是选择题的经典出题点。
计算机网络这里,HTTP协议是绝对的核心。2018年的时候HTTP/2已经在逐步普及,但笔试的重点依然放在HTTP/1.1上:状态码的含义、请求方法的区别、GET和POST在语义和传输方式上的差异、Cookie和Session的对比。
网络层的考点集中在IP地址的分类和子网划分。给你一个IP地址和子网掩码,让你算网络地址和广播地址,这种题是基本功。还有ARP协议的工作原理——在同一个局域网内,主机A要发给主机B,需要先把目的IP地址通过ARP解析成MAC地址,这里有个很容易考的细节:ARP请求是广播发送的,ARP响应是单播回复的。
TCP和UDP的区别不用多说,握手挥手过程要能默画出来。我建议准备这个考点的时候别死记硬背,而是试着去理解为什么要三次握手、为什么要四次挥手。三次握手是为了确认双方的收发能力都正常,四次挥手是因为TCP连接是全双工的,每一方的连接都需要单独关闭。
数据库方面,SQL语句是基础。笔试客观题经常考的情境是“有一张用户表和一张订单表,要查询下单次数超过5次且最近30天没有下单的用户”,然后给你几个SQL语句让你选正确的。这种题考的不只是语法,还有逻辑能力,尤其是GROUP BY和HAVING的使用、WHERE和HAVING的执行顺序、LEFT JOIN和INNER JOIN的结果差异。
数据库范式的概念也会考,第一范式要求字段原子性,第二范式要求消除部分依赖,第三范式要求消除传递依赖。选择题的常见出题方式是给一张表的设计,问你它属于第几范式,或者问它不符合哪个范式的原因。关系型数据库的ACID特性、事务隔离级别、索引失效的场景,这些知识点在多益等大厂的笔试中也反复出现,小米也不例外。
3. 真题思路还原与实战演练:用测试思维解客观题
说完了知识点,下面来点实际的。我带大家过几道具有代表性的客观题,把完整的解题思路还原出来。这个过程比答案本身重要得多,因为你在考场上的每一分钟,都在被考察“你怎么思考”这件事。
3.1 典型选择题的解题路径还原
第一道题,考察等价类划分。题目大概是这样的:一个输入框要求输入一个手机号码,合法的手机号码是11位数字且以1开头。问下列哪个测试用例集合能最有效地覆盖等价类。
这道题的四个选项里,命题人分别设计了: A. 13800138000, 23800138000, 12345678901, 空字符串 B. 13800138000, 1380013800, 23800138000 C. 13800138000, 23800138000, 1380013800, 128001380001 D. 13800138000, 13800138001, 23800138000, 1234567890
这类题很容易被“看起来很多用例”的选项迷惑。正确思路是:先划分等价类。有效等价类有两个——11位数字且以1开头。无效等价类有多个——不以1开头、位数不足11位、超过11位、包含非数字字符、空输入等。C选项覆盖了“以1开头的11位号码”、“不以1开头的11位号码”、“以1开头但位数不足”、“以1开头位数超了”,这4个类覆盖得最为全面。这里要注意,A和D虽然用例更多,但有些用例落在了同一个等价类内,属于冗余覆盖,在等价类划分里是应该避免的。
第二道题,考察边界值分析。题目是一个年龄输入框,要求输入范围为18到60岁。问以下哪个用例集合是最优的边界值测试用例。
边界值分析要求取上点、内点、离点。上点是18和60,内点可以取30,离点是17和61。这道题的陷阱在于,有些选项只包含了18和60,这属于“边界值点”但不完整;有些选项包含了17、18、60、61,但少了内点,这也不完整。最完整的选项应该是17、18、30、60、61这样一个组合。
第三道题,是场景分析。题目描述:用户通过小米商城App下单购买手机,支付成功后,由于网络波动导致订单状态同步延迟。这时用户刷新订单列表,页面显示“支付中”,但用户的支付渠道已经扣款。问你作为测试开发工程师,最优先要做的验证是什么。
这道题没有标准答案,但命题人心里有最优解。四个选项是:A. 验证支付渠道扣款接口的幂等性;B. 验证订单状态从“支付中”到“已支付”的状态流转逻辑;C. 验证订单列表刷新时是否重新查询了服务端最新状态;D. 验证用户可以正常发起退款。这四个选项都有价值,但最优先的是C,因为用户的直观感受是刷新后看到的页面状态,如果刷新没有触发重新查询,那么状态不同步的问题会一直存在。这也体现了测试开发工程师的一个核心素养:从用户视角找问题。
3.2 时间分配与答题策略:90分钟客观题怎么打
2018年小米秋招测试开发客观题,我记得体量大约是50道题左右,限时90分钟。平均下来每题不到两分钟,时间相当紧。这里分享一个我验证过多次的答题节奏。
第一轮,快速扫描,只做有信心且一眼能出答案的题。这些题通常是概念题和基础计算题,比如数组和链表的区别、排序算法的稳定性、简单的SQL执行结果。一轮下来大概能解决30%到40%的题目,耗时控制在20分钟以内。
第二轮,攻克中等难度题。这些题需要动笔演算,比如算时间复杂度的题目、需要画草图分析的内存分配题目、需要理清逻辑的SQL题目。第二轮要给自己留足40分钟,保证演算时间充足,不要边写边怀疑。
第三轮,啃硬骨头。通常是最难的应用场景题和综合题,这时候你的大脑已经热身完毕,非常适合处理复杂逻辑。啃硬骨头的原则是:明确每个选项“错在哪”,而不是凭感觉“哪个像对的”。如果一道题卡了5分钟还没思路,先标记跳过,不要恋战。
最后的10分钟,检查两样东西:一是之前标记的跳过的题,换一种思路再尝试一次;二是检查是否有明明会做但因为粗心选错的题——尤其是那些让你选“不正确”的题,很多人看题不清就按“正确”去选了。
另外有一个非常重要的策略:不会的题不要空着。测试开发笔试没有倒扣分机制,空着等于白白丢分,哪怕蒙一个,也有25%的正确概率。但蒙也有技术含量,要优先排除明显违背基础原理的选项,再去蒙剩下的。
4. 从笔试到Offer:复盘方法与日常积累建议
笔试只是第一步,但往往是最能真实反映基础功底的一步。很多人笔试完了之后只看个分数,及格了就开心,不及格就丧气,这其实浪费了一次特别好的自我诊断机会。客观题覆盖的知识面广,你做错的每一道题,都指向一个具体的知识短板,把这些短板补上,你收获的不仅是一份笔试通过通知,而是一套完整的测试开发知识体系。
4.1 错题复盘与知识体系构建
我强烈建议:笔试结束后,不管感觉好不好,都趁热回忆自己拿不准的题目和选项,特别是有印象但没把握的知识点,立刻记下来。2018年那会儿没有现在这么多AI辅助工具,回忆题目的难度很大,但你至少能把知识点方向记录下来,比如“等价类划分的离点取值规则没搞清”、“TCP四次挥手的状态迁移不熟”,然后针对性地去补。
复盘也不要只看单道题的正确与否,而是要做知识串联。比如你错了一道关于死锁的题,不要只背“死锁四个必要条件”,可以顺着这个知识点继续问自己:死锁和活锁有什么区别?数据库中的死锁检测和操作系统中的有什么不同?在Java中如何避免死锁?如果这道题被考成一个场景分析题,我会怎么答?这种“由点及面”的复盘方式,是建立知识体系最快的方法。
我自己当年做的一个笨但有效的事情,是拿一个笔记本,按“测试理论、数据结构、操作系统、网络、数据库、编程语言”六个板块做索引页,每错一道题就在对应板块下记一行知识点关键词。一段时间之后,知识短板会直观地浮出水面。你不需要再去问别人“重点复习什么”,你自己的错题本就是最精准的复习大纲。
4.2 测试思维日常化的训练方法
最后说一个很多人忽略的点:测试开发的笔试,与其说是考知识储备,不如说是考测试思维的肌肉记忆。知识可以临阵磨枪,但思维方式需要日常积累。
我在校招季之前用了大概一个月的碎片时间,刻意训练自己“用测试视角看一切”。比如刷微博,看到发布按钮,我会想:这个按钮的点击范围是多大?频繁点击会不会造成重复提交?弱网环境下点击后提示是怎样的?再比如用外卖App下单,我会想:如果支付后商家没有接单,用户退款流程怎么走?如果骑手配送超时,App有没有自动赔付逻辑?这些思考不需要额外投入大量时间,通勤路上、吃饭排队时都能做,但积累起来你会发现,再做那些场景分析题,你的“测试敏感度”会明显高于只刷题的竞争对手。
笔试不是解题比赛,而是一次职业素养的预演。试卷里每一道客观题,都在模拟一个真实的工作场景:这个功能怎么测,这个BUG怎么定位,这个方案怎么选。你带着这种感觉去答题,分数自然就上去了。