说实话看到“小米2019秋招测试开发笔试题A”这个标题我第一反应是有点怀念。那年秋招我正好帮部门做过校招面试官也接触过几套测试开发的笔试卷子。小米的笔试题在当年属于风格比较鲜明的一类题量不小、覆盖面广、偏向工程实践而且对测试思维的考察比重明显高于纯技术知识背诵。很多同学刷了几百道Java选择题结果一上考场发现编程题要写测试用例、还要设计测试方案直接懵了。这篇文章我就基于这套题的高频考点和出题逻辑结合我自己的面试和带人经验把整套卷子的结构、重点题型、解题思路、备考点全部拆开讲一遍。写这篇东西的初衷很直接测试开发这个岗位在校招里经常被误解成“会写代码的测试”。实际上从笔试题就能看出来企业要的是“懂测试的开发”而不是“懂开发的测试”。你不仅要有代码能力还要有质量意识、场景分析能力、风险评估能力。这篇内容适合正在准备测试开发校招的同学也适合那些想从纯功能测试转测试开发、想系统梳理知识体系的在职朋友。1. 试卷整体风格与出题思路拆解1.1 这套卷子到底在考什么先说结论小米这套测试开发笔试题A整体考察四大块能力——计算机基础知识、编程能力、测试专业能力、逻辑分析能力。四块内容不是平均分配而是有明显的侧重。从题量上看整张卷子大约60到80分钟完成题型包括单选题、多选题、简答题、编程题和设计题。其中单选题大概占30%到40%主要覆盖数据结构、操作系统、计算机网络、数据库、Linux基础。多选题难度会高一些因为多选漏选错选都不得分对知识掌握的精确度要求更高。简答题和设计题是拉开差距的地方。这类题目往往没有唯一标准答案考察的是你思考问题的全面性和条理性。比如让你设计一个测试方案、写一组测试用例这种题你有多少料阅卷人一眼就能看出来。编程题一般是两道一道偏算法一道偏工程后者通常会结合测试场景。这里我要特别提醒一个很多同学容易忽略的点测试开发的笔试卷里选择题的考点往往并不是单纯的记忆性知识而是带有“场景包装”。比如一道关于TCP三次握手的题题干会描述“客户端连接失败可能是以下哪个原因”而不是直接问三次握手过程。你要是只会背状态转换不会分析实际问题这题就容易翻车。1.2 为什么这样出题搞清楚出题人的意图比刷题本身更重要。小米作为一家硬件起家的互联网公司测试开发岗位承担的角色非常复合。一方面要做Android系统、MIUI、硬件相关产品的质量保障另一方面也要搭建自动化测试框架、开发测试工具。所以笔试题的设计逻辑就非常清楚选择题筛选基础扎实的人编程题筛选代码能力强的人测试设计题筛选真正懂质量保障的人。三个维度筛完基本就能判断一个候选人能不能在这个岗位上活下来。这也解释了为什么这套卷子里数据库和Linux的题目占比不低。测试开发日常要查日志、查数据库、写脚本、跑自动化这些全是基本功。你写不出多复杂的算法没关系但如果你连基本的Linux命令和SQL都不会在工作中会非常吃力。出题人就是通过这套卷子在明确告诉你测试开发不是只会点点点的高级测试是实打实要写代码、要懂系统的工程岗位。2. 计算机基础题型逐类拆解2.1 数据结构与算法链表和数组是高频考点数据结构这块小米的题有非常明显的偏好。链表、二叉树、栈和队列是绝对的重点其中链表和数组相关的问题出现频率最高。给你还原一道典型的真题风格题目选择题关于数组和链表的描述以下哪个是正确的。选项大概是A. 数组适合频繁插入删除操作B. 链表支持随机访问C. 数组内存连续链表内存不一定连续D. 链表在内存中占用空间一定比数组小。这道题其实考察的是对两种基础数据结构底层特性的理解。正确答案是C。数组是一段连续的内存空间支持O(1)随机访问但插入删除需要移动大量元素平均时间复杂度O(n)。链表通过指针连接节点内存不连续插入删除只要改指针时间复杂度O(1)但不支持随机访问查找需要遍历。这里有个容易被忽略的细节链表节点包含指针域所以对于存储小数据类型比如int的场景链表的额外内存开销其实比数组大。D选项错在这里。很多同学在考场上一看到“链表占用空间小”就想当然觉得对实际上恰恰相反。二叉树这块重点考察的是遍历方式。前序、中序、后序、层序遍历以及给定两种遍历序列反推二叉树结构。这类题没有什么捷径就是多画图多练习。我建议你在准备时至少把递归和迭代两种方式都手写一遍特别是非递归遍历用栈模拟的过程笔试中出现频率很高。2.2 操作系统与网络进程线程和TCP是重中之重操作系统选择题里进程和线程的区别是万年必考题。常见的考法包括进程和线程的通信方式、共享资源的区别、死锁产生的必要条件、进程调度的基本策略。给你一个典型的考点死锁产生的四个必要条件——互斥、占有并等待、不可剥夺、循环等待。选择题可能会让你判断某个场景是否会造成死锁或者问破坏哪个条件可以预防死锁。这题不难但容易在“占有并等待”和“循环等待”之间混淆建议你把四个条件各配一个小例子来记忆不要死记硬背。网络部分TCP三次握手和四次挥手是绝对的重点做题做到烂也不过分。但要注意小米喜欢结合异常场景来考。比如TCP建立连接时客户端发送SYN后长时间没有收到SYNACK可能的原因是什么。选项包括服务器处于SYN_RECV状态、防火墙丢弃了SYN包、服务器进程崩溃、网络延迟过大等。这种题考察的不是单纯的三次握手流程而是你对连接建立过程中每个环节可能出现问题的理解。答案一般是三个服务器accept队列满了导致SYN被丢弃、防火墙拦截、网络原因导致SYN或SYNACK丢失。服务器进程崩溃这个选项容易让人犹豫实际上如果进程崩溃操作系统内核协议栈还在会直接返回RST客户端收到RST后会立刻报错而不是长时间无响应。这种细节你在复习的时候一定要想明白“为什么错”而不是只记住“对的那个选项”。2.3 数据库与SQL常规必考项数据库题目在测试开发笔试卷中的占比往往比很多同学预期的要高。考察内容集中在SQL编写、索引原理、事务特性和锁机制这几块。SQL题一般会给定一张学生表或者订单表让你写出查询语句。比如“查询每个部门工资最高的员工”、“统计2023年每个月的订单总额”这种level的题目。别看简单每年都有不少人在GROUP BY和HAVING的配合上翻车。核心记住一句话WHERE是筛选分组前的数据HAVING是筛选分组后的数据顺序不能搞反。索引这块重点考察的是联合索引的最左前缀原则和索引失效场景。比如一道选择题对于联合索引(a,b,c)以下哪个查询能够命中索引。正确答案是使用a或者同时使用a和b的查询只用b或者只用c的查询无法命中。这类题考的就是底层B树的结构原理你理解了联合索引在B树中的排列方式就永远不会纠结。事务这块则是考察ACID特性和隔离级别。默认隔离级别是什么、幻读发生在哪个级别、MVCC解决了什么问题这些是高频选择题考点。你在准备的时候把四种隔离级别和它们各自能解决/不能解决的问题列一张表考前过一遍基本就稳了。3. 测试专业能力题型重点解析3.1 测试理论选择题八股文也得背很多科班出身的同学觉得测试理论是“没什么技术含量”的内容但笔试题里这部分反而经常出多选题而且非常容易被扣分。常见的考点包括测试用例的设计方法等价类、边界值、因果图、判定表、正交实验等、测试的分类单元测试、集成测试、系统测试、验收测试、黑盒和白盒测试的区别、回归测试的执行时机、缺陷的生命周期。有一道经典的题目是这样出的以下哪些属于黑盒测试方法。选项给了边界值分析法、语句覆盖、判定覆盖、等价类划分、路径覆盖。正确答案是边界值分析法和等价类划分语句覆盖、判定覆盖、路径覆盖是白盒测试的方法。这道题本身不难但每年都有同学因为对“判定覆盖”到底属于黑盒还是白盒产生混淆而丢分。记住一个简单标准黑盒测试不考虑内部结构白盒测试基于代码逻辑设计用例。缺陷生命周期也是常考的点。一道题可能会问你缺陷从提交到关闭通常经历哪些状态。标准流程是New新建、Open打开、Fixed修复、Reopen重开、Closed关闭。有些公司会加一个Rejected拒绝状态。多选题里如果出现Pending、Review这类非标准状态要注意甄别别被干扰项带偏。3.2 测试用例设计题经典场景这么拆这套笔试卷的简答题里大概率会有一道测试用例设计题。常见的形式是“请设计一个微信发送红包功能的测试用例”或者“请针对登录功能设计测试用例”。我见过很多同学在这类题目上只写五六条就交卷了这是最可惜的丢分方式。测试用例设计题不是让你随便列几条而是考察你有没有完整的测试思路。我的建议是按照功能测试、性能测试、兼容性测试、安全测试、异常场景这五个维度去展开。拿“登录功能”举例。功能测试部分要去覆盖正确的用户名密码能否登录成功、正确的用户名错误的密码、不存在的用户名、空用户名或空密码、密码大小写是否敏感、多次输错密码是否锁定等。异常场景包括网络断开时的提示文案、服务器超时的处理、重复登录是否挤掉前一个会话。性能测试要考虑多用户同时登录时系统响应时间是否达标。安全测试则要关注SQL注入、密码传输是否加密、验证码是否过期等。写用例的时候还有一个加分项使用规范的用例格式。每条用例至少要包含用例编号、用例名称、前置条件、测试步骤、预期结果、优先级。你不但要写“测什么”还要写清楚“怎么测”和“正确结果是什么”。阅卷人看到这种规范的格式第一印象就是“这人接受过正规训练”分数绝对不会低。3.3 探索性测试场景题探索性测试是小米这类互联网公司比较看重的测试能力之一。选择题里可能会有这样的场景你测试一个电商购物车功能当购物车里已经有100件商品时继续添加商品发现页面响应明显变慢。以下哪个排查思路最合理。这种题没有绝对标准答案但你要展示出你的排查思路是有逻辑的。最合理的做法是先复现问题确认是稳定的性能问题还是偶发问题然后通过浏览器开发者工具看接口响应时间判断是前端渲染慢还是后端接口慢如果是后端慢进一步看SQL查询是否有性能问题比如是否在循环中查询数据库。类似的场景题还会出现在软件测试流程中比如“版本上线前一天发现一个严重缺陷你要怎么处理”。这种题考察的是风险判断能力和沟通能力回答时从评估影响面、和开发产品沟通、决定是否延期上线这几个角度展开就显得专业得多。4. 编程题思路与手写代码要点4.1 字符串处理类题目的套路编程题通常是整套卷子的重头戏也是拉开分数差距的关键。小米2019年这套卷子的编程题从考生回忆来看偏基础、偏应用很少出那种需要极强算法功底的压轴题反而更看重代码的规范性和完整性。给你还原一道高频考题实现一个函数将一个字符串中的每个空格替换成“%20”。这是一道非常经典的题目有多种解法。最简单的思路是新建一个StringBuilder遍历原字符串遇到空格就追加“%20”否则追加原字符。时间复杂度和空间复杂度都是O(n)代码也就十几行。但如果你以为题目就这么简单那就太小看测试开发的出题风格了。这道题真正的考点在后半句“请为你写的函数设计测试用例”。有些同学在编程题里只写代码不看后半句白白丢掉了测试用例设计的分数。给这个函数设计用例你要考虑字符串为空、字符串只有一个空格、字符串包含连续多个空格、字符串开头和结尾有空格、字符串不含空格、字符串包含中文字符和特殊字符等情况。你把这些写出来阅卷人就会觉得你确实有测试开发的思维。4.2 针对测试开发的特殊编码要求4.2.1 代码规范性和边界条件测试开发的编程题阅卷标准跟软件开发岗有一个很大的区别非常看重代码的健壮性。如果一道题要求你实现“查找数组中重复的数字”开发岗可能只需要写出核心逻辑但测试开发岗批卷时会特别关注数组为空时你的代码会不会直接崩、数组长度为1时结果对不对、输入不符合要求时有没有做防御性处理。我建议你在写代码时养成几个好习惯。第一进入函数后先做入参检查如果参数非法返回错误或抛出异常。第二循环中注意边界条件比如i从0开始还是从1开始、循环条件用小于还是小于等于这个小细节每年都能卡住无数人。第三写完之后花几十秒时间在草稿纸上用手工数据跑一遍你的代码逻辑这个习惯能帮你避免一半以上的低级错误。4.2.2 从测试视角补全场景还有一类编程题会直接要求你“实现一个类中的某个方法并补充测试代码”。比如要求你实现一个简单的LRU缓存或者实现一个时间戳转换函数。这类题目考的是工程能力代码好不好是其一你有没有测试意识是其二。以LRU缓存为例写完get和put方法的核心逻辑之后你至少还要补充以下几种测试场景缓存容量为1时反复读写、缓存满了之后再写入新数据触发淘汰、get一个已存在的key是否会把它移到最新位置、key不存在时get返回什么。这些场景的补充能直接体现你对这个数据结构的理解深度。另一个实用的建议如果题目没指定编程语言优先选Python。不是说Java不好而是Python在笔试场景下有天然优势——代码量少、写得快、不容易有语法错误留给测试用例设计的时间更充足。小米技术栈虽然以Java和Android为主但测试开发岗位用Python写自动化脚本的场景非常多所以用Python答题完全没问题。5. 常见丢分点与备考点拨5.1 这些坑我当年也踩过5.1.1 不细读题目答非所问我见过最可惜的丢分方式就是题目让你“列出测试用例”结果你写了一堆测试要点。测试用例和测试要点是两码事用例必须包含输入、操作步骤和预期结果要点只是一个思路概括。还有一个高频翻车点题目问“哪些测试方法属于黑盒测试”有同学把白盒测试方法也写上去了。这类题目通常是不定项选择多选一个就全扣。所以考试时遇到不确定的选项宁可少选也不要乱选尤其在多选题上保守策略比冒险策略得分期望更高。5.1.2 编程题没有测试代码这是测试开发笔试和普通开发笔试最大的不同。普通开发笔试题你写出正确的代码就能拿满分。测试开发笔试题你只写代码大概率只能拿一半分。很多同学考完对答案觉得自己代码写对了结果分数不理想原因就在这里。你要理解出题人出这套卷子的目的是筛选“测试开发”不是“开发”。如果你在代码之后主动补充了测试用例、边界条件分析、异常场景说明这部分会非常亮眼。哪怕你的代码有一两个小bug完善的测试设计也能帮你挽回大量分数。5.2 针对小米风格的复习路线建议5.2.1 分阶段准备策略根据这套题的特点我建议你把复习分成三个阶段。第一阶段是基础巩固集中用一到两周把数据结构、操作系统、计算机网络、数据库的核心知识点过一遍。不要去啃厚厚的教材直接用面向面试的复习资料重点掌握高频考点。这个阶段的目标是所有基础选择题都能做对。第二阶段是编程提升每天保证手写两到三道算法题重点练习链表、二叉树、字符串处理、动态规划入门。写完之后一定要追问自己这个函数的边界条件有哪些如果输入数据量特别大代码会不会超时如果输入非法数据代码会不会崩溃这些问题就是在培养测试思维。第三阶段是模拟实战找一套完整的测试开发笔试题限定时间做完。注意不仅要关注自己做对了多少更要分析自己在哪里浪费了太多时间。通常来说选择题不要纠结超过2分钟一题不会的先跳过编程题留足30分钟以上测试设计题至少留15分钟。5.2.2 针对性补强测试知识除了通用的编程和计算机基础测试开发笔试还有一个独特的准备方向系统学习测试理论。不要觉得看几篇博客就够了我建议你读一本系统的软件测试教材至少要掌握测试生命周期、测试用例设计方法、缺陷管理流程、自动化测试框架的基本概念、常见测试工具的使用。这些东西在笔试中会以选择题和设计题的形式出现在工作面试中更是必问。如果你还有余力可以了解一下常见的测试工具比如JMeter、Selenium、Postman、Python的pytest框架。不需要多深入但要能说出它们的用途和基本原理。2019年的卷子里出现过一道关于自动化测试工具用途的匹配题给出一堆工具的名称和描述让你连线。这种题只要平时接触过基本就是送分题但如果完全没见过就只能靠猜了。最后再分享一个我在实际面试中发现的规律能在测试设计题里写出高质量用例的同学往往不是基础最好的而是逻辑习惯最好的。平时练习时养成拿到一个功能就下意识拆解测试点的习惯不只是为了笔试对后面真刀真枪做测试开发工作更有帮助。笔试卷子是死的但思路是活的把每一道设计题都当成真实项目里的测试任务来对待你会比其他候选人多得不止一星半点的分数。