说实话,测试开发这个岗位的笔试,历来有点“精神分裂”的味道。你既要像开发岗一样手撕代码、解算法,又要像测试岗一样抠细节、挑毛病、设计用例。2022年小米秋招这份测试开发笔试卷,我前后复盘了两遍,第一遍看的是题,第二遍才琢磨明白出题人真正想筛什么样的人。这篇文章不聊虚的,拿这份卷子当引子,把测试开发笔试背后的考点逻辑、答题思路、时间分配还有我踩过的坑,一次说透。无论你是正在备战校招,还是想转行测试开发,这份拆解都能让你少走不少弯路。
1. 这份试卷到底在考什么:拆解测试开发的岗位画像
先说一个很多人没想明白的问题:为什么测试开发笔试要考算法?很多同学觉得测试岗不就是点点点、写写用例吗?这么想就完全跑偏了。校招阶段的测试开发岗位,培养目标不是“能找bug的人”,而是“有能力写代码去提升测试效率的人”。说白了,招你进来是让你写自动化测试脚本、搭测试平台、做性能压测工具的,这些工作本质上就是软件开发,只不过业务对象是“测试场景”而已。
所以你在卷子里看到的算法题、数据结构题,不是刁难人,是检验你“能不能独立撸代码”的底线。以2022年小米秋招测试开发卷2为例,它的整体结构基本可以归纳成四块:算法编程题、测试用例设计题、计算机基础选择题/SQL题、测试理论题。这四块分别对应了测试开发日常工作中的四种能力:编码实现能力、测试设计能力、技术功底储备、对测试流程和方法的理解。
我自己把这份卷子的考察逻辑总结成了一张能力映射表,你对照着看就明白为什么题目长那样了:
| 试卷模块 | 考察能力 | 对应日常工作场景 |
|---|---|---|
| 算法编程题 | 编码功底、逻辑思维 | 写自动化脚本、数据处理、工具开发 |
| 测试用例设计题 | 测试思维、边界意识 | 功能测试设计、需求评审 |
| 计算机基础(网络/OS/DB) | 技术知识储备 | 排查线上问题、接口测试、性能分析 |
| 测试理论/自动化框架 | 岗位专业度 | 制定测试方案、搭建测试体系 |
这个底层的逻辑你掌握了,就不会被具体的题目牵着鼻子走。所有题目都是表象,背后考察的是“你具不具备一个合格测试开发工程师的底层素养”。明白这一点,接下来拆题目才有意义。
1.1 为什么这套卷子把算法放在前半场
从我复盘的这套试卷来看,算法题的出场顺序在中间偏前,而且分值占比不低。这其实是有讲究的。出题人很清楚,测试开发岗位的简历池里,有计算机科班的,也有非科班转行的,算法题就是一道“硬过滤器”——先把代码能力不达标的筛掉,后面的测试理论题再看不迟。
而且测试开发考的算法题,普遍有个特点:难度不会超过LeetCode中等偏下,但非常看重边界条件的处理。比如数组越界、空指针、重复元素、大数溢出这些情况,都是高频考察点。这跟纯开发岗位喜欢考复杂动态规划、图论算法不一样,测试开发的算法题更偏向“工程实用性”和“细节严谨性”,因为这恰好是测试工程师的职业习惯——代码能跑通不算完,各种异常情况都想明白才算完。
这就提醒了所有准备这类笔试的同学:刷题阶段不要死磕难题怪题,把LeetCode的热门题、高频题刷熟,尤其是数组、字符串、哈希表、链表、二叉树这几类,性价比是最高的。
1.2 测试用例设计题:拉开差距的核心题型
如果说算法题是门槛,那测试用例设计题就是分水岭。很多开发能力不错的同学,考完对完算法答案觉得自己稳了,结果挂在测试用例设计题上,原因很简单:用开发思维去答测试题,整个思路就不对。
这类题目通常给一个具体功能,比如“登录模块”“购物车结算”“文件上传”,让你设计测试用例。别小看这种题,它能非常真实地反映你有没有测试思维。及格水平的回答是“列出正常登录、密码错误、用户名不存在”这种流水账;高水平的回答是“用等价类划分、边界值分析、场景法把功能拆解成一个个维度,再对每个维度覆盖正常、异常、边界三类情况”。
以登录功能为例,一个完整的测试用例设计思路应该是这样的:
- 功能维度:正常登录、记住密码、忘记密码、验证码、第三方授权登录
- 输入维度:用户名/密码长度边界、特殊字符、大小写敏感、空格处理、SQL注入字符
- 安全维度:暴力破解锁定、会话超时、密码传输加密、篡改请求
- 体验维度:错误提示准确性、按钮防重复提交、弱网/断网表现
你看看,同样是“登录功能测试”,流水账只能写七八条,系统化思考能写出三四十条,而且每一条都有依据、能落地。面试官和批卷人看一眼就知道你是背过题的还是真懂测试的。
2. 算法与数据结构题:刷题方向比刷题数量更重要
先把这份卷子里算法部分的大致特点摸清楚。2022年小米秋招测试开发卷2的算法题,整体风格是“经典题重出江湖”,基本没有偏题怪题,但是每个题都埋了一些小坑。这意味着什么?意味着你不需要去追求难题的AC率,而是要把基础题刷到“闭着眼睛都能写对边界条件”的程度。
我梳理了这几年多家大厂测试开发笔试题,发现一个规律:出现频率最高的算法考点就那几类。你可以按照这个优先级去做针对性训练:
- 哈希表:两数之和、字母异位词分组、最长连续序列
- 双指针:有序数组去重、三数之和、接雨水(变体)
- 链表操作:反转链表、合并有序链表、链表环检测
- 二叉树遍历:层序遍历、最近公共祖先、路径总和
- 动态规划入门:爬楼梯、打家劫舍、最长递增子序列
- 字符串处理:最长回文子串、字符串相加、正则匹配(简单版)
为什么是这几类?因为测试开发日常工作中,写自动化框架的时候,经常需要处理数据结构的转换和遍历;做接口测试时,经常要处理JSON解析、数据比对;做测试平台开发时,要写一些列表分页、树形展示的逻辑。这些场景的基础就是上面这些算法题。
2.1 典型题目拆解:两数之和的三种解法与测试视角
随便拿最经典的“两数之和”举例,这种题在测试开发笔试中出现频率极高。题干很简单:给定一个整数数组和一个目标值,找出数组中和为目标值的两个数的下标。普通同学能写出暴力解法,聪明一点的同学会写哈希表解法,但测试开发候选人还需要多想一步:如果数组中有重复元素怎么办?如果找不到答案怎么办?如果同一个元素不能重复使用怎么处理?
用代码写一下哈希表解法,顺便说说边界条件的考虑:
def two_sum(nums, target): # 哈希表记录“数值 -> 下标” hashtable = {} for i, num in enumerate(nums): complement = target - num # 先查补数是否已在表中,避免同一个下标被重复使用 if complement in hashtable: return [hashtable[complement], i] hashtable[num] = i # 这里其实是题目隐藏条件:保证有且仅有一个答案 return []这个解法的时间复杂度是O(n),空间复杂度是O(n)。但站在测试开发的角度看,这道题其实还有另一种问法:如果让你测试这个函数,你会设计哪些用例?这就延伸到测试思维了——空数组、单个元素、没有答案的数组、包含负数、包含重复元素、target是0,这些情况都要覆盖到。笔试有时候还会让你“在题目基础上增加对异常数据的处理”,其实考的就是你有没有测试意识。
2.2 刷题的正确姿势:先懂套路,再谈题量
很多同学准备笔试,上来就一天刷十道题,刷完就忘。我建议换一种方式:按“数据结构→常见套路→边界条件”三层来刷,题量反而可以降下来。
第一层,数据结构。看到题目先问自己:这题考察的是数组、链表、树、图,还是哈希表?每种数据结构的典型操作是什么?比如看到“查找”相关的题,首选哈希表;看到“有序数组”相关的题,想想双指针能不能压缩时间;看到“树”相关的题,递归和迭代的写法都要能写。
第二层,常见套路。比如“滑动窗口”解决子串问题、“前缀和”解决区间和问题、“单调栈”解决下一个更大元素问题。这些套路不是靠背,而是靠同一类题反复练出肌肉记忆。
第三层,边界条件。每次AC之后,停下来想一分钟:如果输入是空数组会怎样?如果所有元素都一样会怎样?如果数字特别大,运算会溢出吗?养成这个习惯之后,你写出来的代码会比一般人稳很多,这恰恰是测试开发岗位最需要的素质。
3. 测试用例设计题:如何用工程化思维秒杀“手写测试点”
说实话,我做这份卷子的时候,最有感触的就是测试用例设计题。前面提到过,这类题是区分度最大的,因为它是唯一一个直接考察“测试思维”的板块。但我发现很多人不是不会设计用例,而是不会“有结构地”设计用例,导致答案写得像流水账,自己看着都乱。
这里我直接分享一套能应对90%测试用例设计题的答题框架,你拿这套框架去练习,至少能把思路理清楚:
第一步:拆功能。把题目给的功能拆成若干个子功能或子模块。比如“购物车结算”可以拆成:添加商品、修改数量、删除商品、选择优惠券、计算金额、提交订单、支付跳转。
第二步:定维度。对每个子功能,确定要测试的维度。一般是功能逻辑、输入校验、异常处理、交互体验、兼容性、安全性,这几板斧。
第三步:分场景。每个维度下,把场景分成正常流、异常流、边界流三类。正常流覆盖主流程,异常流覆盖出错处理,边界流覆盖临界值。
第四步:补细节。在关键场景里补充具体测试数据和预期结果,让答案看起来可执行性更强。
3.1 用一个例子走通框架:文件上传功能的测试点
我拿一个笔试高频题——“文件上传功能”来演示这套框架。题目通常会给一个简单的描述:某系统支持用户上传图片,格式要求jpg/png,大小不超过5MB。请设计测试用例。
用上面的框架来走一遍:
功能拆解维度可以这样列:文件选择、格式校验、大小校验、上传进度、上传结果、重复上传、取消上传。
每个维度下的测试点:
- 文件选择:选择jpg文件、png文件、gif文件、txt文件、无扩展名文件、超长文件名文件
- 格式校验:非jpg/png格式应提示错误;修改后缀名的假图片应能识别;空文件应提示错误
- 大小校验:刚好5MB应允许;5MB以上应拒绝;0KB文件应提示错误;超大文件(比如2GB)不能卡死页面
- 上传进度:正常网络下进度条平滑推进;弱网环境下显示重试;断网后提示上传失败并能恢复
- 上传结果:上传成功后显示缩略图;上传失败后保留已填数据;重复点击上传按钮不能产生多条记录
- 安全维度:上传包含恶意脚本的文件应被拦截;文件名包含特殊字符应过滤;文件路径信息不能泄露到前端
你对比一下,这种回答和“选择图片-点上传-看到提示”的流水账完全不是一个级别的。更重要的是,这套框架一旦熟练掌握,你在考场上根本不需要现场硬想,只需要按维度去填充内容就可以了,效率会高很多。
3.2 笔试中测试用例设计题的两个常见坑
第一个坑是只写正常路径。我见过太多答案是“输入正确的手机号,点击登录,登录成功”——这种用例写了等于没写,因为没有测试价值。测试用例设计的核心价值在于发现缺陷,而缺陷往往藏在异常和边界里面。所以答题时一定要刻意提醒自己:正常流写一条就够了,把笔墨留给异常流和边界流。
第二个坑是忽略环境依赖。比如“登录功能”的用例,很多人忘了考虑网络异常、服务器异常、跨浏览器兼容。这些虽然属于非功能性测试,但恰恰是测试工程师专业度的体现。笔试题不会直接让你写性能测试方案,但如果你在用例里提到了弱网、并发、兼容性,批卷人会觉得你想问题很全面。
4. 计算机基础与测试理论:送分题背后的隐形门槛
算法题和测试用例设计题是重头戏,但决定你能不能过线的,往往是那些看似零碎的计算机基础题和测试理论题。为什么这么说?因为这类题单题分不高,但量大、覆盖面广,错得多了累积起来也很致命。而且这些题往往是“会就是会,不会就是不会”,没有太多临场发挥的空间,纯靠平时的积累。
这份卷子里计算机基础部分的高频考点,我归纳成了一张清单,基本覆盖了多数互联网公司测试开发笔试的考察范围:
| 知识点分类 | 高频考点 | 备考建议 |
|---|---|---|
| 数据结构 | 栈和队列的区别、二叉树遍历方式、哈希冲突解决办法 | 核心概念记忆+简单手写 |
| 操作系统 | 进程与线程区别、死锁四个条件、常见调度算法 | 理解记忆,别死背 |
| 计算机网络 | TCP三次握手/四次挥手、HTTP与HTTPS区别、状态码含义 | 重点掌握,面试也必问 |
| 数据库 | SQL基本增删改查、索引原理、事务ACID特性 | 多练习写SQL语句 |
| Linux | 常用命令、文件权限、日志查看 | 平时多用自然就会 |
4.1 计算机网络:测试开发为什么要懂TCP和HTTP
很多同学不理解,测试开发又不做网络协议开发,为什么要考这么细?我举个实际例子:你做接口测试的时候,发现请求总是超时,怎么排查?如果你懂TCP三次握手,会想到先验证端口通不通;如果你懂HTTP状态码,看到502能立刻反应是网关问题而不是服务端代码问题。这些排查能力不是靠点点点练出来的,是建立在扎实的计算机网络基础上的。
所以备考计算机网络时,我建议围绕“链路层→网络层→传输层→应用层”四层模型去理解,重点掌握传输层和应用层。TCP的三次握手和四次挥手必须能画图、能解释每个状态的含义;HTTP的常见状态码(200、301、302、401、403、404、500、502、503)要能脱口而出;HTTP和HTTPS的区别、GET和POST的区别这两个经典问题最好能形成自己的口头禅式表达。
4.2 数据库SQL题:测试开发笔试中的“性价比之王”
如果让我选一个最值得花时间准备的科目,我选数据库SQL。原因很简单:SQL题在笔试中经常出现,而且范围非常固定——就是单表查询、多表连接、分组聚合、子查询、去重排序这几类。花三天时间集中练熟这些操作,就能稳稳拿住这部分的分数,性价比非常高。
举一个典型的SQL题例子:给定一张员工表(id, name, department, salary),求每个部门薪资最高的员工姓名。这个题考察的就是“分组后取最大值”这个经典场景,常见的错误是直接写GROUP BY department然后SELECT *,这样查出来的其他字段并不是最大值对应的记录。正确写法要用子查询或者窗口函数:
SELECT name, department, salary FROM employee WHERE (department, salary) IN ( SELECT department, MAX(salary) FROM employee GROUP BY department );这类题笔试出现频率很高,我建议把排名类、分组TopN类、累计求和类这几个SQL场景练熟,考场上思路会很顺畅。
4.3 测试理论:不是考背诵,是考理解
测试理论部分,比如软件测试流程、黑盒白盒测试区别、测试用例方法、缺陷生命周期、自动化测试框架等,这类题目看似送分,但很多同学答得并不好。原因在于背概念容易,用概念解决具体问题难。
举一个典型的题目:给一个计算器功能,要求用因果图法设计测试用例。如果只是背了“因果图法是一种黑盒测试方法”这句话,遇到这种题就歇菜了。真正理解因果图法的人会知道,这题考察的是一个输入变量之间的组合依赖关系,你需要先列出输入条件和输出结果,再找出它们之间的互斥、独立、依赖关系,最后把组合情况覆盖一遍。
所以备考测试理论的时候,不要光看书,最好配合实际的练习。比如每种测试用例设计方法(等价类、边界值、判定表、因果图、场景法),都找一两个小功能去练手。练过一遍之后,考试遇到这类题会非常有底气。
5. 实战推演:一套测试开发笔试的标准答题节奏
说完了具体知识点,再聊聊一个很多人忽略的问题:考试节奏。校招笔试的时间一般是90到120分钟,题量大概在30到40道选择题加2到3道大题。如果不控制节奏,很容易出现前面选择题纠结太久,后面大题没时间写的窘境。
以2022年小米秋招测试开发卷2的常见题量估算,我建议的时间分配策略是这样的:
| 题目类型 | 建议用时 | 策略 |
|---|---|---|
| 选择题(基础+理论) | 20-25分钟 | 先做,会的秒选,不会的标记跳过 |
| 编程题 | 30-40分钟 | 写完一题AC一题,别恋战 |
| SQL题 | 10-15分钟 | 先写逻辑再调语法 |
| 测试用例设计题 | 20-30分钟 | 用框架答题,保证结构完整 |
| 检查 | 5-10分钟 | 重点检查编程题的边界条件 |
5.1 为什么建议先做选择题而不是直接冲大题
很多同学拿到卷子习惯先看大题,觉得大题分值高要先拿下。但根据我自己的经验和多人验证,这种做法在测试开发笔试中并不划算。原因有两点:第一,选择题里有不少基础题是真的送分,先稳稳拿下这部分能建立信心;第二,大题(尤其是测试用例设计题)需要消耗大量脑力,如果前面选择题还悬着,思考起来会很焦虑。
我的习惯是拿到卷子先花两三分钟通读一遍,了解大致的题量和难度分布,从感觉最轻松的选择题开始做起。做题过程中遇到不确定的选择题,先凭第一印象选上,然后标记出来,不要在单题上死磕。等所有题做完,再回来看标记的那些题。
5.2 编程题怎么写才能拿高分:结构化代码与注释技巧
编程题这部分,除了AC之外,还有几个能提升阅卷好感度的细节。第一,代码结构清晰,变量命名有意义,不要用a、b、c这种毫无信息的命名。第二,关键步骤写简短注释,让阅卷人一眼能看出你的思路。第三,提前处理边界条件,比如数组为空、参数为None等,写出来比不写强很多。
我举一个例子,假设考了一道“反转字符串中的单词顺序”的编程题,一个加注释、带边界检查的写法大概是这样的:
def reverse_words(s: str) -> str: # 去掉首尾空格,按空格切分 tokens = s.strip().split() # 特殊情况:空字符串直接返回 if not tokens: return "" # 反转单词列表,用单个空格拼接 return " ".join(tokens[::-1])这段代码并不复杂,但它展示了一个很好的习惯:先处理特殊情况,再处理核心逻辑,代码量短且意图清晰。这类代码在阅卷人眼里,会比一个“能跑但写得很乱”的长代码印象好很多。
5.3 测试用例设计题的现场答题模板
最后再给一套测试用例设计题的具体答题模板。不管题目问的是“登录功能”还是“订单退款”,你都可以按照下面的格式去组织答案:
功能模块:xxx
测试维度1:功能测试
- 正常场景:描述具体操作和预期结果
- 异常场景:描述异常操作和预期结果
- 边界场景:描述边界值和预期结果
测试维度2:兼容性测试
- 不同浏览器/系统/设备上的表现
测试维度3:安全性测试
- 输入校验、权限控制、数据加密等
测试维度4:性能测试(如适用)
- 并发场景、响应时间、资源占用等
这套模板不是万能药,但它能保证你的答案有结构、有层次、有覆盖面。在笔试这种高压场景下,能做到“稳定输出”比“灵光一现”重要得多。
6. 备考避坑清单:这些雷我替你踩过了
最后聊点掏心窝子的经验。我在准备测试开发笔试的过程中,包括后来帮学弟学妹们复盘,总结出了几个高频翻车点。这些东西在任何公开的备考攻略里都很难看到,但非常实用。
第一个雷:刷题只刷开发岗的题目。很多同学准备算法题,直接按照开发岗的标准去刷难题怪题,结果大量时间花在动态规划优化、图算法剪枝上,考场上发现考的都是基础题,白白浪费了精力。测试开发的算法题一定要按“基础+边界+工程化”的方向去准备,刷难题的收益很低。
第二个雷:测试用例设计题只写测试点,不写预期结果。笔试答题时,部分同学只顾着列测试点,比如“输入错误的密码”,但没写“应该提示密码错误,且不告知用户具体哪一项错误,防止暴力破解”。这样回答的问题在于,阅卷人看不到你的判断标准,无法确认你是否真正理解这个测试点为什么重要。记住,好的测试用例一定是“操作步骤+预期结果”成对出现的。
第三个雷:忽略Linux和Shell命令。翻看这份卷子的选择题部分,Linux内容的占比其实不低。比如查看进程的命令、查看日志的命令、修改文件权限的命令,这些题不难,但如果你平时真的没碰过Linux,就只能靠蒙了。备考阶段装个虚拟机或者用云服务器,把常用命令过一遍,花不了多少时间,考场上却能稳定拿分。
第四个雷:考试时没有通读试卷。我那年考完出来听到有人抱怨“最后一题竟然是测试设计题,我都没看到”,这不是个例。测试开发笔试的题量大、类型杂,开头不花两三分钟通读一遍,很容易漏题。
第五个雷:在编程题上死磕一个用例。编程题如果提交一次发现用例没过,很多人会反复调试同一段代码,卡了半小时不放手。我的建议是:如果15分钟内还没AC,立即放弃这题,去做其他题,最后有时间再回来。笔试的通过线看的不是单题满分,而是整体分数,大局观很重要。
7. 写在最后的个人体会
把这些内容整理下来,回头看整个测试开发笔试的备考,我最深的体会是:这是一场“考思维多过考知识”的考试。知识部分,也就是计算机网络、操作系统、数据库这些,花时间背一背,大家差距不会太大;真正拉开差距的,是测试用例设计题的答题思路和算法题的边界处理习惯。而这两个东西恰恰不是考前突击能解决的,需要平时做项目、写脚本、复盘问题时有意识地去积累。
也不要因为某一场笔试没发挥好就否定自己。我记得自己当年做这类测试开发卷的时候,算法题AC了前面两道,最后一道没写完,测试用例设计题倒是写得挺顺。后来复盘发现,笔试考场上那点时间根本不允许你求全,稳住自己擅长的部分、拿足该拿的分数,就已经能超过大多数人了。准备测试开发这条路,没有太多玄学,把基础打扎实、把方法练熟、把该避的坑避开,剩下的就是保持好心态,正常发挥。