每年秋招,测试开发岗的简历池里,美团永远是投递量最大的几家之一。2017年的秋招测试开发A卷,基本给后来几年美团的测开笔试定了调:不偏难怪、不炫技巧,靠基础功底和业务思维分层。这套卷子的关键词,说白了就三个——计算机网络、数据结构与算法、测试设计思维。下面不是让你背答案,而是把A卷的命题结构、考点权重和解题思路完整复盘一遍。你既能拿它当刷题地图,也能用它判断自己离大厂测开还差在哪。
1. 一套卷子看美团测开笔试:题型分布和分数结构
1.1 卷面结构:客观题不再只是背诵
2017年美团测开A卷考试时间一般是100分钟,整体分值大致可以拆成三块:客观题(单选加多选)大概占45到55分,覆盖面极广;编程题两道,合计20到25分;测试设计或场景综合题一到两道,占20到25分。SQL和Linux通常不会单独做大题,而是以客观题或小问答的形式夹杂出现。
这个结构说明一个问题:你想靠纯背诵拿高分,很难。客观题表面上是在考知识点,实际考的是你能否在业务场景里快速识别出它背后的基础原理。比如网络题不是直接问你“TCP三次握手是哪三次”,而是给你一个“外卖下单超时,服务端日志出现大量SYN重传,你觉得可能是什么原因”的场景,让你用三次握手的原理解释。这种考法贯穿整张卷子。
分值权重上,我的经验是:客观题是基本盘,决定你能不能过线;编程题决定你进不进得了下一轮;测试设计题决定面试官拿到你简历后第一印象。所以在时间分配上,如果一道客观题卡住超过两分钟,立刻标记跳过,别因小失大。
1.2 命题风格:O2O业务如何“嵌入”基础题
美团做的是O2O生意,外卖、团购、酒店、打车,核心特征是:高并发、地理位置强相关、交易链路长、异常场景多。这套卷子最聪明的地方,就是把这种业务特点嵌进了各个基础题里。
举个例子,数据库部分不会只考你“写一个SQL统计订单数量”,而是会加一个“统计每个城市订单量Top3的门店”的限定。你要是只会在MySQL里裸写group by,不会处理分组内的TopN,这道题就栽了。测试设计题更直接,常考“设计一个外卖App提交订单功能的测试用例”,没有任何伪装,摆明了要看你有没有站在业务角度思考问题的习惯。
所以备考时不要干刷题。每做一道基础题,多问自己一句:这个知识点在真实业务里会怎么触发bug?长期积累下来,笔试里的场景题基本就是送分题。
2. 计算机网络与操作系统:拿下这块等于拿下一半客观题
2.1 TCP三次握手与四次挥手:测试视角下的必问题
网络题在2017年A卷里至少能见到5道以上,其中TCP必考且常考。三次握手本身不复杂,但美团喜欢在细节上挖坑。考过的方向包括:为什么连接是三次而不是两次?答案核心是防止失效的连接请求突然传到服务端,导致服务端白白建立连接、浪费资源。这个“防止半连接资源浪费”的解释,比单纯背“SYN、SYN-ACK、ACK”高级很多。
四次挥手也一样,要理解TCP是全双工的,两个方向的数据通道需要独立关闭。所以主动关闭方发FIN,被动方先回ACK,再等自己的数据发完,再发FIN,最后主动方回ACK,整个过程才有四次挥手。如果只说“因为TCP是全双工”还不够,还得解释清楚两个方向各关一次。
更贴近测试场景的一个点:TIME_WAIT出现在哪一方。主动关闭连接的一方会进入TIME_WAIT,并且要等2MSL。为什么必须等?一是确保最后一个ACK能到达对方,万一丢了可以重传;二是让本次连接产生的所有报文在网络上消失,避免干扰下一个复用的连接。如果你用curl调服务接口,结束后curl所在客户端主动断开,所以TIME_WAIT在客户端;但如果压测时服务端出现大量TIME_WAIT,就要怀疑是不是服务端或负载均衡有意主动断开长连接。这个问题测试开发必须答得上来,因为排查线上问题一定会碰到。
2.2 HTTP状态码与GET/POST:服务端异常排查的基本功
HTTP状态码是测开发日常见面率最高的知识点。A卷里经常把几个容易混淆的错误码放在一起考,最经典的就是500、502、503、504。它们看起来都是“挂了”,但含义完全不同:500是服务器内部错误,说明应用代码抛异常了;502是网关从上游收到了无效响应;503是服务暂时不可用,比如正在重启或过载保护;504是网关等上游响应超时。
我见过很多同学把502和504混为一谈。实际上,502更像是“上游连接坏了”,504更像是“上游连上了但很慢”。如果你在接口偶发504,排查方向应该先放在反向代理到应用服务器之间,可能是线程池满了或者数据库连接池被打满,而不是埋头去追业务代码逻辑。这个区分在面试时能明显拉开差距。
GET和POST的区别也是高频题,而且是那种“你觉得会,但说不全”的题。经典答法:GET语义是获取资源,POST语义是提交数据;GET参数放URL,POST参数放请求体;GET可以被缓存、可以被收藏,POST不行;GET要做成幂等,POST不需要。但要注意,从HTTP协议本身来看,GET也可以带请求体,POST也未必保证幂等,实际约束是业务规范加浏览器限制。美团若追问“分页查询接口用GET还是POST”,标准答案是GET,因为它读操作、幂等、可缓存。
2.3 进程线程与死锁:选择题最爱挖的坑
操作系统在A卷大概有3到5道,集中在进程线程和死锁。死锁的四个必要条件——互斥、持有并等待、不可剥夺、循环等待——必须背到肌肉记忆,因为选择题考法很直接:“以下哪个条件不是死锁必要条件”或“打破死锁可以通过破坏哪个条件”。考后者时,选项中往往会混入“增加资源数”这种无关项,你要能识别出来。
进程和线程的区别,美团喜欢从开销角度考。进程是资源分配的基本单位,线程是CPU调度的基本单位;线程切换比进程切换开销小,因为同进程内线程共享内存空间,不需要切换页表。但这个共享也是一把双刃剑:一个线程崩溃可能导致整个进程挂掉,而进程之间相互隔离。测试开发看到这个知识点,直觉应该是“多线程提高并发能力,但也带来线程安全问题和死锁风险”。回答面试时带上这层业务关系,比干背定义好得多。
银行家算法这类避免死锁的算法,A卷考察频率中等。不需要会完整推导,理解“安全状态”的概念就够了:系统按某种顺序分配资源,能保证所有进程最终完成,那么这个状态就是安全的。不安全的分配请求会被拒绝,这就是银行家算法的核心逻辑。
3. 数据结构与算法:测开编程题怎么练性价比最高
3.1 常考题型分布:链表、字符串、简单DP是主角
2017年美团测开A卷编程题有两道,总体难度明显低于开发岗。考的方向很有代表性:字符串、链表、数组哈希、二叉树、简单动态规划。具体点说,像“判断回文”“最长公共前缀”“反转链表”“合并两个有序链表”“两数之和”“括号匹配”“二叉树的层序遍历”“爬楼梯”这类题,属于要能闭着眼睛写出来的程度。
为什么测开编程题考得这么“温柔”?因为笔试想看的不是你ACM拿过什么奖,而是你写脚本处理测试数据、写mock服务、实现一个小工具的工程能力。你要能在半小时内把一道题写对,边界条件考虑周全,最好还能体现一点测试思维。反过来,如果你拿这半小时去抠一道Hard级别的动态规划,就算做出来了,面试官也不会觉得这是测开岗需要的核心能力。
个人建议的准备顺序:链表基础操作 > 字符串/数组双指针 > 哈希表应用 > 二叉树遍历 > 贪心和简单DP。先保证前四类全部熟练,再看第五类。测开岗把前四类练扎实,应付笔试基本够了。
3.2 笔试平台上的代码细节:输入输出边界与语言选择
笔试平台的代码细节,直接影响你能不能AC。2017年的笔试平台已经大量采用核心代码模式,也就是你只需要补全一个函数,系统帮你处理输入输出。但依然有平台要求你自己读标准输入,所以input()或sys.stdin的处理能力必须会。
语言选择上,我建议直接用Python。理由非常实际:测开日常写脚本、调接口、处理数据,用的就是Python;笔试里Python写链表、字符串处理也快,代码量比Java和C++少一半。很多人担心Python在一些公司笔试平台里性能弱,但美团测开题的规模完全不需要担心这一点。
边界条件是另一大失分点。空数组、只有一个元素、链表为空、数字超过常规int范围、递归爆栈,这些都是测开应该最敏感的。写代码时养成习惯:先判断边界,再写主逻辑。如果时间允许,在代码里用注释补一两个测试用例,比如“输入为空链表时返回None,输入单个节点时返回自身”。这看起来是小事,但阅卷人一眼就能看出你有没有测试意识,这是一种“隐形加分”。
3.3 一道链表题的下完整解题示例:反转链表
我拿“反转单链表”举例,因为它是A卷同级别题目的典型代表,也是测开面试手写代码的高频题。这道题难不难?不难。但能写对的人真不多,多数人栽在指针更新顺序上。
class ListNode: def __init__(self, val=0, next=None): self.val = val self.next = next def reverse_list(head): prev = None cur = head while cur: tmp = cur.next cur.next = prev prev = cur cur = tmp return prev这个实现的核心就是三行:先保存当前节点的下一个节点到tmp,再把当前节点的指针指向前一个节点,最后让prev和cur分别前进。千万不能先改cur.next再取tmp,那样链表就断了,后面全丢。
准备面试还要能顺手说出这道题的测试用例:空链表、单节点链表、两个节点、多个节点、包含环的链表。最后一个用例如果面试官不问,你主动提,效果会非常好,因为它直接暴露你对异常场景的敏感度。顺带一提,反转链表还有递归写法,但笔试和面试我更推荐迭代版,不容易爆栈,也好讲清楚。
4. 测试理论与业务场景题:最容易拉开差距的部分
4.1 等价类与边界值:所有用例设计的根基
如果整套A卷只能留下一道题,我会押等价类划分和边界值分析。这个知识点在客观题和设计题里都会出现,而且它不只是考点,是测开日常工作的底层能力。美团的考法往往是一个输入框或者一个金额字段,让你划分有效等价类和无效等价类,再用边界值补充用例。
举一个接近真题的例子:商品优惠券抵扣金额,限定为0到100元,精确到分。写测试用例时,一个不合格的答题会写成“输入1、50、100都行”。合格的答题要这么列:有效等价类是0.01元到100元,无效等价类是负数、0、大于100、非数字、空值、特殊字符;再叠加边界值,0元、0.01元、99.99元、100元、100.01元,每个都要单独验。关键是那一句说明:为什么0和0.01都要测?因为0往往代表“不使用优惠券”,而0.01是抵扣的最低生效门槛,这两者逻辑分支不同,bug最容易藏在分支切换处。
这套方法不是纸上谈兵。O2O系统里金额、库存、距离、时间戳,全是边界bug的高发区。你写用例时把边界当成第一优先级,基本能拦住线上80%的低级事故。
4.2 场景题示例:设计“提交订单”功能的测试用例
“设计外卖App提交订单功能的测试用例”,这道题在美团测开面试和笔试里出现频率极高。很多人一上来就从“点提交按钮、弹出确认框、支付成功”开始写,这样写出来的用例面试官看十秒就没兴趣了。正确的拆解维度应该是功能、接口、数据一致性、兼容性、弱网异常、安全、性能七个方向。
功能上,要覆盖正常路径和异常路径。正常路径:选择规格、加入购物车、选择地址、确认金额、提交订单、支付回调。异常路径:库存不足、商品已下架、超出配送范围、优惠券不可用、地址不在配送区域、门店休息中。异常路径的价值远大于正常路径,因为正常路径用户每天在走,你能想到,别人也能想到。
接口和数据一致性是测开答题时的加分项。至少要想到三个点:一是幂等性,网络超时用户点两次提交,会不会创建两笔订单?二是并发,同一用户同一商品重复提交,库存会不会超卖?三是事务,创建订单和扣减库存是否在一个事务里,如果扣减库存成功但创建订单失败,数据会不会不一致?
兼容性、性能和技术细节,我平时习惯整理成一张速查表,笔试时按表逐项过一遍,确保不遗漏。
| 测试维度 | 典型测试点 | 核心关注 |
|---|---|---|
| 功能 | 正常下单链路、取消订单、异常分支 | 业务逻辑正确性 |
| 接口/数据 | 幂等性、并发超卖、事务一致性 | 重复提交和脏数据 |
| 兼容性 | Android/iOS版本、屏幕尺寸、推送 | 回归覆盖度 |
| 弱网/异常 | 断网重连、切后台、进程被杀 | 状态恢复与兜底 |
| 安全 | 越权改地址、价格篡改、刷优惠券 | 权限与数据校验 |
| 性能 | 下单接口RT、QPS、错误率 | 高峰稳定性 |
4.3 Bug单与自动化基础:测开岗位的隐藏考点
A卷的测试设计部分,偶尔还会穿插一道Bug单相关的小题,比如“从以下描述中找出一个合格Bug单缺少的元素”。很多候选人笔试环节就栽在这类“送分题”上,因为没有正经写过Bug单。
标准Bug单至少要包含:标题、环境、前置条件、复现步骤、实际结果、预期结果、严重程度、优先级、日志或截图。缺了复现步骤和实际结果,Bug单基本就是废的,开发没法定位。如果是偶发bug,还要注明出现概率和操作时间点。这一块没有捷径,日常多写、多对照模板自然就熟了。
自动化测试和性能测试在2017年A卷里不是大头,但会出基础概念题。Selenium的定位策略(id、name、className、XPath、CSS)要知道,Page Object Model(POM)这种分层思想最好能说一句“把页面元素和测试逻辑分离,减少维护成本”。性能指标里至少分清QPS、响应时间、错误率,以及它们之间的关系。应对方式是背概念加做小实验,比如用Jmeter压一个本地接口,观察线程数、延迟和错误率的变化。
5. 数据库SQL与Linux场景操作:O2O业务的每日基本功
5.1 高频SQL题型:多表连接、分组统计和TopN
数据库题在A卷里的比重不大,但一旦出现,通常就是业务SQL题,而且和你平时工作每天用的写法几乎一致。典型表结构就是用户表、订单表、门店表,考法包括“统计每个城市的订单量”“计算用户复购率”“找出每月订单金额最高的用户”。
最值得警惕的是分组后的TopN问题。考“统计每个城市订单量Top3的门店”时,初级写法是GROUP BY city, shop_id先聚合,再用程序筛Top3。但笔试希望你能直接写出SQL。MySQL里比较土的办法是把聚合结果用用户变量模拟行号,更通用的是用窗口函数:
SELECT city, shop_id, order_cnt FROM ( SELECT s.city, o.shop_id, COUNT(*) AS order_cnt, ROW_NUMBER() OVER (PARTITION BY s.city ORDER BY COUNT(*) DESC) AS rn FROM orders o JOIN shops s ON o.shop_id = s.id GROUP BY s.city, s.shop_id ) t WHERE rn <= 3;窗口函数在2017年笔试中出现还不算普遍,但你会写就是亮点。即使平台不支持窗口函数,也要能写一个基于子查询和自连接的方案。关键是理解PARTITION BY的作用:按城市分组后再排序编号。这比先全部排序再截断精确得多。
SQL优化的基础也不能丢。explain看执行计划、慢查询日志、索引失效的常见场景(比如在索引列上做函数运算、隐式类型转换),这些概念客观题偶尔会碰到,面试也常问。测开不要求你成为DBA,但至少要能判断“这个查询为什么慢,大概从哪里优化”。
5.2 Linux日志排查场景题:一条命令链解决一个真实问题
Linux命令在A卷里通常考得特别实操。典型场景是:线上服务报错率升高,让你用命令查日志、定位问题。美团的业务日志量很大,不会有人用编辑器打开日志文件去翻,你给出的命令必须体现“流式处理”的思路。
我自己最常用的一组命令基本可以覆盖80%的排障场景:
# 1. 查服务进程是否存活 ps -ef | grep order-service # 2. 实时跟踪日志输出 tail -f /data/logs/order-service.log # 3. 从历史日志中捞关键字 grep "OrderTimeout" /data/logs/order-service.log | tail -n 100 # 4. 统计某个状态码出现次数 grep -c " 500 " /data/logs/access.log # 5. 看访问量总量,和上面配合算错误率 wc -l /data/logs/access.log # 6. 按客户端IP聚合访问量,找出异常来源 awk '{print $1}' /data/logs/access.log | sort | uniq -c | sort -rn | head -n 10这套命令里,grep -c算的是匹配行数,wc -l算总行数,两个一除就是粗粒度错误率。awk '{print $1}'默认按空格切分,很多日志格式第一列是IP,切出来后用sort | uniq -c | sort -rn就能快速看到IP维度的分布。我之前靠这条命令在几分钟内定位过一个爬虫刷接口导致的问题,笔试时写出这样的组合拳,面试官会默认你是有实操经验的。
内存和CPU的命令也要顺手掌握。top看实时负载,free -h看内存,df -h看磁盘,这三个在排查“系统变慢”时是第一反应。不要只会看Windows的任务管理器,去了互联网公司,Linux是测试环境的默认底座。
6. 智力题与逻辑分析:想清楚了再动手
6.1 经典赛马题的完整推理过程
美团笔试客观题或附加题里,偶尔会放一两道经典的逻辑推理题,比如赛马、找假币、倒水。这类题分值不高,但设计得很精妙,能考察你面对复杂问题时的裁剪和推理能力。
最经典的是“25匹马,5条赛道,没有计时器,最少跑几次能找出最快的3匹马”。很多人的第一反应是5组各跑一次,每组第一名再跑一次,共6次,然后直接认为前三名就是冠军组的前三。这不对。因为你没有计时器,A2可能比B1快,但你不知道。
标准答案7次,推理过程分三步:
- 第一步:25匹分5组跑5次,得到5个组内排名。
- 第二步:让5个组的第一名再跑一次,得到各组冠军的先后顺序。假设结果是A1 > B1 > C1 > D1 > E1。
- 第三步:冠军确定是A1。能竞争第二和第三的候选只剩A2、A3、B1、B2、C1。D组和E组全部淘汰,因为D1连C1都跑不过,D组任何马都不可能挤进前三。让这5匹马再跑一次,决出第二名和第三名。
这道题本质上是在依赖一个关键认知:信息足够时,先淘汰绝对不可能进前三的候选,再对剩下的候选精准验证。这和测开工作的测试范围裁剪极其相似——你不可能把所有功能在所有机型上全量回归一遍,应该先根据版本变更和风险评估,把不可能受影响的模块剪掉,再把资源集中在高风险点上。
6.2 这类题的答题策略:先跳过还是先死磕
逻辑题在整张卷子里大概只占5到10分,根据我的经验和笔试后的复盘,性价比并不高。如果你3分钟还没有头绪,我建议直接标记并跳过,先保证SQL和测试设计题的得分。原因很简单:面试官筛选简历时,看的是你整体是否过线、场景题答得有没有层次,而不是你有没有解出那道赛马题。
但如果你决定做,就一定要写清推理过程,而不是只写一个答案数字。很多人工阅卷会看思路,哪怕最终结果差一步,只要推理链条清楚,也能拿到大部分分数。做题时把条件一条条列出来,比如“25匹马、5条赛道、无计时器、找前三”,然后问自己:哪些组是确定可以淘汰的?这个“淘汰”的动作,往往就是解题的关键。
另外,别被“智力题”三个字吓住。绝大多数逻辑题考察的都不是智商,而是你有没有按结构化方式拆解问题。先抽象、再分解、最后验证,这套流程在bug定位和测试方案设计里同样适用。
7. 从这套卷反推美团测开岗位的能力模型
7.1 核心能力拆解:技术、业务与数据意识
把2017年美团测开A卷整体过一遍,你能清晰看到美团测开岗位需要什么样的人。不是“会点脚本的点点点测试员”,也不是“算法很强的开发候补”,而是三者兼备的复合型人才:技术功底扎实,网络、OS、数据结构这些基础课不能有短板;业务敏感度高,能从一个外卖订单场景里拆出幂等、超卖、断网、越权这些隐藏风险;数据能力强,会用SQL分析线上数据,会用Linux查日志定位问题,而不是只会等开发来告诉你答案。
还有一个容易被忽略的点:工程意识。A卷里自动化测试和性能测试虽然占比不大,但它的存在本身就是信号——美团希望测开能脱离纯手工测试,用工具和框架解决重复劳动,用监控数据衡量测试价值。POM模型、Jmeter压测、持续集成基础,这些不是附加项,而是能力模型的组成部分。
7.2 实战准备建议:刷题之外的三个动作
按三个周期准备是比较稳妥的节奏。第一周快速过基础:计算机网络、操作系统、数据结构和测试理论,以教材和思维导图为主,目标是恢复记忆。第二周专项刷题:网络题和SQL题每天固定各10道,测试设计题每天至少手写1个场景的所有用例。第三周进入模拟阶段:卡时间做完整套卷,重点训练时间分配和心态。
刷题优先级要明确,我按投入产出比排序,排在前面的一定多做:测试理论 > SQL > 数据结构 > 计算机网络 > 操作系统 > 智力题。这套顺序也适用于面试准备,因为测试理论和SQL是测开区别于开发岗的核心竞争力,也是面试官最愿意深挖的领域。
刷题之外还有三个动作是长期有效的。第一,把自己当成重度用户去使用美团、饿了么这类App,主动寻找可能的业务漏洞,然后写测试用例,这个过程练的是产品理解。第二,把你日常写过的SQL、查过的日志命令整理成一个私有笔记,笔试前翻一遍比重新看理论书有用得多。第三,找一个开源接口或本地项目,自己搭一套自动化测试框架跑通一个流程,不用复杂,跑通从请求到断言到报告即可。这三个动作,比考前突击更接近美团想要的测开素质。
我当年准备这套题的时候,最后悔的就是花太多时间刷算法难题、猜智力题答案,结果在用例设计题上写得凌乱。后来复盘才明白,美团的测开笔试并不靠难题筛人,而是靠一堆“你以为会,问深了就不会”的基础题筛人。如果只能留一条经验,那就是:把TCP状态图背熟、把SQL分组聚合写溜、把等价类和边界值练成肌肉记忆。这三个东西,笔试之后进了公司做测试,依然是天天在用。