2. 试卷结构拆解:小米测开笔试到底在考什么
先说结论:2019年小米秋招测试开发笔试题(B),整体风格是**“基础扎实优先,工程思维并重”**,既没有像算法岗那样上来就是Hard级动态规划,也不会像部分公司那样纯考八股文背诵。它更看重的是你能不能像一个真正的测试开发工程师一样思考问题。
我当时拿到这套题的第一感觉是:题量不小,但难度梯度设计得还算合理。整套试卷大致可以分为四块:
| 模块 | 考察方向 | 题目类型 | 大致占比 |
|---|---|---|---|
| 软件测试基础 | 测试理论、用例设计、测试流程 | 选择题+简答题 | 30% |
| 计算机基础 | 操作系统、网络、数据结构 | 选择题+填空题 | 25% |
| Linux与数据库 | 实际运维排查能力 | 实操题+SQL题 | 20% |
| 编程与逻辑 | 代码能力、算法思维 | 编程题 | 25% |
记住这个分布很重要,因为它决定了你的时间分配策略。很多人在选择题上纠结太久,结果编程题没时间写,这是最亏的。后面我会详细说时间怎么分配。
2.1 为什么是这个结构:测开岗位的能力模型
从岗位职责反推,测试开发工程师在小米这样的公司,日常要承担三类工作:一是功能测试和用例设计,保证产品上线质量;二是搭建和维护自动化测试框架,提升回归效率;三是开发测试工具或平台,解决测试过程中的效率痛点。
这就决定了笔试必须覆盖三条能力线:测试专业度、技术基础深度、代码落地能力。只懂测试理论不懂代码,做不了工具开发;只会写代码不懂测试思维,写出的用例和框架又往往脱离实际场景。小米的这套题,本质上就是在筛选这两者兼备的人。
2.2 题目难度分布:基础题送分,进阶题拉差距
整套题的难度分布大约是这样的:60%是基础题,只要你认真准备过,基本都能答对,比如TCP三次握手过程、等价类划分方法、Linux常用命令这些;30%是中档题,需要你真正理解原理而不是死记硬背,比如给你一个场景让你设计测试用例、给定SQL表结构写查询语句;剩下10%是拉开差距的题,通常是编程题或者综合性设计题。
这里我要多说一句:不要小看那60%的基础题。正因为大家都觉得简单,反而容易粗心出错。我见过太多人在"以下哪个不是黑盒测试方法"这种题上翻车,回头一对答案才拍大腿。基础题的正确率,决定了你能不能进下一轮面试。
3. 高频考点逐个拆解:这些题背后都有套路
接下来我按模块把高频考点和典型题目思路拆开讲。我不会照搬原题(毕竟笔试题有版权,也不该原样传播),但我会把每类题的核心考法和解题套路讲透,你拿任何一套同类题目都能用上。
3.1 软件测试基础:用例设计是永远的C位
测试基础这块,小米尤其爱考测试用例设计。常见的出题形式是给你一个功能点,比如"登录功能""购物车结算""文件上传",让你写出测试用例。这题看似简单,实际是分水岭。
我举个典型例子:设计一个"用户注册"功能的测试用例,要求用户名6-16位字母或数字。
大部分人会写:输入合法用户名、输入非法用户名、输入超长用户名,然后交卷。这种答案在面试官眼里等于没写。正确的思路是分维度覆盖:
- 功能维度:注册成功、用户名已存在、密码与确认密码不一致、验证码错误
- 边界维度:用户名5位、6位、16位、17位(这是等价类边界值分析的核心)
- 异常维度:用户名含特殊字符、含中文、全空格、SQL注入字符串"or 1=1"
- 兼容维度:不同浏览器、不同操作系统、移动端和PC端
- 体验维度:输入框是否限制字符数、错误提示是否友好、提交按钮是否防止重复点击
- 安全维度:密码传输是否加密、返回信息是否泄露用户信息
你看,这么一拆,一个功能点至少能写出三四十条用例。这个思路练熟之后,考试时哪怕遇到没见过的功能,你也能套框架,不会漏项。
再有一个高频简答题是**"黑盒测试和白盒测试的区别",以及"常见的黑盒测试方法有哪些"**。这类题纯记忆,等价类划分、边界值分析、因果图法、判定表驱动法、正交试验法、场景法、错误推测法,七种方法要能默写出来,并且能说清各自适用场景。别只列名词,一定要有场景说明,比如"复杂度高的组合场景适合用因果图或判定表"。
3.2 Linux与数据库:测开的基本功考场
Linux这块,小米出题风格非常务实,不会问你"Linux内核有哪几种锁",而是直接给你场景:"线上日志文件报错,怎么快速定位关键信息?"核心考点就这些:
- grep:按关键词过滤,结合管道符使用,比如
grep -i "error" /var/log/app.log | tail -50 - tail/head:查看日志尾部/头部,
tail -f实时跟踪 - awk/sed:按列提取、按规则替换,
awk '{print $2}'这种是基本功 - find/ls -l:查找文件、查看权限和文件属性
- top/free/df:排查系统负载、内存、磁盘
- kill/ps:进程管理,
ps -ef | grep java定位PID再用kill -9杀进程
实际考法一般是给出一个日志文件内容,问你怎么统计某个接口的请求次数。答案就是grep "GET /api/user" access.log | wc -l。这三件套的组合使用要特别熟。
数据库这块,考的SQL都不难,但容易在细节上翻车。必考的是:
- 多表联查(内连接、左连接的区别)
- GROUP BY + HAVING(注意WHERE和HAVING的执行顺序差异)
- 子查询(IN、EXISTS的区别)
- 聚合函数(COUNT、SUM、MAX、MIN、AVG)
给你一道典型题感受一下:有两张表,学生表(student)和成绩表(score),查询每门课程的平均分,并按平均分降序排列。
SELECT course_id, AVG(score) AS avg_score FROM score GROUP BY course_id ORDER BY avg_score DESC;这就是送分题。但小米会在后面加一道进阶题,比如"查询平均分大于80分的学生名单",这时候就必须用HAVING而不能再加WHERE了。这种细节就是筛人的地方。
3.3 编程题:不只是刷题,更要体现工程思维
编程题是整套试卷里最拉分的部分。小米的编程题不像字节那样追求极致算法,更看重你的代码规范性和边界处理能力。我印象中有几类题反复出现:
第一类是字符串处理。比如"实现一个函数,判断一个字符串是否是有效的IP地址"。这题不涉及复杂算法,但坑很多:IPv4地址是四个0-255的数字,不能有前导零,不能有多余的点。如果你的代码只判断了数字范围,忘了处理前导零和空段,就会挂掉部分用例。这就是考察你考虑边界是否周全。
第二类是数组/链表操作。比如"给定一个整数数组和一个目标值,找出数组中两个数之和等于目标值的索引"。这题最优解是哈希表,时间复杂度O(n),但如果考生写了个双层循环O(n^2),也不会给零分,因为测试开发更看重逻辑清晰、能跑通,优化属于加分项,关键是你得先保证正确性。
第三类是逻辑模拟题。给你一个实际业务场景,让你写代码模拟。这种题和测开工作最贴近,比如"写一个函数,判断一个字符串括号是否匹配",这类问题直接对应到配置文件解析、模板渲染的测试工具开发,实用性很强。
这里我要特别强调一个细节:笔试编程题一定要处理好输入输出和异常分支。很多线上笔试系统是有隐藏测试用例的,你只写了happy path,边界用例全挂,最后还是零分。我的习惯是,哪怕时间紧,也要把空值判断、非法输入判断写在最前面,这是成本最低的保分手段。
3.4 计算机网络与操作系统:选择题的重灾区
这套试卷的选择题里,网络和操作系统占了相当比例,都是基础但易混淆的考点。
网络这块必考的是:
- TCP三次握手、四次挥手(尤其是TIME_WAIT状态的作用)
- TCP和UDP的区别(面向连接vs无连接,可靠vs不可靠)
- HTTP常见状态码(200、301、302、403、404、500、502、503)
- HTTP和HTTPS的区别(TLS握手、证书)
- DNS解析流程
操作系统这块常考的是:
- 进程和线程的区别
- 死锁产生的四个必要条件(互斥、持有并等待、不可剥夺、循环等待)
- 内存管理的基本概念(分页、虚拟内存)
- 进程间通信方式(管道、消息队列、共享内存、信号量、Socket)
这类题没有捷径,刷题加理解。但我有个建议:不要死记硬背定义,要能说出应用场景。比如问到TCP和UDP的区别,你如果只答"一个可靠一个不可靠"是拿不全分的,要补充"视频通话和直播场景为什么要用UDP因为实时性优先,文件传输为什么要用TCP因为不能丢数据"。这样改卷人一看就知道你是真懂,不是背的。
4. 从笔试反推面试:小米测开到底想要什么人
很多人会忽略一件事:笔试不只是分数,它暗含了这家公司的技术取向和团队文化。我在小米笔试的题目里,能明显读出几个信号。
4.1 内容全覆盖:你不是过来写用例的,你是过来做开发的
小米对测试开发岗位的定位,绝对不是"点点点"的功能测试。从题目里能看出来,他们要的是能写代码、能看懂系统日志、能直接上手排查线上问题的工程型测试。这就意味着你在准备笔试时,如果只复习测试理论,不碰代码和Linux,基本没戏。
我身边有朋友当年觉得"我测试用例设计得好,笔试没问题",结果成绩出来连面试都没进。后来复盘才发现,编程题空白、SQL写错、Linux命令题全区瞎猜,光靠理论题撑不住总分。这是个很典型的教训:测开笔试的应试策略必须是全科均衡,短板科目拉分非常严重。
4.2 场景化出题:面试官要的是"解决问题"而非"复述知识"
注意看这套题和大学期末考的区别:大学考卷问"什么是死锁",这套题问"数据库出现死锁怎么排查";大学考卷问"什么是等价类划分",这套题直接扔给你一个功能让你画用例。同样的知识点,换个考法,难度立刻不一样。
所以准备阶段,我强烈建议你把每个知识点都过一遍"场景化"的转化。比如学了TCP三次握手,就问自己"如果服务端连接池满了会出现什么现象,怎么排查";学了SQL联查,就问自己"如果查询巨慢,先查什么";学了死锁,就问自己"MySQL死锁报错日志怎么看"。这种训练方法比刷一百道选择题都管用。
4.3 软素质嵌入:用例设计题背后在考察的另一样东西
我后来做面试官才真正理解,小米这种用例设计题,表面上考技术,实际还在考察一个测试开发最重要的素质——结构化思维和写文档的能力。一份用例能不能分层分类、有没有覆盖边界和异常、逻辑顺序是否清晰,直接反映你未来能不能输出一份高质量的测试计划。
所以别只是列条目,要有分组、有优先级。考试时我建议这样组织答案:先写覆盖正常流程的主用例,再写边界用例,最后写异常和安全性用例,每一项用简短标题+测试步骤+预期结果的结构。这会让你的答案在一堆"点两下按钮看看能否成功"里,显得非常专业。
5. 备考与应试的实用策略:少走弯路的方法论
最后这部分,我把自己备考和带人过程中的干货总结一下,按时间线拆成考前准备和考场实战两个阶段。
5.1 考前30天怎么安排:按模块打基础,按时间做模拟
第一周和第二周:基础扫盲。过一遍测试理论、计算机网络、操作系统的基础概念,配合刷选择题。重点是积累错题,不要追求刷题量,要追求把每道错题背后的知识点吃透。SQL和Linux命令要动手练,光看教程根本没感觉。
第三周:专项突破。每天选一个模块做集中练习,尤其针对自己的薄弱点。比如我当年SQL联查不太熟,就连续三天只刷SQL题,从简单到复杂,直到不看答案能写出来。编程题保持手感也很重要,不需要刷难题,LeetCode的简单和中等难度就够用。
第四周:全真模拟。找一套往年的笔试题或模拟题,严格按考试时间做一遍。这一步非常关键。很多人的翻车点不是不会,而是做不完。模拟的目的就是找到自己的时间分配节奏。
5.2 考场上怎么分配时间:先拿稳拿分,再啃硬骨头
我的做题顺序是:
- 选择题和填空题快速过——会的直接勾选,犹豫的做个标记先跳过,绝不恋战。一道选择题超过2分钟还没把握,果断放弃,随便选一个写上标记,回头有时间再想。
- SQL题和Linux题二选一先做——如果两道都有把握,先做SQL题,因为SQL题逻辑强、容易得满分;Linux实操题如果是简答形式,注意条理清晰,一条命令一行,写清楚参数含义。
- 测试用例设计题认真做——这题是主观题,答案写得是否专业直接影响印象分,多花点时间是值得的。
- 编程题最后做,但必须留够40分钟——至少保证第一道编程题能完整写出来并检查边界,第二道实在没思路就写个暴力解,也比空着强。
整体节奏上,选择题尽量控制在25分钟内,简答和用例设计控制在40-50分钟,剩下40-50分钟给编程题。当然具体要看题量调整,但原则不变:先把必拿的分拿到手,再挑战高分题。
5.3 面试官不会告诉你的三个隐藏踩分点
以下是我作为面试官看卷时会下意识注意的隐藏评分点,很多人可能完全没意识到:
第一,字迹和排版。线上笔试的简答题一定要分段、分条、加序号。如果全是密密麻麻一大段,哪怕内容对了,改卷体验也非常差。印象分这个东西真实存在,别跟它对着干。
第二,编程题的注释。关键的逻辑分支写一句注释,既帮自己理清思路,也让改卷人更快地理解你的代码。有注释的答卷和没注释的答卷,在观感上完全不是一个档次。
第三,不会的题也要写思路。遇到不会的编程题,哪怕写不了完整代码,也要把你想到的解题思路、用到的数据结构、算法复杂度推导写出来。我的原则是:笔试最怕的不是做错,而是空白。做错了至少证明你思考过,改卷人知道你差在哪;空白等于主动放弃,连拉你一把的机会都没了。
6. 写在最后:这套题给我最大的启发
说实话,距离2019年已经好几年了,但回头看这套题,我依然觉得它对当下的测开岗位求职者很有参考价值。不光是小米,很多一线互联网公司的测开笔试题,核心考点都在这套题的框架之内。
而整套题背后最值得琢磨的一条逻辑是:测试开发岗位的门槛,已经不再是"懂测试"这么简单了。它要求你既是质量守护者,也是效率工具的开发者,还是线上问题的第一响应人。这就像一个全科医生,什么病都要能看,什么工具都要会用,而且还要能自己开发点新工具。
我个人的体会是,准备这类笔试,最忌讳的就是只背题不思考。刷题是手段,不是目的。每做一道题,多问自己一句"这个考点在实际工作中对应什么场景",长期积累下来,你收获的不只是一份笔试的高分,更是对测试开发这份工作真正的理解。
最后再分享一个小技巧:笔试结束后,不管你自我感觉好不好,一定要把题目和你的答案记录下来,趁记忆还新鲜的时候复盘一遍。这不仅是给后续面试做准备,更是你技术成长路上最珍贵的素材库。很多我现在写进自动化框架里的设计思路,都来自于当年复盘笔试时想通的某个瞬间。