ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

美团测开笔试复盘:计算机网络、数据结构与测试设计全解析

美团测开笔试复盘:计算机网络、数据结构与测试设计全解析 每年秋招测试开发岗的简历池里美团永远是投递量最大的几家之一。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参数放URLPOST参数放请求体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, val0, nextNone): 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 ModelPOM这种分层思想最好能说一句“把页面元素和测试逻辑分离减少维护成本”。性能指标里至少分清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分组聚合写溜、把等价类和边界值练成肌肉记忆。这三个东西笔试之后进了公司做测试依然是天天在用。
返回列表