“测试开发”这四个字,在校招简历上出现频率越来越高,但真正明白这个岗位在笔试阶段考察什么的人,其实不多。我先说个真实感受:很多人以为测试开发就是“比开发简单一点的岗位”,结果一看笔试题就傻眼——算法题照样出,代码题占比不低,还夹杂着大量需要结合业务场景来答的测试设计题。滴滴出行2018校园招聘网申笔试-测试开发工程师(第一批),就是这类笔试里很有代表性的一个。把这份笔试卷拆明白,基本等于把互联网公司校招测试开发岗的备考逻辑过了一遍。
这篇内容适合谁?两类人。一类是正在准备校招测试开发岗位的同学,尤其是瞄准滴滴、美团、字节这类业务复杂度高的互联网公司;另一类是已经在做功能测试、想转岗测试开发,想系统补笔试基础的从业者。我会从题型逻辑、算法题应对、测试用例设计、计算机网络与数据库考点、模拟实战、考前冲刺六个维度展开,全部是能直接落地的经验。
1. 校招测试开发笔试到底在考什么:先看题型的底层逻辑
1.1 测试开发不是“点点点”:笔试要求的能力画像
我见过太多简历上写着“熟悉软件测试流程”的同学,一到笔试就暴露了真实水平。测试开发这个岗位,本质上是“会用代码做测试的人”,不是“会点页面的人”。所以笔试的题型设计,几乎都围绕着一个核心原则:考察你在代码能力和测试思维之间的交叉地带,能够处理多深的问题。
具体拆开来看,能力画像大致分五块:编程基础(语言语法、数据结构、算法)、测试理论(用例设计方法、缺陷生命周期、测试流程)、计算机基础(网络、数据库、操作系统、Linux)、业务理解能力(能不能把一个实际产品功能拆成可验证的测试点)、逻辑表达(思路是否清晰,能不能用文字让别人看懂你的方案)。
这五块在校招笔试里的比重,不同公司差异很大,但滴滴这种体量的公司,算法题和测试设计题基本是五五开,剩下的零散考点分布在网络、数据库和Linux上。所以,只刷LeetCode不够,只背测试理论也不够,两边都得硬。
1.2 从滴滴的业务场景反推笔试重点
我每次准备面试前都会先看公司的业务形态,因为笔试题目一定会往业务上靠。滴滴的核心业务是什么?出行。出行牵扯到哪些链路?定位、地图、路线规划、订单分配、费用计算、支付、评价,加上司乘两端App、小程序、Web管理后台,随便拎出来一个环节都是复杂的测试场景。
这就决定了它的笔试不会只考“登录怎么测”这种通用题目,而是会偏重几个方向:状态机流转(订单状态从“待接单”到“已支付”的每一步变化)、金额计算与并发(费用预估、优惠券叠加、并发下单)、LBS与地图相关逻辑(定位偏差、路线规划结果校验)、异常场景(乘客取消、司机断网、支付超时)。这跟纯电商公司考“购物车和库存”是完全不同的出题风格。
所以你在准备滴滴这类测试开发笔试的时候,要刻意训练一个能力:拿到任何题目,先想“这个功能在真实业务里会怎么跑一遍完整流程”,再从流程里找测试点。这个思维习惯比多背二十个测试理论名词管用得多。
2. 算法与编程题:笔试的重头戏,如何高效拿分
2.1 常考的算法题类型与难度定位
先给个定心丸:校招测试开发岗的算法题,普遍比开发岗难度低半档到一档,大概在LeetCode中等题以下的水平。但“低一档”不代表你可以裸考,经典题型必须熟练掌握。
滴滴这类公司常考的算法题型,我按出现频率排个序:
- 字符串与数组的处理:找第一个不重复字符、字符串反转、数组去重、合并两个有序数组、旋转数组找目标值。这些题不考奇技淫巧,考的是你把基础API用对、把循环边界写清楚的能力。
- 哈希表与计数问题:两数之和、判断字符异位词、数组中出现次数超过一半的数字。哈希表的空间换时间思路,在测试开发笔试里是高频考察点。
- 链表操作:反转链表、找链表中间节点、判断链表是否有环、两个链表是否相交。链表题考验的是指针操作的严谨性,跟测试里的“边界条件”思维天然契合。
- 排序与查找的变体:手写快排/归并、二分查找找左右边界、TopK问题。
- 简单动态规划:爬楼梯、最大子序和、零钱兑换(最基础的一档)。动态规划在校招测试开发笔试里不会考太深,但“状态转移方程”这种思路会间接融入测试路径设计题。
- 二叉树的遍历:前中后序、层序、最大深度。树的基础操作偶尔会出现。
难度定位上,笔试前把LeetCode的“Top 100 高频题”里前50道刷透,再把这六类题型各挑两三道练熟,应试基本够用。不需要去啃难题压轴题,性价比不高。
2.2 代码题作答的几个实操技巧
代码题不是“写出了就是满分”,线上笔试环境有很多隐性扣分点,我踩过、也见过别人踩,给你提个醒。
第一,输入输出必须提前熟悉。很多同学平时在IDE里写惯了函数,一上笔试系统要求自己处理标准输入输出就慌了。牛客网和赛码网是两个最常见的校招笔试平台,题目给的输入可能是多组测试用例、可能一行多个整数、可能字符串里有空格。我的习惯是每次笔试前,先把这两个平台的输入输出模板背下来,用Python的话就是sys.stdin.read()配合split,用C++就是cin >>和getline的边界处理。省得考场上花十分钟试错。
第二,边界条件比算法本身更值分。判题系统判的是“对不对”,不是“优不优”。一个干净利落的快排方案,如果没处理空数组和单元素数组,照样挂;一个看起来很笨的暴力解法,只要把所有边界都考虑到了,能拿的分一分不少。我的建议是:代码写完别急着交,自己在注释里列出三个边界用例——空输入、单元素、极端大数,逐个在心里跑一遍。
第三,不会AC也要写注释和关键步骤。校招笔试的判卷虽然以线上自动判题为主,但有些公司的系统会允许人工审阅代码,尤其是主观题部分。哪怕你的代码有问题,也要用注释把“思路”写出来。比如:“这里用双指针是因为数组已排序,目标是将时间复杂度降到O(n)”。让阅卷人看到你有分析能力,这比交一个空白编辑器强太多。
注意:笔试时如果发现某道题卡了二十分钟,果断跳过。算法题分值通常不是均匀分布的,后面可能还有一道你秒会的字符串题。先拿稳定分,再回来啃硬骨头。
3. 测试用例设计题:面试官想看的不是“多”,而是“全”
3.1 等价类与边界值:两道题吃透基础方法
测试用例设计题在校招笔试里几乎必出,而且经常以“请设计XX功能的测试用例”这种开放式问题出现。很多人遇到这类题就疯狂罗列“输入什么、输出什么”,写了几十条,但分数依然不高。原因很简单:用例设计考的不是数量,是方法论。
我最推荐先把两个基础方法掌握到条件反射级别:等价类划分和边界值分析。这两个方法不是面试官随口说的理论名词,而是实战中最高频、最实用的用例设计工具。
拿一个最简单的例子说清楚,比如“登录页面的用户名输入框,要求6~20位字符”:
用等价类划分,先把输入域分成有效等价类和无效等价类。有效等价类就是6到20位的合法用户名;无效等价类有三类:少于6位、多于20位、包含非法字符(比如中文、空格、特殊符号)。你只需要在每一类里选一个代表值来测,不用每个字符长度都测一遍。
然后上边界值分析:既然边界是6和20,那就要测5、6、7、19、20、21这六个值。为什么6和20要测两遍?因为边界值里“刚好等于边界”和“刚好越过边界”是两个不同场景,一个应该通过,一个应该被拦截。这个思路把一条用例设计的颗粒度瞬间拉高,阅卷人一眼就能看出你真的干过测试。
3.2 场景法:把业务链路变成测试用例
等价类和边界值解决的是“单个输入框怎么测”,但真实业务往往是多个模块串在一起的,这时候就要用场景法。场景法的核心是:把用户从开始到结束的完整操作路径拆成一个个步骤,再针对每个步骤设计正常流和异常流的用例。
以滴滴为例,“用户从发单到上车”的主流程大概是:打开App → 定位 → 输入目的地 → 确认呼叫 → 司机接单 → 司机到达上车点 → 乘客上车 → 行程开始 → 到达目的地 → 支付。这就是一条主场景。主场景跑通了,再逐一拆分支场景:乘客中途修改目的地、司机取消订单、乘客取消订单、司机找不到乘客、行程中网络中断、支付时余额不足。
这种思维在笔试里答题时特别有用,因为你能把一个模糊的“请测试叫车功能”变成清晰的流程拆解。我当时准备时的一个技巧是:画不出流程图没关系,只要在答题里按“步骤-操作-预期结果”的格式写成表格,面试官就会认为你有场景思维。关键是让每一步都形成“操作了什么,系统应该怎么反应”的闭环。
3.3 一个完整的用例设计答卷模板
笔试时间有限,用例设计题不需要完整地写几十条用例,但你必须让阅卷人看到你的结构。我建议按下面这个模板答题,既省时间又容易拿分:
用例编号规则:TC_功能模块_序号,比如TC_Login_001。这个细节非常加分,证明你有团队协作意识,知道用例是要进用例库的。
前置条件:一条用例的执行前提。举个例:“用户已注册账号且网络正常。”没有前置条件的用例,别人没法复现。
测试步骤:用1、2、3列出操作动作,动词开头。比如“1.打开App登录页;2.输入已注册手机号;3.输入正确密码;4.点击登录按钮。”
预期结果:具体到可验证的观察点。不要写“登录成功”这种笼统的话,要写“页面跳转到首页,右上角显示用户头像和手机号;数据库用户表记录本次登录时间。”预期结果越可验证,说明你的测试功底越扎实。
优先级:标明P0/P1/P2,P0是核心流程,不通过就不能上线。这个维度展示的是你的风险判断能力。
用这个模板组织答案,哪怕你只写了8条用例,也比别人罗列30条没结构、没优先级的用例得分高。
4. 计算机网络与数据库:看似简单却最容易被扣分的部分
4.1 网络协议的必背知识点
计算机网络在测试开发笔试里占的比重不算大,但几乎每次都会出现一两道,而且一旦考到就是送分题,不去拿就显得可惜。最常考的知识点我梳理成一个清单:
- TCP三次握手和四次挥手:能画出状态图,能说清为什么要三次、不能两次。四次挥手里TIME_WAIT的意义和时长(2MSL)也常考。
- HTTP状态码:2xx(200、201、204)、3xx(301、302、304)、4xx(400、401、403、404、429)、5xx(500、502、503、504)。不要只背数字,每个状态码要能对应一个测试场景。比如弱网环境下请求超时,前端看到的是504还是自己定义的超时提示,这就是一个测试点。
- GET和POST的区别:从语义上、请求参数位置、幂等性、缓存机制几个角度对比。这个知识点几乎年年考,别只答“GET有长度限制”这种模糊表述。
- HTTPS的握手过程:对称加密和非对称加密是怎么配合的、证书的作用是什么。
- DNS解析过程:从输入URL到拿到IP地址期间发生了什么。这个考的是完整链路思维,跟测试里的全链路分析很像。
这些知识点不用背到八股文的程度,但要做到“看到术语能讲清楚它解决什么问题”。比如TCP握手是为了让双方确认收发能力都正常,这个“为什么”理解了,比死记状态名有用得多。
4.2 数据库查询与数据校验
数据库的考点分为两类,一类是写SQL,一类是测试数据校验意识。SQL题通常是给两张表,让你写出查询结果。常考的就是GROUP BY +聚合函数、JOIN(INNER、LEFT)、子查询、DISTINCT去重、ORDER BY排序、LIMIT分页。没有特别偏的题,只要你能熟练写“查询每个部门的平均工资,按平均工资降序排序”这种程度就够。
数据校验意识是测试开发笔试的隐藏考点。很多功能测试的同学容易忽略这点,但笔试和面试官很看重。举例:测试一个“叫车后发送短信通知”的功能,除了验证用户手机上有没有收到短信内容,还要验证数据库里有没有写入一条短信发送记录,发送状态是成功还是失败,失败后的重试机制是什么。这就是“数据落库校验”的思路,体现的是你从黑盒看到了白盒。
我的经验是:SQL语法不会就练,但“测完功能要查库”的意识没建立的话,笔试里很难临时补上。从现在起,你每测一个功能就把“数据库哪里会变化”这个问题问一遍,时间长了就内化了。
5. 真题风格的实战演练:模拟一套“第一批”笔试卷
5.1 模拟题1:找出字符串中第一个不重复字符
题目描述:给定一个只包含小写字母的字符串,找出其中第一个不重复的字符,并返回它的下标。如果不存在,返回-1。例如s="ddtravel",第一个不重复字符是"t",返回下标5。
这道题是哈希表计数类的典型代表。思路是遍历两次:第一次统计每个字符出现的次数,第二次找第一个出现次数为1的字符。这里“第一个”指的是下标最小,所以不能只用哈希表存次数,要保留原始顺序。
Python参考解法:
def first_unique_char(s: str) -> int: count = {} for ch in s: count[ch] = count.get(ch, 0) + 1 for i, ch in enumerate(s): if count[ch] == 1: return i return -1时间复杂度O(n),空间复杂度O(1)(因为字符集固定为26个小写字母)。笔试里写到这里,再补一个边界说明:“当字符串为空时,直接返回-1”,这道题就稳了。
为什么选这道题当模拟?因为它把“哈希表”“字符串”“边界条件”三个测试开发笔试高频考点全占了。类似的题目还有“字符串中第一个只出现一次的字符”“数组中出现次数超过一半的数字”,建议配套练掉。
5.2 模拟题2:设计一个“滴滴App登录页”的测试方案
题目描述:请设计滴滴出行App登录页面的测试用例,包含手机号、验证码、登录按钮三个元素。要求覆盖正常流程和异常流程。
这道题我在笔试经验分享里反复提到,因为它完美考察了测试开发的核心素养。我从三层来拆解。
第一层是UI层面:检查页面布局是否正常,手机号输入框和验证码输入框的间距、字号、颜色在主流机型上是否一致;键盘弹起会不会遮挡输入框;iOS和Android的placeholder(提示文字)显示是否相同。这些细节说明你有适配意识。
第二层是功能逻辑层面,这里要分层设计:
- 手机号输入框:不输入直接点登录、输入1位数、输入10位、输入11位但非手机号、输入11位有效手机号、输入带+86前缀的号码、输入超长号码。
- 验证码输入框:不输入、输入3位、输入4位正确、输入4位错误、输入已过期的验证码、重复点击“获取验证码”、60秒倒计时内再次获取。
- 登录按钮:正常流程登录成功后跳转到首页;弱网环境下点击登录,出现了loading动画;重复点击登录按钮,是否会出现重复提交。
第三层是安全和异常层面:验证码接口被频繁调用时有没有限制(防刷机制);手机号输入国际字符会不会报错;登录接口返回超时时,前端有没有toast提示;杀掉App进程重新进入,登录状态是否保持。
这样答下来,阅卷人能看到你的思路是有层次的,不是想到哪写到哪。这种层次感,平时练题就要刻意去建立。
5.3 模拟题3:判断两个单链表是否相交
题目描述:给定两个无环单链表,判断它们是否相交。这里的“相交”指的是两个链表存在同一个节点,而不是值相等。
这道题属于链表题里的经典变体,需要一点逻辑推导。核心思路:如果两个链表相交,那么从相交节点开始到末尾的节点是完全重合的,所以它们末尾节点一定相同。可以分别遍历两个链表,记录各自长度,然后让长链表的指针先走差值步数,再同步遍历比较节点是否相等。
Python参考解法:
class ListNode: def __init__(self, val=0, next=None): self.val = val self.next = next def get_intersection_node(headA: ListNode, headB: ListNode) -> ListNode | None: lenA, lenB = 0, 0 pA, pB = headA, headB while pA: lenA += 1 pA = pA.next while pB: lenB += 1 pB = pB.next pA, pB = headA, headB if lenA > lenB: for _ in range(lenA - lenB): pA = pA.next else: for _ in range(lenB - lenA): pB = pB.next while pA and pB: if pA is pB: return pA pA = pA.next pB = pB.next return None注意这里比较的是is而不是==,因为链表相交是节点引用相同。这道题考察的就是你对“引用”这个概念的理解,测试开发日常验证数据时,也有非常类似的对象一致性判断场景。
6. 笔试前的冲刺清单与踩坑复盘
6.1 最后四周冲刺计划
笔试准备最忌讳“什么都想看,什么都没看透”。我建议把冲刺期按周拆开,分配方式可以参考这个节奏。
第一周:集中刷算法基础。目标是把数组、字符串、哈希表、链表四类题型刷到条件反射。每天3道题,不用贪多,但每道题都按“独立写出来、分析复杂度、说清思路”三个步骤完成,比一天刷十道只过眼瘾强得多。
第二周:集中补测试理论和方法论。等价类、边界值、场景法、正交实验法、错误推测法,每种方法找一个业务案例做练手,把用例设计模板跑熟。同时把网络协议、数据库SQL、Linux常用命令的清单过一遍。
第三周:开始做整套模拟卷。找牛客网或赛码网上的校招真题,按真实笔试的时间限制和输入输出方式来练。这一周是最容易发现问题的阶段,比如某类算法题超时、用例设计题写太慢、SQL语法不熟,该补哪里趁早补。
第四周:复盘+针对性突击。把前几周的错题和没吃透的知识点重新过一遍,整理一份自己的“高频考点速查表”。考前一天只看速查表,不做新题,保持状态但不高强度学习。
6.2 我在笔试中最常看到的三个翻车场景
作为过来人,我复盘过自己和其他同学在笔试中的真实表现,有几个翻车场景特别普遍,提前提醒你避坑。
第一个翻车场景是“代码写对了,输入输出格式错了”。线上判题系统的输出容错很低,多一个空格、少一个换行都可能判错。解决办法是考前花二十分钟专门练输入输出模板,别把时间浪费在考场上试错。
第二个翻车场景是“测试用例设计只顾着写正常路径”。我记得有次模拟练习“搜索目的地”功能,大部分人写的是“输入正确地点名、点搜索、出现结果”,只有少数人写到“搜索结果为空时页面如何展示”“搜索到多个同名地点时如何排序”“输入emoji表情会怎样”。异常路径和边界场景才是拉开差距的分水岭。
第三个翻车场景是“时间分配失控”。有人在一道算法题上死磕四十分钟,导致后面测试设计题只写了三行。我的建议是:笔试开始先花两分钟浏览全部题目,给每道题定一个预算时间并严格执行,比如算法题每道最多25分钟,用例设计题每道20分钟,超了就做下一题。稳稳地把所有题都答完,比“一道题完美、其他题空白”拿到的总分更高。
注意:校招笔试不只是知识考核,也是策略游戏。先完成再完美,先把能拿的分都拿到,再回头优化细节。
我个人在这个岗位摸爬滚打之后最大的感受是:测试开发笔试,其实是在筛选一种“既能钻到代码细节里,又能跳出来看全局”的人。算法题考的是你能不能钻进去,用例设计题考的是你能不能跳出来。准备的时候不要偏废,同样重要的还有一件事——把每一次练习都当成真实的笔试题来对待,限时、手写、模拟判题环境。备考没有捷径,但方向对了,你的每一份努力都会体现在分数上。
最后再分享一个小技巧:笔试前一天,把过去一周整理的高频考点速查表拿出来念一遍,尤其是容易混淆的HTTP状态码和SQL聚合函数。这些零散知识点不念一遍,考场上经常会有“明明会但就是想不起来”的感觉。睡个好觉,比熬夜多刷一套题更重要。