一聊到滴滴出行这类大厂的测试开发校招笔试,很多人第一反应是“是不是又要刷一堆算法题”。以我自己这些年的观察来看,算法确实是绕不开的一道坎,但2018年这份测试开发工程师(第一批)的网申笔试,给我的整体印象并不是纯粹的刷题竞技场,而是一张能力地图。它把计算机基础、数据结构、数据库、操作系统、软件测试理论、测试用例设计、项目场景分析全装进同一张卷子里,考的不是单点记忆,而是你能不能站在质量保障的角度思考问题。后来我做面试官,也经常用类似的思路去回访候选人:你写过哪些测试工具?线上出故障了你怎么排查?接口自动化测试平台你会怎么搭?这篇文章我就从这份笔试切入,把背后的考点逻辑、知识点拆解、备考路径一次讲透。适合正在准备测试开发校招的同学,也适合想系统理解这个岗位到底需要什么能力的从业者。
1. 从这份笔试说起:测试开发校招到底在挑什么人
1.1 笔试结构的整体画像
先还原一下这类网申笔试的大致流程。你通过官网投递简历,简历筛选通过后,会收到在线笔试链接。既然是“第一批”,说明这个时间点比较早,题库相对完整,出题也偏基础扎实的方向。整场笔试通常是选择题、填空题、编程题、简答题和场景设计题混着来,单场时长一般在90到120分钟。在线笔试最大的特点是客观题占比不低,因为系统要自动判卷;但真正决定排名的往往是需要主观表达的简答题和场景题,这部分会进入后续面试环节做深度验证。
从出题结构来看,我大致给过一个参考权重:算法与数据结构约占三成,计算机基础(网络、操作系统、数据库)占三成,软件测试理论加用例设计占两成,剩下的两成留给场景设计、项目思考这类发散题。你不一定每一题都答得完美,但如果某一个板块明显薄弱,排名就会被直接拉开。这也是滴滴这类体量的公司筛选人的底层逻辑:笔试不追求选出“最聪明的人”,而是筛掉基础不扎实、工程思维欠缺的人。
1.2 测试开发岗位的真实职责
很多人以为测试开发就是“写自动化脚本的测试员”,这个理解太窄了。测试开发的本质是质量保障体系建设者。测试员可以是手工执行用例的人,但测试开发要造的是一整套检测设备,帮团队更快发现缺陷、更早暴露风险。拿工厂做类比:普通测试是流水线上的质检员,测试开发则是设计自动化检测仪器、优化检测流程、制定质量标准的那批工程师。
所以这份笔试里出现算法题、SQL题、场景分析题,不是故意为难你,而是因为这些能力就是这份工作要用到的。你要写自动化框架,那必然要写代码,至少要懂时间复杂度和基本数据结构;你要排查线上问题,那必然要懂HTTP、数据库和Linux日志分析;你要做测试平台,那必然要懂一些前端后端知识,也得有产品视角。笔试就是在用一张卷子模拟你未来可能遇到的真实挑战,这也是为什么那些死记硬背“八股文”的人,往往笔试分数不错,一到面试聊项目就露馅。
2. 笔试内容全拆解:六大板块逐一过
2.1 计算机基础知识:选择题要稳
选择题部分最常出现的是计算机网络、操作系统和编程语言基础。网络里高频考点基本集中在TCP三次握手、四次挥手、HTTP与HTTPS的区别、常见状态码、GET和POST的差异、Cookie与Session、DNS解析过程。操作系统则喜欢考进程与线程、死锁产生的条件、内存分页分段、调度算法这些。语言基础会涉及Java或C++的面向对象、内存管理、异常机制,甚至一些位运算和浮点精度问题。
很多人复习这块喜欢“背答案”,比如背“三次握手为什么不是两次”。但我的建议是尽量把每个知识点放到真实场景里理解。比如TCP三次握手,你可以想成一个电话确认过程:第一次“你听得到吗”,第二次“我听得到,你听得到吗”,第三次“我也听得到”,双方才确认通信畅通。这样理解后,面试官再追问“如果第二次握手丢了会发生什么”,你也能基于逻辑推出来,而不是背个标准答案。
这类选择题还有一个特点:单题分值不高,但总量大。你如果在一道题上卡太久,后面大题往往来不及做。我的习惯是,给选择题统一设一个心理时间上限,比如一共30道选择,最多20分钟,超过就先蒙一个标记,回头再检查。
2.2 数据结构和算法:编程题是分水岭
算法编程题在整场笔试里通常是分值最高的单题,也是大家最焦虑的部分。但请注意,测试开发岗考算法,重点不在“难”,而在于代码是否健壮、思路是否清晰、边界条件是否考虑周全。常考的类型其实很稳定:数组、字符串、链表、栈、队列、哈希表、二叉树、排序、二分查找,偶尔会出现动态规划和贪心,但难度一般控制在LeetCode中等题以内。
测试开发为什么需要算法能力?一是写自动化框架时,数据构造和断言处理需要扎实的编码能力;二是测试平台要处理大量数据,不能写出O(n²)的糟糕实现;三是边界条件意识本身就是测试思维。一个连空数组都不判断的人,写出来的测试工具肯定漏洞百出。
我见过一个比较典型的题目:反转字符串。看起来简单,但考察点可以很细。第一层是直接调API,说明你熟悉语言库;第二层是手写双指针原地反转,说明你理解了数组索引;第三层是考虑字符串里可能有Unicode字符时怎么处理,说明你有测试思维。面试官看的不只是你有没有写出答案,而是你停在哪个层次。
2.3 数据库与SQL:测试开发绕不开
数据库几乎是每场笔试必考,而且考试形式很直接:给你一个表结构,让你手写SQL。测试开发日常工作里,SQL的使用频率相当高。你要准备测试数据,要验证某个功能写入数据库的数据是否正确,要分析线上问题,要统计测试覆盖率,都离不开查询和更新数据。
高频考点包括SELECT基础查询、WHERE条件过滤、ORDER BY排序、GROUP BY分组与HAVING过滤、多表JOIN连接、子查询、聚合函数、索引为什么快、事务的ACID特性、隔离级别。笔试里最容易丢分的是三类:第一,聚合和GROUP BY混在一起时不注意语法顺序;第二,多表关联时不写别名,导致字段歧义;第三,WHERE和HAVING的区别没搞明白,该用HAVING的位置写成了WHERE。
建议备考时每天都拿一道SQL题练手,不要只在编辑器里跑通,还要训练自己盯着题目在纸上写出来。笔试环境往往没有自动提示,大小写不规范、多一个逗号少一个分号都会影响判卷,手写习惯要从备考期就开始培养。
2.4 操作系统与Linux:命令题是加分项
操作系统理论题之外,测试开发笔试还特别爱混入Linux命令题。原因很简单:服务端系统大多是Linux,测试要在上面部署环境、看日志、查性能、跑自动化任务,不会命令行寸步难行。
常见命令包括:ps查看进程、top查看系统负载、grep过滤文本、awk和sed做文本处理、netstat查看端口、chmod修改权限、tar打包解包、find查找文件。不要只看不练,建议自己在虚拟机或者云服务器上建一套环境,把“查找所有日志文件里包含ERROR的行并统计行数”这类实际操作练熟。
有一类场景题很典型:线上服务变慢了,你怎么排查。合理的链路是先用top看CPU和内存,再用ps定位到异常进程,然后用strace或jstack看线程在做什么,最后结合日志定位瓶颈。这种题不需要你做过真正的生产环境,但能把排查逻辑讲清楚,就已经超过大部分候选人了。
2.5 软件测试理论与用例设计:岗位的核心题
这一块是测试开发岗位笔试和其他开发岗位笔试最大的区别。理论基础包括:测试生命周期(需求分析、测试计划、用例设计、用例执行、缺陷管理、测试报告)、测试类型(单元测试、集成测试、系统测试、验收测试)、黑白盒测试的区别、α测试和β测试、回归测试和冒烟测试的意义。
用例设计方法更是重点中的重点。等价类划分、边界值分析、因果图、判定表、场景法、错误推测法,这些都是笔试简答题的常客。尤其是边界值,几乎所有面试官都爱用。比如输入框允许1到100个字符,等价类会分成小于1、1到100、大于100三段,但边界值法会额外关注0、1、100、101这四个点,因为程序错误最容易发生在边界上。
这道题的考点不是让你背定义,而是要你展现“能不能写出一套覆盖正常、异常、边界、安全、兼容、性能的测试用例”。我在下文的实操环节会拿登录页面完整拆一版,这套方法学会后,遇到任何功能都能套用。
2.6 场景设计与项目题:拉开差距的地方
笔试最后通常有一两道开放题,分值不一定高,但面试官会认真看你的答题思路。常见类型包括:给你一个功能模块,让你设计测试方案;给你一个线上故障,让你列出排查步骤;给你一个测试平台需求,让你谈技术选型。
这类题没有标准答案,但答题套路是有共性的。我建议按四步走:第一步,明确需求和范围,把要测或要解决的问题边界划出来;第二步,拆解模块和关键路径,画出主流程和分支流程;第三步,列出风险点和测试重点;第四步,落到具体工具、数据和度量方式。答得好的人,会让面试官觉得“这人不是只会写用例,而是有全局视角”。
3. 典型题目复盘与解题思路
3.1 用例设计题:从登录页面说起
先拿一个几乎所有公司都会考的登录功能来完整拆一遍。别看登录简单,面试官会不断往里加条件:支持账号密码、手机验证码、第三方授权登录;连续输错5次要锁定;有图形验证码;有“记住我”功能。这些条件一旦叠加,用例数量会成倍增长。
我的答题顺序是这样的:
- 先确定输入条件:手机号、密码、验证码、第三方授权token。
- 再按正常流程拆:正确输入能否登录、第三方授权首次绑定、记住我之后保持登录态。
- 然后拆异常流程:错误密码、验证码过期、连续输错锁定、网络异常、服务器超时。
- 再补充边界和安全性:密码长度边界、特殊字符、SQL注入尝试、暴力破解、日志脱敏。
- 最后补兼容性和性能:不同系统版本、不同浏览器、弱网、高并发同时登录。
这样拆分之后,你可以给出一张类似下面这样的用例表:
| 用例编号 | 前置条件 | 操作步骤 | 预期结果 | 优先级 |
|---|---|---|---|---|
| TC_Login_001 | 已注册用户 | 输入正确手机号和密码 | 登录成功,跳转首页 | P0 |
| TC_Login_002 | 已注册用户 | 输入错误密码 | 提示“密码错误”,不跳转 | P0 |
| TC_Login_003 | 已注册用户 | 密码长度为1位 | 提示“密码长度需为6-20位” | P1 |
| TC_Login_004 | 已注册用户 | 密码输入框输入SQL片段 | 系统不报错,提示输入不合法 | P1 |
| TC_Login_005 | 用户连续输错5次 | 第6次输入正确密码 | 账号被锁定,无法登录 | P1 |
| TC_Login_006 | 弱网环境 | 点击登录,请求超时 | 提示“网络异常,请稍后重试” | P2 |
| TC_Login_007 | 正常环境 | 使用30个并发用户同时登录 | 系统稳定,无超时或数据错乱 | P2 |
写完后可以再加一句:优先级划分原则是先保证核心流程和资金/信息安全的用例,再覆盖普通异常和体验类用例。这句话很加分,因为它体现了你的测试策略意识。
3.2 算法编程题:两数之和与LRU
编程题估计很多人已经刷吐了,但笔试里出现的频率确实高。拿LeetCode的第一题“两数之和”来举例:
# 暴力解法,时间复杂度 O(n^2) def two_sum(nums, target): for i in range(len(nums)): for j in range(i + 1, len(nums)): if nums[i] + nums[j] == target: return [i, j] return []暴力解法能跑通,但面试官肯定不满意。优化方案是哈希表:
def two_sum(nums, target): seen = {} for i, num in enumerate(nums): complement = target - num if complement in seen: return [seen[complement], i] seen[num] = i return []这段代码考察了三个点:用哈希表把查找从O(n)降到O(1)、用enumerate同时拿索引和值、边界时记得返回空数组。笔试判卷时会自动跑测试用例,也会有人工抽检代码风格,所以变量命名、缩进、注释都会影响最终评价。
另一道高频题是LRU缓存。核心要求是get和put都要O(1),最佳实现是哈希表配合双向链表。你能在白板上画出这个结构,再手写出来,基本上算法这块就过关了。不懂双向链表为什么需要dummy头的同学,强烈建议去画一遍插入和删除的流程图,这个基础思路一旦通了,很多缓存类题目都能举一反三。
3.3 SQL综合题:订单表统计
出行行业笔试里经常出现订单表。假设有一张订单表orders,字段包括id、user_id、driver_id、city_id、amount、status、create_time。再给你一张城市表cities,字段是city_id和city_name。
第一类问题是统计类,比如统计每个城市的订单量:
SELECT c.city_name, COUNT(o.id) AS order_cnt FROM orders o JOIN cities c ON o.city_id = c.city_id GROUP BY c.city_name ORDER BY order_cnt DESC;第二类是排行类,比如找出下单次数最多的前10个用户:
SELECT user_id, COUNT(*) AS cnt FROM orders GROUP BY user_id ORDER BY cnt DESC LIMIT 10;第三类是聚合计算,比如统计平均客单价、订单完成率。这些都是测试开发做数据分析时的基础SQL能力。笔试时记得别名加AS、多表连接加别名、条件过滤写在WHERE、分组后的过滤写在HAVING。写完之后最好自己默读一遍,检查是否漏了分号或者括号不匹配。
4. 备考路线:从零到笔试通过的靠谱路径
4.1 第一阶段:基础扫盲与原理理解
如果你是计算机相关专业,基础课可能学过但忘了,这个阶段就是快速捡起来。建议留出三到四周,每天两到三小时。网络方向可以看《图解HTTP》和TCP部分,操作系统方向看进程线程、死锁、内存管理,数据库方向先把SQL必知必会过一遍,测试理论方向看《软件测试的艺术》或者一些公开课。
这个阶段不要急着刷题,重点是建立整体框架。我建议每看完一个理论,用自己的话写一段笔记,别抄书。比如看完三次握手,写一句“为什么是三次而不是两次”,能写清楚,说明真理解了。这个阶段的目标是:看到题目里的名词,你能大概讲出它是什么、解决什么问题、有什么局限。
4.2 第二阶段:专项刷题与手写能力
基础扫盲后,进入刷题阶段,建议三到四周。算法按类型刷,数组、字符串、哈希、二叉树、二分、动态规划,每天两道,先思考再动手,实在没思路再去看题解,但看完必须自己重新写一遍。SQL每天手写两道,可以从网上题库里找,关键是不开IDE提示。测试用例设计可以拿日常场景练手:自动售货机、搜索框、电梯、文件上传,每天设计一个。
这个阶段我会提醒两件事。第一,整理自己的错题本,不用太复杂,一个表格记录题目、错误原因、正确思路就够。第二,开始练习语音输出。笔试只要求代码,但面试一定要求表达,你可以给自己讲一遍解题思路,讲不顺的地方往往就是还没理解透的地方。
4.3 第三阶段:项目实战与简历打磨
笔试通过后一定会有面试,面试几乎必问项目。我的建议是选一个小而完整的项目来做,别贪大。比如用Python搭一个接口自动化测试小工具,用requests发请求,pytest管理用例,再用插件生成HTML报告。如果能自己mock一个服务,把从需求到设计到开发到测试的完整闭环走一遍,效果会更好。
现在很多同学喜欢用AI辅助工具生成代码,这一点我不反对,测试开发本来就是工具效率的推崇者。但前提是,你至少要知道每段代码在干什么,测试脚本面向什么业务、断言数据从哪来、失败时怎么排查。面试官不会因为你用了AI工具而减分,但要是一问三不知,那还不如不用。
简历上写项目时,不要写“参与了xx平台开发”,要写“完成了哪些功能模块、设计了哪些测试用例、发现并推动解决了哪些问题、测试效率提升了多少”。有量化指标的项目描述,远比空泛的职责描述有说服力。
4.4 第四阶段:面试冲刺与心态管理
最后一到两周做冲刺。第一是模拟面试,可以找同学互问,也可以自己对着录音设备讲,重点练习项目介绍和三分钟自我介绍。第二是复盘高频问题,把网络、操作系统、数据库、测试理论、用例设计这五类的经典问题过一遍。第三是时间管理,笔试也好、面试也好,都要有“卡点意识”,一道题最多花多少时间,提前想好。
心态上,不要把笔试当成生死战。我见过太多人笔试前失眠、面试时紧张,反而发挥失常。你要这么想:笔试只是整个招聘流程的第一关,是帮你发现薄弱环节的工具,不是审判台。你把备考过程当成一次系统性补课的机会,哪怕没面上,这几个月学的东西也不会白费。
5. 踩坑清单与常见问题速查
5.1 笔试中常见的丢分点
这些年我身边同学、同事踩过的坑不少,总结下来主要有五个高频丢分点。
第一,算法题不判断边界条件。比如空数组、数组长度为1、目标值不存在、整数溢出。这些问题平时练习时因为测试用例都是标准化的,不容易暴露,但笔试里题目的用例往往刁钻,漏一个边界就是AC变WA。
第二,SQL只会在工具里点,不练手写。很多人在Navicat或DataGrip里写SQL很溜,一进笔试环境就傻眼,原因是习惯了自动提示。解决办法就是备考期用文本编辑器裸写,最后再去工具里验证。
第三,用例设计只写正常流程。这是测试思维的硬伤,只写了登录成功、下单成功、支付成功,完全没有账号锁定、网络超时、重复提交这些分支。考官一眼就能看出你没有做过真正的测试。
第四,时间分配失衡。有的人在第一道算法题上死磕40分钟,结果后面的SQL和场景题全空着。笔试和真实工作一样,要学会在有限资源下做取舍。
第五,忽略基础概念的“为什么”。比如HTTP状态码能背出401是未认证、403是禁止访问,但面试官追问“什么场景会返回401,什么场景返回403”就含糊了。关键不在背数字,而在于理解语义和场景。
5.2 八股文到底该怎么背
“测试开发面试题八股文”这个词本身就带着一点调侃意味,好像背下来就能过面试。我的态度是:八股文可以背,但必须带着场景背。死记硬背的标准答案,面试官随便变个问法就穿帮;带着真实场景去理解,才能答出区分度。
拿一个高频问题举例:“GET和POST有什么区别?”大多数人都能答GET参数在URL上、POST参数在Body里。但如果你能补一句“实际使用中,GET请求会被浏览器缓存,POST不会;从安全性角度,POST也不是绝对安全,因为抓包一样能看到明文,真正安全要上HTTPS”,这个答案就已经超过一堆模板答案了。
我建议每个重点知识点都准备“一句话结论加一个实用场景”。比如进程和线程的区别,结论是“进程是资源分配的最小单位,线程是CPU调度的最小单位”,场景是“Chrome浏览器每个标签页是一个进程,防止一个标签卡死拖垮整个浏览器;而一个进程内的多个线程共享内存,协作处理任务更快”。这样背出来的答案有血有肉,面试官才相信你实践过。
5.3 高频问题速查表
下面把我认为测试开发笔试和面试里最高频的问题整理成一张速查表,方便你考前快速过一遍。
| 考察方向 | 高频问题 | 关键回答要点 |
|---|---|---|
| 计算机网络 | TCP为什么是三次握手 | 确认双方收发能力,防止历史连接初始化 |
| 计算机网络 | HTTP状态码分类 | 1xx信息、2xx成功、3xx重定向、4xx客户端错误、5xx服务端错误 |
| 操作系统 | 进程和线程的区别 | 进程是资源分配单位,线程是调度单位,进程间隔离性强,线程共享内存 |
| 操作系统 | 死锁产生的条件 | 互斥、持有并等待、不可剥夺、循环等待 |
| 数据库 | 什么是索引 | 类似图书目录,加快查询,但会增加写入代价和存储空间 |
| 数据库 | 事务ACID | 原子性、一致性、隔离性、持久性 |
| 测试理论 | 等价类和边界值 | 把输入分成有效/无效等价类,再重点验证边界点 |
| 测试理论 | 黑盒白盒区别 | 黑盒看功能、输入输出,白盒看代码逻辑和路径覆盖 |
| 自动化 | 如何设计接口测试框架 | 分层:数据驱动、公共封装、断言库、报告与CI集成 |
| 场景设计 | 如何测试一个支付功能 | 从支付成功、余额不足、重复回调、并发、幂等、安全多维度拆 |
这张表列出的问题,你在笔记上都能找到标准答案,但这正是“会背”和“会答”的差别所在。每次复习时,尝试不看答案,自己用口语讲出来,再对照补充遗漏点。
6. 写在最后:我的几点经验
做了几年测试开发,也当过面试官,我最大的体会是:这份岗位的门槛不是智商门槛,而是“会不会把知识变成方案”的门槛。笔试考的那些算法题、SQL题、用例设计题,其实都是工具,真正想看到的是你拿到一个模糊需求时,能不能拆成可执行的质量保障动作。所以我特别建议正在准备笔试的同学,哪怕只是一个小功能,也尝试从需求分析开始,自己设计用例、开发一段自动化脚本、跑一遍并记录结果。这个闭环做完,比刷一百道题都管用。
还有一个小技巧想分享:参加正式笔试之前,一定要做至少一次全真模拟。找一个周末上午,定好闹钟,关掉手机,按照正式考试的时间分配,把所有题型完整走一遍。考完不要只看分数,重点复盘时间分配和卡壳的知识点。很多人第一次笔试失利,不是因为不会,而是因为不熟悉在线笔试的节奏,提前模拟可以极大地缓解这个问题。祝你们都能拿到心仪的offer,也欢迎在评论区聊聊你遇到的那些“压箱底”的笔试题。