小米2020测开笔试题二解剖:五大核心模块与备战策略

发布时间:2026/9/1 22:24:56
小米2020测开笔试题二解剖:五大核心模块与备战策略 先说明一下这份“小米2020校招测试开发工程师笔试题二”我手里并没有原始卷子网上能搜到的也大多是零散回忆版。但这类大厂测开校招笔试考来考去就那几板斧编程基础、计算机网络、操作系统、数据库、测试理论、以及一道压轴的测试设计题。所以我这篇文章不讲“答案”而是把这套卷子背后真正想考察的东西拆给你看再给出一套可以直接照做的备战思路。你可以把它当成一份“测开笔试题型解剖报告”也可以当成一份自检清单来用。1. 为什么大厂笔试偏爱“看起来不考测试”的题很多准备测开岗位的同学第一反应是把《软件测试的艺术》翻烂把等价类划分、边界值分析背得滚瓜烂熟结果一上考场发现卷子上全是数据结构、网络协议、Linux命令、SQL查询当场就懵了。1.1 测开的第一身份是开发第二身份才是测试这是我想先纠正的一个核心认知测试开发工程师前缀是“开发”后缀才是“测试”。小米这类公司的测开岗日常工作不是点点点而是写自动化测试框架、搭测试平台、做性能压测工具、维护CI/CD流水线。你写的代码要跑在线上环境要和开发代码做代码评审要能定位问题是前端还是后端、是网络还是数据库。所以在笔试环节它必须先用“开发能力”筛掉一批人。这就是为什么编程题占了卷面的大头而且难度往往对标开发岗——不是让你随便写个冒泡排序而是要在限定时间内完成一道有明确复杂度和边界条件要求的算法题。1.2 测试理论题不是要你背定义而是要你“证明能干活”还有一类题看起来是送分的理论题比如“什么是等价类划分”“黑盒测试和白盒测试的区别”。但大厂不会直接这么问它会给你一个具体场景比如“有一个登录功能用户名要求6-16位字母或数字密码要求8-20位且必须包含大小写字母和数字请设计测试用例。”这种题考察的不是你背没背过“等价类”“边界值”这些术语而是你能不能把这些理论真正用到实际功能上。能分辨有效等价类和无效等价类、能想到边界值6位和16位、能覆盖“字母开头但包含特殊字符”的非法情况——这才是一个测开该有的测试思维。所以你看整张卷子的设计逻辑其实是先用编程题确认你有开发能力再用测试设计题确认你有测试思维最后用网络、数据库、Linux这些基础题确认你的计算机功底够不够扎实。三者缺一不可。2. 卷面结构拆解每一类题型都在筛选什么能力基于我对历年大厂测开笔试的观察小米2020校招测开笔试二的题型分布大概率是下面这个结构。我按“考察目的”而不是“题目顺序”来拆因为这样更容易让你看懂考官的意图。2.1 编程题限时内写出“能跑且能处理边界”的代码编程题通常有2-3道分值占比最高一般在40%-50%之间。难度从Easy到Medium偏Hard不等偶尔会有一道Hard但很少有变态题。常见的出题方向字符串处理反转、去重、最长子串、模式匹配数组与指针双指针、滑动窗口、排序变种链表操作反转链表、合并有序链表、判断环二叉树遍历前中后序、层序、最近公共祖先动态规划入门背包问题、爬楼梯、最长公共子序列这里的筛选标准不是“能不能写出来”而是“能不能在45分钟内写出来跑通测试用例处理边界条件”。很多同学刷LeetCode习惯性看题解上了考场才发现自己根本写不出完整代码——这就是平时练习方式出了问题。笔试不是考察“你见过多少题”而是考察“你在压力下能不能独立产出高质量代码”。2.2 计算机网络与操作系统测开的“底层内功”这部分题目占比大约20%-30%形式是选择题简答题。网络方面的高频考点TCP三次握手和四次挥手的过程、为什么不握手两次HTTP和HTTPS的区别、HTTP请求头和状态码的含义GET和POST的区别语义层面、是否幂等、请求体Cookie和Session的区别、Token的认证流程DNS解析过程、输入URL后发生了什么操作系统方面的高频考点进程和线程的区别、进程间通信方式死锁的四个必要条件、如何避免死锁虚拟内存、页面置换算法用户态和内核态的区别你可能会问这些和测试开发有什么关系关系太大了。你写接口自动化测试不知道HTTP状态码的含义怎么判断请求失败的原因你排查线上问题时发现请求超时不知道是网络问题还是服务端问题、是带宽问题还是DNS解析问题怎么定位2.3 数据库与Linux测开日常工作的“左膀右臂”数据库题主要考SQL编写常见的有多表联查JOIN、LEFT JOIN、RIGHT JOINGROUP BY HAVING的聚合查询子查询、EXISTS和IN的区别索引失效的场景、事务的ACID特性Linux题主要考常用命令查看日志tail、grep、awk查看进程ps、top、lsof权限管理chmod、chown网络排查netstat、ping、curl文件操作find、sed、sort、uniq这两块不单独出大题但选择题和简答题里一定会涉及。它们的共同特点是工作中每天都要用但很多科班出身的人反而学完就忘了。2.4 测试设计题压轴大题考察“测试思维”的成色最后一道大题通常是测试设计题分值20%左右。题目会给你一个功能模块让你设计测试方案。比如“小米商城App的商品搜索功能支持关键词搜索、筛选排序、搜索历史记录请设计完整的测试方案。”这道题是区分“真测开”和“刷题党”的分水岭。因为编程题可以靠刷题突击网络和数据库可以靠背面试题突击但测试设计题考察的思维深度、覆盖面、逻辑条理不是短时间内能补出来的。3. 编程题实战演练从“能跑”到“跑得好”这一节我用一道典型的测开笔试编程题来演示完整的解题路径。这道题是我根据大厂测开笔试的常见风格改编的和原卷不是同一道题但考察逻辑完全一致。题目给定一个字符串请找出其中无重复字符的最长子串的长度。3.1 第一层暴力解法先保证“能跑”看到一道题最快能想到的往往是暴力解法。这道题可以枚举所有子串检查每个子串是否有重复字符取最大值。def length_of_longest_substring(s: str) - int: n len(s) max_len 0 for i in range(n): for j in range(i 1, n 1): sub s[i:j] if len(set(sub)) len(sub): max_len max(max_len, len(sub)) return max_len时间复杂度是O(n³)——枚举所有子串O(n²)判断是否有重复字符O(n)。这个解法能跑通小数据但肯定不是笔试要的答案。3.2 第二层滑动窗口写出“能过所有用例”的解法笔试时你直接写暴力解法大概率只能拿到基础分甚至可能超时。这时候需要想到用滑动窗口优化。def length_of_longest_substring(s: str) - int: left 0 max_len 0 char_set set() for right in range(len(s)): while s[right] in char_set: char_set.remove(s[left]) left 1 char_set.add(s[right]) max_len max(max_len, right - left 1) return max_len用两个指针left和right维护一个窗口右指针不断右移左指针在遇到重复字符时才移动。这样每个字符最多被访问两次时间复杂度降到O(n)空间复杂度O(min(n, m))m是字符集大小。3.3 第三层边界条件与自测用例展示“测试思维”很多同学写完代码就交卷这是大忌。笔试时写完了一定要自己构造几个边界用例在脑子里跑一遍。这时候你的“测开思维”反而成了优势# 边界用例 assert length_of_longest_substring() 0 # 空字符串 assert length_of_longest_substring(a) 1 # 单字符 assert length_of_longest_substring(aaaa) 1 # 全重复 assert length_of_longest_substring(abcabcbb) 3 # 经典用例 assert length_of_longest_substring(pwwkew) 3 # 经典用例 assert length_of_longest_substring(dvdf) 3 # 易错用例答案是vdf不是dvf实践出真知我自己的经验是笔试时给自己留出5-10分钟专门跑边界用例这笔时间花得非常值。大厂笔试的判分系统通常会有30%-50%的隐藏测试用例是专门针对边界的很多人代码逻辑看着没问题一跑隐藏用例就挂原因就在这里。3.4 一个容易忽略的加分项讲清楚思路再动手在线笔试通常有文本输入框但如果你是在面试环节遇到算法题建议先讲思路再写代码。哪怕是在线笔试我建议你在草稿纸上先画一下窗口移动的过程确认思路没问题再写。这样做有两个好处一是避免写到一半发现方向错了推倒重来白白浪费时间二是如果未来进入面试环节你能笑着说出“我用滑动窗口左指针维护窗口左边界右指针扩展窗口用set判断重复时间复杂度O(n)”——这种表达的流畅度是要靠在草稿纸上反复练出来的。4. 计算机网络与操作系统测开视角下的考点重排这一节我不按教科书章节顺序讲而是按“测开工作里最常遇到问题的场景”来重排考点优先级。4.1 你测接口时其实就在考HTTP协议接口自动化测试是测开的核心工作之一。两个接口测着测着发现一个返回200一个返回404作为测开你不能只说“这个bug归开发管”你得能定位初步原因。需要掌握的HTTP知识按优先级排列第一优先级——状态码语义2xx成功。200是OK201是Created204是No Content3xx重定向。301永久重定向、302临时重定向、304 Not Modified缓存相关4xx客户端错误。400 Bad Request请求格式错误、401 Unauthorized未认证、403 Forbidden无权限、404 Not Found资源不存在、429 Too Many Requests限流5xx服务端错误。500 Internal Server Error、502 Bad Gateway网关错误、503 Service Unavailable服务不可用、504 Gateway Timeout第二优先级——请求方法和语义GET获取资源幂等参数在URL上POST创建资源非幂等参数在请求体PUT整体更新资源幂等PATCH局部更新资源DELETE删除资源第三优先级——常见请求头和响应头Content-Typeapplication/json、application/x-www-form-urlencoded、multipart/form-dataAuthorizationBearer Token、Basic AuthCookie和Set-CookieCache-Control、Expires、ETag要提醒的是很多同学会把GET和POST的区别背成“GET参数在URL上、POST参数在请求体里”这只是表象。从语义上讲GET应该只是获取数据POST可以修改数据从幂等性来讲GET是幂等的POST不是。面试官问这个问题不是要你背区别而是想确认你有没有真正理解HTTP的设计思想。4.2 测性能压测时你要懂的TCP和连接池压测是测开经常要做的活但很多同学做压测时只会用JMeter配置线程数、循环次数看个聚合报告就结束了。一旦发现吞吐量上不去或者大量连接超时就不知道该从哪里排查。这时候TCP基础知识就派上用场了三次握手客户端发送SYN服务端回复SYNACK客户端再发送ACK。三次握手保证了双方的收发能力都正常同时交换初始序列号。为什么要三次而不是两次因为两次握手无法防止“已失效的连接请求突然又传到服务端”这种情况会导致服务端白白建立连接浪费资源。四次挥手主动方发送FIN对方回复ACK对方再发送FIN主动方回复ACK。为什么挥手比握手多一次因为TCP是双工的每个方向的关闭都必须单独确认。TCP连接池HTTP/1.1的Keep-Alive、HTTP/2的多路复用、连接池的大小设置——这些在压测时都是关键参数。连接池太小大量请求会排队等待连接池太大又可能把服务端的文件描述符耗尽。这也是压测结果“不理想”时最常见的排查方向之一。4.3 进程、线程和并发你写自动化脚本时脑子里得有这张图写自动化测试的时候你可能会用多线程去并发执行测试用例这时候就涉及到进程和线程的区别。简单理解进程是操作系统资源分配的最小单位线程是CPU调度的最小单位。同一个进程下的多个线程共享进程的内存空间所以线程间通信比进程间通信高效但同时也带来了线程安全问题——多个线程同时读写同一个变量结果可能是错的。写自动化测试脚本时我踩过这样的坑用Python的threading模块起10个线程并发执行用例结果发现每个线程都在往同一个日志文件写内容写着写着日志就乱码了。这就是典型的线程安全问题解决办法是给写日志的操作加锁或者改用Queue来收集日志再由单线程输出。操作系统的知识不一定要背得多深但要有这个意识凡是涉及并发、资源竞争、死锁的场景都能往操作系统原理上靠。面试官问这些其实是在模拟你未来的工作场景。4.4 笔试高频简答题背下来不如理解透这里列几个测开笔试中最常出现的简答题我给出理解型答案而不是标准答案题目1进程间通信的方式有哪些管道Pipe单向传递适用于父子进程消息队列内核中的消息链表可以实现双向通信共享内存效率最高但需要处理同步互斥问题信号量主要用于解决进程间同步问题套接字Socket适用于不同机器上的进程通信题目2死锁产生的条件是什么四个必要条件互斥、持有并等待、不可剥夺、循环等待。打破任何一个条件死锁就不会发生。比如用银行家算法可以破坏“循环等待”用资源排序分配可以防止“持有并等待”。题目3什么是虚拟内存把磁盘的一部分当作内存来用通过分页机制把进程的虚拟地址空间映射到物理内存或磁盘上。进程看到的是连续的虚拟地址实际上数据可能分散在不连续的物理页框里甚至被换出到磁盘上。这些题目在工作里不会有人拿来问你但它们对应的底层逻辑——资源竞争、并发控制、内存管理——是你每天写代码都在面对的问题。5. 数据库与Linux两道“送分题”其实是“隐性筛选器”我见过不少候选人编程题写得不错但一遇到SQL题就开始磕磕绊绊。这里有个反直觉的事实数据库和Linux题看起来是考基础实际上是考“工程习惯”——等你入职后每天都要查库、查日志这些技能熟练不熟练面试官其实心里有数。5.1 SQL高频题型从“写过”到“写得对”笔试里SQL题不会太难但陷阱不少。我按出现频率排个序第一类JOIN家族给你两张表一张是用户表users一张是订单表orders查“所有用户及其订单数量没有订单的用户也要显示”。SELECT u.id, u.name, COUNT(o.id) AS order_count FROM users u LEFT JOIN orders o ON u.id o.user_id GROUP BY u.id, u.name;陷阱点在LEFT JOIN和GROUP BY的结合使用。很多人会忘记COUNT(o.id)对比COUNT(*)的区别——如果LEFT JOIN产生NULL行COUNT(*)会把NULL也算进去导致结果偏大。第二类GROUP BY HAVING查“订单金额大于1000的用户ID”。SELECT user_id, SUM(amount) AS total_amount FROM orders GROUP BY user_id HAVING SUM(amount) 1000;这里注意HAVING是配合GROUP BY使用的不能用WHERE替代。WHERE是在分组之前过滤HAVING是在分组之后过滤。第三类子查询和EXISTS查“没有下过单的用户”。SELECT id, name FROM users WHERE NOT EXISTS ( SELECT 1 FROM orders WHERE orders.user_id users.id );用NOT EXISTS而不是NOT IN是因为NOT IN在子查询返回NULL时会出问题结果可能为空。5.2 常被忽略的索引考点SQL题之外数据库的索引问题也是选择题的常客。测开工作中不一定要写索引但一定要能看懂执行的SQL是否走了索引。几个高频考点B树索引的特点叶子节点存储数据、非叶子节点只存键值、天然有序最左前缀原则联合索引(a, b, c)能用到(a)、(a, b)、(a, b, c)但不能单独用(b)或(c)索引失效的场景对索引列使用函数、隐式类型转换、LIKE以%开头覆盖索引查询的列都在索引中不需要回表别小看这些你写性能测试脚本时往数据库里灌数据、查数据背后全是这些机制在工作。5.3 Linux命令测开线上排障的基本功笔试里Linux选择题通常是“哪个命令能实现XX功能”但实战场上是要你真刀真枪在服务器上操作的。我按测开工作的使用频率列出必须熟练的命令查日志tail -f app.log实时跟随日志grep ERROR app.log按关键字过滤tail -n 100 app.log | grep timeout查看最后100行并按关键字过滤awk {print $4} app.log | sort | uniq -c统计日志中某个字段的分布查进程ps -ef | grep java查看Java进程top -p 1234查看指定进程的资源占用lsof -i :8080查看谁占用了8080端口查网络curl -I http://example.com查看响应头ping -c 4 example.com测试连通性netstat -tunlp查看端口监听状态查磁盘df -h查看磁盘使用率du -sh *查看当前目录下各文件大小笔试前建议把这些命令在本地虚拟机上实际操作一遍光看是记不住的。6. 压轴测试设计题一套可以“套用”的万能框架这一节是很多人最关心的部分。测试设计题没有标准答案但有相对规范的答题框架。用好这个框架至少能保证你的答案在逻辑上是完整的。6.1 第一步先划清测试范围和测试类型拿到题目不要上来就写用例先缕清楚你要覆盖哪些测试类型功能测试核心功能是否正确界面测试UI是否正常展示、交互是否符合预期兼容性测试不同设备、浏览器、操作系统版本性能测试响应时间、并发量、资源占用安全测试权限控制、数据加密、越权访问异常场景测试网络异常、服务器异常、数据异常在答题纸上先列出这六类说明“我将从以下几个方面设计测试方案”然后再展开每一类。这会让面试官觉得你有全局视野。6.2 第二步功能测试用例的设计思路以“搜索功能”为例假设题目是“小米商城App的搜索功能”功能测试部分是得分大头。不要零散地列用例而是分层组织第一层输入框本身正常输入关键词能正确跳转到搜索结果页输入长度为1个字符、50个字符、边界长度输入特殊字符如#、%、空格输入emoji、表情符号输入XSS攻击脚本如scriptalert(1)/script看是否有过滤输入SQL注入语句如 OR 11 --看是否有参数校验第二层搜索结果完全匹配的关键词结果排序是否合理部分匹配的关键词是否能返回模糊匹配结果无结果时是否给出“未找到相关商品”的提示结果过多时是否分页、分页是否正确结果中商品信息价格、图片、标题是否完整第三层筛选与排序按价格升序/降序排列是否准确按销量排序是否和后台数据一致筛选条件叠加如“价格区间品牌”结果是否正确无筛选结果时是否有空态提示第四层搜索历史与搜索联想搜索历史是否按时间倒序展示清除搜索历史后页面是否及时刷新搜索联想词是否包含输入内容点击联想词是否能正确跳转第五层异常场景和网络切换网络断开时点击搜索的提示信息网络超时后重试是否正常恢复弱网环境下搜索结果是否完整加载服务器返回500时是否有错误提示而不是白屏这样一层层展开用例的覆盖度就上来了。6.3 第三步非功能测试的“保底项”写完功能测试很多人就收笔了。如果想拿高分一定要补上非功能测试的部分兼容性测试iOS10-14版本和Android8-12版本主流机型小米、华为、苹果、OPPO、vivo平板和手机端适配性能测试搜索接口的响应时间P95小于500ms搜索结果页的加载速度首屏时间小于2秒并发搜索时系统的吞吐量和错误率安全测试搜索关键词是否被记录和脱敏是否有接口限流防刷机制是否能通过修改请求参数越权查看他人信息易用性测试搜索框是否有默认提示文案空搜索时点击放大镜是否有友好提示键盘搜索按钮是否触发了正确的事件提示写测试设计题时重要的是“广度”和“条理”不要追求每一条都写得极其详细。在有限时间内先保证覆盖面够广、结构够清晰再补充细节。6.4 第四步用“测试用例表”的形式呈现最后把重点用例整理成表格形式会显得非常专业用例编号前置条件操作步骤预期结果优先级TC001已登录网络正常输入“小米手机”点击搜索跳转搜索结果页结果包含“小米手机”相关商品P0TC002未登录输入关键词搜索正常展示结果不强制登录P1TC003网络断开输入关键词点击搜索提示“网络异常请检查网络设置”P1TC004搜索历史非空点击搜索框按时间倒序展示搜索历史最多10条P2TC005服务器异常发送搜索请求页面提示“服务开小差了”不崩溃P17. 笔试前一天和考试当天的实战策略准备到这个程度知识点层面差不多了。但考场上的策略能决定你能不能发挥出真实的水平。7.1 时间分配编程题要留足千万不要恋战假设笔试总时长90分钟我建议这样分配前5分钟快速浏览整张卷子确认题型分布和分值占比编程题45-50分钟先做自己最有把握的那道保证AC一道再考虑下一道选择题和填空题15-20分钟会的直接选拿不准的先标记不要卡住测试设计题15-20分钟按照上面的框架分层写要点不需要写完整测试用例如果编程题卡了15分钟以上还没思路果断先跳过去做后面的题。你的目标是总分最大化不是每题都最优解。有些同学一上来就死磕最后一道压轴编程题结果前面的送分题都没时间看这种策略是最亏的。7.2 编程题的判分逻辑部分得分也是分在线笔试系统通常用过隐藏测试用例来判分。如果一道题你不会做至少要把暴力解法写出来说“能跑通样例”。因为判分系统是按通过的测试用例数量算分暴力解法能通过那些小规模用例至少能拿一点分。另一个技巧是代码里加注释说明你的思路。虽然自动判分系统看不到注释但如果这场笔试后面还有人工复筛注释会显得你很专业。我见过不少因为“代码注释清晰、思路明确”而被捞起来的简历。7.3 测试设计题的时间控制宁可提纲完整不要细节完美测试设计题最容易犯的毛病是第一层输入框就写了20条用例写到后面发现时间不够了筛选、排序、安全测试这些维度都没覆盖。正确做法是先用5分钟列出所有测试维度的提纲然后均匀分配时间每个维度写3-5条代表性用例。等提纲完整了如果还有时间再回到某个维度补充细节。这样即使没写完你的答案是“结构完整”的而不是“只覆盖了一个角落但很详细”。7.4 心态调整笔试只是筛选不是选拔最后说点实在的。很多同学把笔试当成“一考定生死”焦虑得不行。但大厂的招聘流程通常是“笔试面试综合评估”笔试更多是起到“筛掉明显不达标的人”的作用而不是要把所有候选人按分数排名然后只录用前几名。所以不用追求满分只要保证基础题不丢分、编程题能做出来一道、测试设计题结构完整就已经能超过大部分人了。我见过笔试编程题只AC一道的同学进面试也见过笔试成绩很高但面试时聊崩了的案例。笔试是敲门砖别让它变成心理包袱。8. 从笔试到Offer测开岗位面试的“潜规则”补充既然你已经准备笔试了那面试环节的问题也不妨提前了解一下。大厂测开面试通常有三轮技术面加一轮HR面。技术面里除了简历深挖还会考察以下几类问题8.1 项目经历的深挖比技术八股更看重“真实性”面试官会问“你在学校的课题/实习项目中有没有做过测试相关的工作”注意这里不是真的关心你做过什么而是想看你是怎么思考的。重点准备几个方面项目的测试策略为什么先做功能测试再做性能测试发现过哪些Bug描述一个最有代表性的Bug你是怎么定位的测试数据的准备你用了多少条测试数据数据是真实的还是构造的有没有写过自动化脚本用什么框架怎么设计用例组织方式这些问题没有标准答案重点是逻辑自洽、细节真实。可以通过补充一些细节来增强说服力。8.2 常见面试题除了八股文你会考察“为什么”除了算法题测开面试的第二类高频题是“你为什么选择测开方向”“你觉得测开和纯开发有什么区别”“如果开发不修Bug你怎么办”。这类问题考察的不是知识点而是你的职业认知和沟通能力。我比较推荐的回答思路是不贬低纯开发也不抬高测开而是强调“通过技术手段保证质量”这个核心价值。举例来说“我的编程能力和开发同学相当但我更关注的是代码上线后的质量表现。测试开发是一道安全网我想做的是通过自动化工具、测试平台和性能分析让团队在快速迭代的同时不用牺牲质量。”8.3 反问环节提一个问题能体现你的水平面试最后面试官通常会问“你有什么想问我的”。建议准备一个关于团队技术栈或测试体系建设的问题。比如“咱们团队现在的自动化测试覆盖率大概在什么水平主要用哪些测试框架”“测开团队和开发团队的协作流程是怎样的测试用例的评审机制是什么”千万不要问“这个岗位加班多不多”“薪资大概多少”这类问题至少要留到HR面再谈。写到这儿这篇关于“小米2020校招测试开发工程师笔试题二”的拆解就差不多完整了。整张卷子的底层逻辑其实很简单它不是在考你背了多少概念而是在模拟一个测开新人入职后的前三个月——写自动化脚本要会编程定位问题要懂网络和系统查数据要会SQL查日志要懂Linux设计测试方案要有测试思维。把这五件事练扎实了无论哪一年的笔试题对你来说都只是换了层皮而已。