我当年在准备测试开发岗位的校招时,最大的感受是:网上关于测试开发笔试的真题复盘少得可怜,尤其是大厂真题,基本都是零散的题目拼接,很少有人从整套卷子的角度讲清楚“这题为什么这么出、答到什么程度能过”。今天拿“2022年小米秋招笔试-测试开发-卷2”为例,结合我自己的备考和面试经验,完整拆一遍这套卷子的考点结构、答题思路和复习方向。如果你是准备测试开发岗位的校招生,或者打算从功能测试转自动化测试方向,这份复盘应该能帮你少走不少弯路。
这套卷子整体不算特别难,但覆盖面很广,题量也不小,特别考验你在有限时间内对计算机基础、测试理论、编程能力和场景分析的综合反应。它不像纯后端开发岗那样死磕算法和系统设计,而是会在常规考点之外加入大量测试思维相关的题目,这也是测试开发岗笔试和普通开发岗笔试最大的区别。我逐模块拆开讲。
1. 笔试整体设计与岗位定位
1.1 这份卷子到底在考什么
小米测试开发岗的秋招笔试,从题型上大致可以分为五块:选择题、简答题、编程题、测试设计题和场景分析题。卷2给我的整体感觉是,它特别注重两个东西:第一,你是否具备扎实的计算机基础功底;第二,你是否具备从“用户视角”和“系统视角”双重角度去发现问题的能力。
选择题部分覆盖了数据结构、操作系统、计算机网络、数据库、Python/Java基础语法等常规内容,占比大概在40%左右。简答题一般会考察测试理论、测试流程、自动化测试框架的理解,偶尔也会让你写SQL或Linux命令。编程题通常是两道左右,难度在LeetCode中等偏下,不会故意刁难你,但要求你代码风格清晰、逻辑严谨。
测试设计题往往放在比较靠后的位置,给你一个具体的场景(比如登录框、购物车、文件上传),让你写出完整的测试用例。这类题没有标准答案,但阅卷人有非常明确的踩分点。场景分析题则偏重考察你对线上问题、性能瓶颈、异常场景的处理思路,相当于一次简化版的系统设计面试。
1.2 测试开发笔试和纯开发笔试的区别
很多人第一次做测试开发笔试题时会犯一个错误:把它当成纯开发笔试题来做,死磕算法题和底层源码。实际上,测试开发岗考察的算法的难度和侧重点与开发岗有明显区别。
开发岗笔试更关注“你能否高效地写出一个正确且性能优秀的解决方案”,算法能力是核心评判维度。而测试开发岗笔试更关注“你能否发现代码中的缺陷、能否设计出覆盖全的场景用例、能否通过自动化手段提升测试效率”。所以你会看到,同一道编程题,测试开发岗可能还会多问一句“你会怎么测试这个函数”,这就是典型的测试思维考察。
理解了这一层,你就明白为什么这套卷子里会出现一些看似“跟开发无关”的题目,比如“如何测试一把椅子”“如何测试一台自动售货机”。这些题目背后考察的不是知识量,而是你的测试思维是否成体系。这点非常重要。
2. 核心考点逐个拆解
2.1 数据结构与算法:笔试的重头戏
不管哪个大厂的测试开发笔试,数据结构与算法都是绕不开的。卷2中的算法题重点集中在以下几类:字符串处理、数组与双指针、链表操作、二叉树遍历、简单的动态规划。
字符串处理几乎是必考。因为测试开发日常工作中大量涉及接口参数校验、日志解析、测试数据构造,字符串操作能力直接反映基本功。常见题目包括:判断回文串、字符串反转、最长公共前缀、找出字符串中第一个不重复的字符。这些题表面简单,但要在限定时间内写出边界条件完整的代码,还是需要一定训练的。
数组与双指针类题目也很高频。比如“给定一个有序数组,移除重复元素并返回新长度”“旋转数组的最小值”这类LeetCode基础题,在笔试中出现的概率很大。要注意的是,测试开发岗的编程题有时候会多一个要求:不允许使用额外的辅助空间。这就考察你是否真的理解双指针思想,而不是只会用set或dict去重。
二叉树和动态规划相对出现得少一些,但一旦出现,往往是拉分题。我建议你至少掌握二叉树的层序遍历、前中后序遍历(递归和迭代两种写法)、最近公共祖先这类经典题。动态规划只需要掌握最基础的斐波那契、爬楼梯、最大子序和就够用,不建议在校招笔试阶段花太多时间刷难题,性价比太低。
2.2 计算机网络与操作系统:基础不能丢
计算机网络在测试开发笔试中的地位很高,因为测试工作天然和网络请求打交道。卷2的选择题里,TCP三次握手、四次挥手、HTTP状态码、GET与POST的区别、Cookie与Session的区别几乎年年出现。
这里有一个容易踩坑的点:很多人背八股文只记结论,不知道为什么。比如问到“为什么TCP连接需要三次握手”,如果你只回答“为了确认双方收发能力正常”,这是基础分,但想拿高分,最好补充一句“如果只有两次握手,服务端无法确认客户端的接收能力,也无法防止已失效的连接请求报文突然到达服务端导致的资源浪费”。这种深度能在简答题中明显拉开差距。
操作系统考察的重点是进程与线程的区别、死锁的四个必要条件、进程调度算法、内存管理中的分页与分段、虚拟内存。选择题居多,偶尔会在编程题里出现一道与并发相关的题目,比如“两个线程交替打印奇偶数”。这类题在测试开发笔试中比较常见,因为它既考察多线程基础,又考察代码能力,建议你提前把基于锁、基于条件变量、基于信号量的写法都过一遍。
2.3 数据库与Linux:贴近实战的高频题
数据库在测试开发笔试中的考察方式和开发岗不太一样。开发岗更偏向索引优化、事务隔离级别、MVCC等底层原理,而测试开发岗更多是让你写SQL,或者给你一张表让你设计测试数据。
卷2中出现的SQL题通常不会太复杂,基本都是单表查询、分组统计、连表查询、子查询。比如“查询每个部门薪资最高的员工”“统计订单表中每个用户的下单次数并排序”。备考时不要只背语法,一定要自己在本地环境里跑一遍,特别是GROUP BY与HAVING的关系、LEFT JOIN与INNER JOIN的区别、NULL值的处理逻辑,这些都是常错点。
Linux命令同样很考基本功。测试开发日常需要查看日志、操作文件、监控进程,所以常见命令必须熟练:ls、cd、cp、mv、rm、ps、top、grep、awk、sed、find、tar、chmod、netstat。笔试里常出现的形式是:“编写一条命令,查找/var/log目录下最近7天内修改过并且包含error关键字的文件”。这种题就是考你会不会组合使用find、grep等命令,平时多练练就好。
3. 测试理论加编程题到底怎么答
3.1 测试用例设计题的答题套路
测试用例设计题是测试开发笔试的灵魂题型,也是很多非科班同学最害怕的题型。但说实话,这类题是有固定答题套路的,掌握了套路就能拿到大部分分数。
以“设计一个登录功能的测试用例”为例,很多人上来就写“输入正确的用户名和密码,点击登录,验证是否登录成功”,然后就写不出来了。这个答案只能得两分。正确的打开方式是按以下几个维度展开。
功能测试维度:正常登录成功、用户名不存在、密码错误、用户名或密码为空、用户名或密码包含特殊字符、密码大小写敏感、记住密码功能、忘记密码跳转、登录失败后的错误提示是否友好、连续输错多次后是否锁定账号、锁定时间是否准确。
界面测试维度:输入框长度限制是否合理、密码是否密文显示、错误提示是否在正确位置显示、页面在不同分辨率下的显示是否正常、键盘快捷键是否可用。
兼容性测试维度:不同浏览器(Chrome、Firefox、Safari、Edge)下功能是否一致、不同操作系统(Windows、macOS、Linux)下是否正常、不同移动端设备上自适应布局是否正常。
安全测试维度:SQL注入尝试(输入框输入单引号或拼凑SQL语句)、暴力破解防护(连续尝试登录是否触发验证码)、密码传输是否加密(抓包查看是否为明文)、是否支持第三方登录的绑定关系安全。
性能测试维度:多用户同时登录时的响应时间、弱网环境下登录是否卡死或崩溃、数据库连接池在高并发情况下是否连接失败。
异常场景维度:请求超时、后端服务异常(HTTP 500)、网络中断后重试、用户会话过期后再操作、切换后台再回到页面。
你看,按这个框架去写,一个登录功能写出三四十条用例完全没有问题。关键是你要养成分类思考的习惯,而不是看到题目后就零散地乱写。这里的核心逻辑是:先按测试类型分类,再在每个分类内穷举输入、状态、环境的组合。
3.2 编程题换皮不换里的本质
卷2的编程题部分,表面看起来题型五花八门,但剥开外壳看内核,考察的仍然是那几类基础能力。我反复跟准备校招的朋友说:不要被题目长长的描述吓到,先把它翻译成已知的数据结构和算法模型。
比如“给定一个字符串,找出其中不含重复字符的最长子串长度”,本质上就是双指针加滑动窗口。再比如“判断两个链表是否相交并返回相交节点”,本质上是链表的遍历和长度差计算。测试开发的编程题不会出太难的东西,但很讲究边界条件:空输入、单元素输入、全重复元素、大量数据输入,这些边界情况必须在代码里有明确处理,否则即使主流程逻辑正确,也会被扣分。
另外要注意一个细节:有的编程题会要求你写“测试用例”作为附加题,比如“写一个函数判断是否为回文数,并为它设计测试用例”。这时候千万不要只写代码,一定要额外写几条测试用例,比如负数、0、个位数、末位为0的数、超大数、溢出情况。阅卷人看到这类补充内容,不仅会给你加分,还会认为你具备测试思维,这正好是测试开发岗最看重的素质。
3.3 一道典型编程题从思路到实现
我拿一道在测试开发笔试题里出现频率很高的题目举例:“实现一个函数,输入一个字符串,输出它的最长回文子串”。这道题在不同的卷子里被反复改编,可能是“最长回文子序列”,也可能是“回文子串的个数”,但核心思路是一样的。
先说算法层面,最基础的解法是中心扩展法,时间复杂度O(n^2),空间复杂度O(1)。核心逻辑是:把每个字符以及每两个相邻字符之间的位置当作回文中心,向两边扩展,直到左右字符不相等为止,记录最长回文串。这个思路优点是容易实现,面试时也容易讲清楚。如果你有精力,还可以了解Manacher算法,时间复杂度能优化到O(n),但面试笔试中除非明确要求高效方案,否则不建议冒险写复杂算法,因为正确性比最优性更重要。
伪代码如下:
def longestPalindrome(s): if not s or len(s) < 1: return "" start, end = 0, 0 for i in range(len(s)): len1 = expandAroundCenter(s, i, i) len2 = expandAroundCenter(s, i, i + 1) max_len = max(len1, len2) if max_len > end - start + 1: start = i - (max_len - 1) // 2 end = i + max_len // 2 return s[start:end + 1]写完之后,一定要在注释里补充你的测试用例设计思路:
# 测试用例: # 输入 "babad",输出 "bab" 或 "aba" 均可 # 输入 "cbbd",输出 "bb" # 输入 "",输出 "" # 输入 "a",输出 "a" # 输入 "aaaa",输出 "aaaa" # 输入 "abcde",输出 "a" 或任意一个单字符即可这种“代码加注释,注释讲测试”的写法,是测试开发岗位笔试特有的加分技巧。很多候选人的代码逻辑正确,但完全不考虑边界情况,导致面试官看不到他的测试意识。反过来,只要你在代码里体现了这一类思考,大概率能让阅卷人对你的印象提升一个档次。
4. 测试开发的前沿方向与学习路线
4.1 AI测试开发正在成为新趋势
最近几年,测试开发岗位的要求变化非常明显。早年会写Selenium脚本、能搭建自动化框架就很有竞争力,但现在单纯会这些已经不够了。笔试和面试中越来越多地出现AI相关的概念性题目,比如“你了解AI辅助测试吗”“如何用大模型提升测试效率”“如何对AI模型进行测试”。
这里面有两层含义。第一层是用AI做测试:通过机器学习生成测试用例、通过大模型自动生成接口测试脚本、通过智能遍历算法替代人工探索性测试。第二层是测AI:对模型进行效果评估、鲁棒性测试、偏见检测、数据质量验证。测试开发人员的角色正在从“写脚本的人”变成“测试平台与测试智能体的设计者”。
卷2中虽然没有大量出现大模型相关的题目,但有一道场景题让我印象很深:给定一个推荐系统,让你设计测试方案来验证推荐效果是否符合预期。这道题如果只停留在功能层面(点击是否跳转、页面是否展示),大概率只能拿基础分。更完整的思路是:在离线阶段评估模型的精确率、召回率、AUC等指标;在在线阶段设计A/B实验,设定合理的分流比例和评估周期;在数据层面检查训练集和测试集的分布漂移问题。这已经完全是AI测试的范畴了。建议准备测试开发岗位的同学,至少把“AI测试是什么、能解决什么问题、主流工具有哪些”这几个问题想明白,因为这类题在笔面试中的占比只会越来越高。
4.2 一条可落地的测试开发学习路线
总有人问我:“测试开发到底应该怎么学?我是非科班,来得及吗?”我的建议一直是:不要一上来就铺开学几十个工具,要用项目驱动的方式,一条线走深,再逐步扩展。
第一步,打牢基础。数据结构与算法用LeetCode刷题为主,按标签分类刷,优先搞定数组、字符串、链表、栈、队列、哈希表、二叉树这些基础数据结构;计算机网络、操作系统、数据库看经典书籍和八股文,自己动手写笔记,能画出TCP连接的状态迁移图、Mysql的执行顺序那种程度就够了。
第二步,掌握测试理论。等价类、边界值、因果图、正交实验、场景法等经典测试设计方法必须烂熟于心,然后拿手边任何一个产品练手写用例,写完之后对照线上的真实产品查漏补缺。
第三步,学习自动化测试工具链。接口测试先从Postman入手,再切换到Python的Requests库和Pytest框架;UI自动化从Selenium入手,先能做浏览器自动化,再封装成Page Object模式的框架,最后加上数据驱动与关键字驱动。App端再补充Appium的基础用法。
第四步,理解CI/CD与测试平台。不需要从零搭建Jenkins,但至少要把“开发提交代码→触发构建→部署到测试环境→自动跑接口测试→输出测试报告”这条链路跑通。如果你能在简历中写清楚这条链路,而且能回答出每个环节为什么要加这个步骤,就已经比大部分候选人有优势了。
第五步,关注测试前沿。了解录制回放、流量回放、精准化测试、AI测试助手等新方向。不需要很深入,但至少要知道这些技术解决什么问题,能在笔试场景题中提出相关思路,让面试官看到你对技术趋势的敏感度。
5. 常见问题与避坑经验
5.1 笔试时间分配与答题顺序
关于时间分配,我的经验是:先扫一遍所有题目,把会做的、分值高的题先拿下,再回头看难题。测试开发笔试的选择题虽然多,但每一道分值有限,没必要在一道计算机网络题上纠结三分钟以上。编程题分值最高,一定要留够至少30分钟以上。
我有一次参加笔试,就是因为在一道看似简单的选择题上钻牛角尖,导致最后一道编程题没写完,结果挂掉。后来我总结了规律:选择题如果30秒内没有思路,标记一下直接跳过;简答题控制在10分钟以内,写到踩分点就停笔;测试用例设计题按框架写,不要追求每一条都完美;编程题先写出能正确运行的版本,再去考虑优化。按照这个顺序和节奏,至少能保证卷面上不留大片空白,分数自然也会比“硬磕难题”高得多。
有一个容易忽略的小技巧:笔试平台如果支持本地运行代码,先在本地IDE里把代码调通,再粘贴到答题区。因为在线编辑器没有智能提示,也很容易因为缩进、中文标点之类的低级问题导致编译失败。提前在本地确认运行结果,能极大降低这类非技术性失误。
5.2 那些容易丢分的细节
丢分的地方往往不在知识点本身,而是一些容易被忽略的细节。先说代码规范:很多同学在编程题里只写核心逻辑,不写输入输出处理、不判空、不写注释。测试开发岗位特别看重代码的可读性和健壮性,如果你能补上参数校验、空值处理和边界判断,哪怕代码稍微长一点,也会给面试官留下好印象。
再说SQL题:笔试中写SQL时,一定要注意题目要求的是“每个”还是“整体”。比如“统计每个用户的累计消费金额”和“统计所有用户的累计消费金额”,一个是分组查询,一个是聚合查询,写错就是零分。另外,表名、字段名的大小写题不会和本地MySQL环境兼容,不要过度依赖记忆,尽量用标准的SQL书写方式。
简答题方面,典型的丢分原因是只写结论不写理由。比如问“你觉得自动化测试能完全替代手工测试吗”,如果你的回答只有“不能”,那基本拿不到分。正确的答法应该分三层:第一,不能完全替代;第二,原因是自动化测试关注回归验证和重复执行,但无法替代人的探索性测试和用户体验判断;第三,应该将自动化测试与手工测试结合,按测试场景分配资源。按照“结论+原因+应用场景”的结构去组织答案,简答题基本上就不会失分。
6. 你真正需要提前准备好的几件事
笔试前,你需要做的最后一件事不是继续刷题,而是静下心来反推:如果我是出题人,这道题想筛选出什么样的人?测试开发岗位需要的人,是能“把系统搞坏”的人吗?不是。是需要能在系统上线前预测风险、在上线后快速定位问题、在日常开发中持续提升质量效率的人。
因此,所有笔试题目本质上都在问三件事:你知不知道问题会发生在哪里(测试设计)、你能不能快速定位和解决问题(编程与排查能力)、你能不能把重复的事情自动化并推广给团队使用(自动化与平台化能力)。你的复习时间有限,要优先围绕这三个问题进行查漏补缺,而不是漫无目的地刷题。
最后分享一个我的个人习惯:每次参加完笔试,不管结果如何,我都会花30分钟把整套卷子整理成错题本,把自己丢分的题目按照“知识点缺失、思维不全面、时间不够用、粗心大意”四类归档。这样做三个月,你的薄弱点会变得非常清晰,复习效率会明显提升。希望这套卷子的复盘能给你带来一些实际的帮助,祝你在秋招的路上少踩坑、多拿offer。