ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

美团2017秋招测试开发笔试题全解析:考点、思路与复习路径

美团2017秋招测试开发笔试题全解析:考点、思路与复习路径 秋招季又要来了每年这个时候后台都会收到一堆关于“测试开发笔试题”的私信。正好前几天整理电脑翻出了我当年备战美团校招时反复刷的一套题——2017秋招测试开发工程师卷A。说实话这套题虽然年份有点久但它的题目设计和考察思路放在今天依然很有代表性甚至可以说现在很多大厂的测试开发笔试题还在沿用类似的框架。当时我刷这套题的时候还没入行很多知识点都是死记硬背后来真正做了几年测试开发回头再看这套题才体会到出题人的良苦用心。这套卷子不是单纯考你“会不会写代码”而是通过一张卷子把“测试思维、开发基础、系统理解、场景设计”这四件事串在了一起。说白了它考察的是一个工程师能不能站在全局视角思考质量保障而不是只会点点点的“人形测试仪”。这篇文章我会把这份卷子的典型题目、背后考点、解题思路完整拆一遍并且结合我这些年实际工作踩过的坑告诉你哪些知识是校招必考、哪些是进了公司才真正用得上的以及一套可行的复习路径。如果你正在准备测试开发岗位的校招或跳槽这篇文章应该能帮你省下不少瞎摸索的时间。1. 这套题到底在考什么一份卷子的考察逻辑拆解先说结论美团这份卷A的题目结构几乎就是测试开发工程师日常工作的微缩模型。整张卷子大概分为四个板块每个板块对应一种核心能力。第一块是基础知识选择题覆盖操作系统、计算机网络、数据结构、数据库这些计算机基本功。这一块占比不大但它是门槛——如果连TCP三次握手、进程和线程的区别都说不清楚后面的题基本没戏。我当时就有个同学代码能力很强但计网基础薄弱结果在选择题上栽了跟头连面试机会都没拿到。第二块是测试理论题包括测试用例设计、测试分类、测试流程等。这一块是区分“开发”和“测试开发”的关键。普通开发可以不懂正交实验法、边界值分析但测试开发必须门儿清。我记得卷子里有一道经典的登录功能用例设计题表面上看是考你“能不能想到各种输入情况”实际上是在考察你有没有完整的测试设计方法论。第三块是编程题一般一到两道难度在LeetCode中等偏上一点点。美团的编程题通常跟字符串处理、数组操作、简单算法有关不会出特别偏的题但很看代码规范性和边界处理能力。第四块是场景设计题也是整张卷子的压轴。比如“如何测试一个电梯系统”“如何测试美团App的下单流程”“如何设计一个自动化测试框架”。这类题没有标准答案考的是你的思维深度和知识广度。有意思的是这四块能力的权重在真实工作中恰好也是这么分布的。基础知识决定你能否融入技术团队测试理论决定你的专业下限编程能力决定你能走多深而场景设计能力决定你能不能独立负责一块质量工作。为什么这套题到今天还有参考价值因为质量保障这个领域核心方法论其实没有发生颠覆性变化变的只是工具和载体。从Web到App再到小程序从手工到自动化再到智能化测试的本质依然是“设计输入、执行验证、分析结果、持续改进”。2. 基础选择题里的高频考点计网、OS、数据库一个都别放很多准备测试开发岗位的同学容易陷入一个误区觉得测试开发就得多刷题、多学工具反而把计算机基础给忽略了。但打开这套卷子你会发现三大基础学科的选择题占了大概15到20分。这15分不是你刷三百道LeetCode能补回来的它是纯粹的记忆理解和基础修炼。2.1 计算机网络不用背到偏题但核心协议必须吃透美团这套卷子里的计网题考得比较典型的是TCP和UDP的区别、HTTP状态码的含义、DNS解析过程。有些同学觉得这些太基础了但我建议你把“会用”提升到“能讲透”的层次。举个例子卷子里问过“HTTP 302和301的区别是什么”。很多人能答出“301是永久重定向302是临时重定向”但这只值一分。如果你能在答案里补一句“301会改变书签和搜索引擎的索引结果302不会在HTTP/1.1中302默认配合Location头使用而303和307是对302行为的细分”那这个答案体现的就不是背诵而是理解。还有一道题我印象很深问“一个HTTP请求从输入URL到页面展示的完整过程”。这题在笔试卷面是一道选择题但在我看来它其实是道面试题。完整链路是DNS解析、建立TCP连接、发送HTTP请求、服务器处理并返回、浏览器解析渲染、断开连接。这里面的每一个环节都可以挖出更细的知识点比如DNS用的是UDP还是TCP大部分场景是UDP但区域传送用TCP、TCP三次握手为什么不能是两次、浏览器解析HTML的阻塞机制等等。我的建议是计网不要追求“偏难怪”把TCP/IP四层模型、HTTP常用方法、状态码、DNS、三次握手四次挥手这些核心点吃透笔试和面试就够用了。但如果学有余力再了解一下HTTPS的握手过程和TCP的拥塞控制属于加分项。2.2 操作系统进程线程、死锁、内存管理是老三样操作系统在测试开发笔试里的地位也很稳定。美团这套卷子考了进程和线程的区别、死锁产生的四个必要条件、虚拟内存的作用。先说进程和线程这道题。基础答案是进程是资源分配的最小单位线程是CPU调度的最小单位。但作为测试开发你最好能联系实际——为什么我们在做性能测试时要关注线程数配置因为线程越多上下文切换的开销就越大这个开销会直接影响服务的响应时间。你看知识点本身是死的一旦跟实际工作场景挂钩它就活了。死锁那四个必要条件互斥、持有并等待、不可剥夺、循环等待是必背的但卷子真正想考的其实是“如何避免死锁”。你得能说出至少两种策略比如破坏循环等待条件资源有序分配法、破坏持有并等待条件一次性申请所有资源。我在实际性能测试中就遇到过数据库连接池配置不当导致死锁的问题当时排查了半天最后发现是多个线程以不同顺序获取多个连接导致的用资源有序分配的原则调整代码就解决了。虚拟内存这块要理解“内存和磁盘之间的映射”以及缺页中断的概念。理解了这个你才能明白为什么性能测试中内存指标不能单看物理内存占用还要关注页交换频率。2.3 数据库SQL题是送分题也是容易丢分的题美团卷子的数据库部分主要是SQL编写题比如查询某个条件下的记录、多表联查、分组统计。这类题对测试开发来说极其重要因为你做测试时几乎天天要写SQL去验证数据。比如测一个订单退款功能你需要去数据库里查订单状态字段是否更新、退款金额是否正确、流水表里有没有生成记录。如果你SQL写不熟练连测试结果都验证不了。但校招同学容易在SQL上犯一个低级错误不写分号、不做空值处理、不考虑查询效率。我记得卷子有一道题是“查询每个用户的订单总数”简单吧但很多人的答案里没有处理用户表中那些从未下过单的用户——用INNER JOIN就把这些人过滤掉了而正确写法应该用LEFT JOIN保留所有用户再用COUNT聚合。这种细节就是白给的分丢了太可惜。另一道让我印象深刻的题是“统计各部门平均工资且平均工资大于5000的部门”。这题要用HAVING而不是WHERE来过滤分组后的结果因为WHERE的执行时机是在分组之前条件里不能使用聚合函数。很多人在这个点上栽了跟头。数据库的复习策略我建议把SQL的增删改查、聚合函数、分组排序、多表联查、子查询这几类写熟然后每天做几道练习题找手感。笔试里SQL题往往不难拼的就是谁更严谨。3. 测试理论用例设计不是想到哪写到哪而是方法论驱动如果你打开那份卷子翻到测试理论部分你会看到几个熟悉的词等价类划分、边界值分析、因果图、场景法、正交实验设计。美团这份卷子里有一道大分值的设计题“请设计一个用户注册功能的测试用例”。这题看着简单但能把用例设计得完整、有条理、可执行的候选人我后来面试时遇到的不到20%。3.1 等价类和边界值测试设计的左膀右臂等价类划分的思路是把无穷无尽的输入数据划分成若干个类别从每个类别里取一个代表值来测试。这样做的前提假设是同一类别里的数据对程序来说处理逻辑是相同的测一个等于测一类。拿注册功能的用户名输入框举例。从长度上划分可以有“小于最小长度”“等于最小长度”“在最小和最大之间”“等于最大长度”“大于最大长度”这五类。从字符类型上划分可以有“纯字母”“纯数字”“字母数字混合”“含特殊字符”“含中文”“为空”等类别。把这些类目组合起来用例数量就已经不少了。但等价类解决不了边界问题。很多Bug就藏在边界值的两边——代码里常见“小于等于”“大于等于”这种比较逻辑差一个等于号就是天壤之别。所以边界值分析规定取边界值、边界值减一、边界值加一这三个值来测试。比如用户名最长是20个字符那你要测19、20、21这三个长度。这套方法不是我编的是行业几十年沉淀下来的经典方法论笔试里用到就是送分点。3.2 场景法和因果图从用户视角和逻辑视角各看一遍场景法强调的是“用户操作路径”。一个注册功能用户可能顺畅地输入所有信息然后提交成功也可能输入到一半去切换App回来发现页面被系统挤下线了还可能提交时网络断开了。这些都属于场景。用场景法设计用例核心是找到“基本流”和“备选流”基本流是主流程备选流是各种分支和异常情况把流与流组合起来就是一套比较完整的业务场景覆盖。因果图则是从逻辑层面思考什么条件下会触发什么结果。比如注册时“用户名已存在”和“两次密码不一致”这两个条件如果同时满足系统应该先提示哪一个这类优先级问题就是因果图要解决的事。在实际测试中因果图其实不太好画但它的价值在于强迫你穷举条件组合不容易漏测。3.3 我踩过的坑用例“有了”不等于“有质量”刚入行时我做测试用例有个毛病追求数量觉得用例数越多说明测越充分。结果有一次重要版本上线前我自信满满地提交了300条用例结果业务方一句话问住我了“下单流程里用户从购物车进入结算页再把购物车里的商品删了这时候结算页会变成什么样你测过吗”我没测过。我的用例里只有“正常从购物车结算”和“清空购物车后再结算”但没有覆盖“结算过程中删商品”这种时间窗口内的交叉操作。这就是用例设计只用了等价类、没用场景法导致的盲区。后来我学乖了每个模块用例设计完都会问自己三句话用户会在什么状态下进入这个页面用户在这个页面的每一步操作可能产生什么异常这些异常和其他模块的状态会不会互相影响这套思维方式说白了就是等价类、边界值、场景法、因果图的综合运用。笔试里那道注册功能用例设计题就是在提前考察你有没有形成这套方法论。4. 编程题复盘不追求最优解但边界处理和代码规范必须到位美团的编程题在笔试里占的分量不轻一般是两道整体难度比纯开发岗略低但依然能刷掉不少人。我印象里这套卷子有一道题是“字符串去重并保持顺序”还有一道是“判断一个单链表是否有环”。题目不算难但考察的东西很值得聊。4.1 字符串去重同一道题三种写法体现三种水平“给定一个字符串去掉重复字符保持字符出现的原始顺序返回新字符串。”输入“abracadabra”输出应该是“abrcd”。第一层写法是暴力解遍历每个字符检查之前是否出现过没出现过就加入结果。用Python就是两层循环时间复杂度O(n²)能跑通但代码不优雅。第二层写法是用集合记录已出现的字符一层循环搞定时间复杂度O(n)。这种解法用到了哈希表的数据结构能体现出基本的数据结构意识。第三层写法是在第二层基础上再考虑字符编码范围用布尔数组替代哈希表还能进一步省内存。如果你能把这个思路表达出来说明你对不同数据结构的特性是由体会的不是在背API。但说实话在笔试环境里能写出第二层就已经很不错了。真正把大家区分开的是边界处理空字符串能不能正常返回输入是null怎么办字符串里如果有数字、空格、特殊字符会不会报错这些细节才是一道题能不能拿到满分的关键。4.2 快慢指针判断链表有环思路一秒钟写对半小时链表有环的经典解法是快慢指针快指针每次走两步慢指针每次走一步如果链表有环两者必然相遇。这个思路很多同学都听说过但真的在代码里写出来问题就来了。问题一怎么判断快指针走到头了如果链表没有环快指针会走到null你要先判断快指针本身不为null再判断快指针的next不为null否则代码会抛空指针异常。问题二循环条件怎么设计有些人写while循环的时候移动指针的顺序不对会导致漏判。问题三链表只有一个节点或者空链表怎么处理这些细节刚好印证了为什么大厂要考编程题——他们不是在找“知道解法的人”而是在找“能把解法正确落地的人”。作为测试开发代码能力不必达到算法竞赛选手的水平但必须具备“用代码解决问题并且处理妥当”的基本功。4.3 测试开发写代码跟开发写代码有什么不同这个问题我是工作后才真正有体会的。测试开发写的代码主要以测试脚本、自动化框架、测试工具为主。这类代码的特点是要处理的数据和场景非常多非预期情况层出不穷代码的可维护性比“能跑通”更重要。比如你写一个UI自动化脚本要处理弹窗、网络延迟、页面元素加载失败这些情况如果没有做好异常捕获和重试机制脚本三天两头就挂。你写个接口测试框架要支持不同的环境配置、数据驱动和断言规则如果没有做好封装抽象每加一个接口就要复制粘贴一大片代码维护成本高到想离职。所以在笔试的编程题里我会重点关注候选人有没有这些意识变量命名是否清晰、有没有处理边界条件、代码结构是否容易测试。这些东西恰恰是刷题之外真正拉开差距的地方。5. 几道典型的场景设计题帮你建立测试开发的系统思维要说这张卷子含金量最高的部分绝对是后半部分的场景设计题。一道是“请设计测试用例来测试美团App的下单流程”还有一道是“如果你来设计一个自动化测试框架你会怎么做”。这两道题放在一起简直是把“测试开发工程师面试”浓缩成了一页纸。5.1 测试下单流程从功能到接口从异常到体验全面覆盖遇到这种大范围场景设计题最忌讳的回答方式就是想到一条说一条“先测打开App能不能进首页再测搜索外卖能不能搜到再测加购物车……”这不是设计这是流水账。面试官想看的是你的拆解能力——把一个大问题拆成几个维度每个维度里再往下拆。我的思路分为四个维度功能维度覆盖完整的前端用户流程从登录、浏览、下单、支付到订单生成和通知。这个过程里要明确正向流程的主路径然后对每个步骤补充分支条件登录态过期怎么办、购物车为空时能否下单、支付失败时订单状态是否已锁定、支付超时后系统能否自动关单。接口维度把下单链路拆成一个个接口对每个接口做参数校验、权限校验、异常返回测试。比如提交订单接口需要验证商品ID是否有效、库存是否充足、用户地址是否在配送范围内、价格签名是否被篡改。数据维度验证关键数据在前端显示、接口返回、数据库存储三个阶段的一致性。这是测试开发最容易体现价值的地方。你在前端看到订单状态是“已支付”接口返回可能也是“已支付”但如果数据库里订单表的字段没更新这就是数据一致性问题属于严重Bug。体验和兼容性维度包括弱网测试、不同手机型号和操作系统版本的兼容性测试、不同屏幕尺寸的适配测试、Push通知和短信通知的到达率和时效性等。这样拆完整个回答的层次感就有了面试官也容易顺着你的框架继续追问细节整个面试的节奏基本就掌握在你手里了。5.2 设计自动化测试框架别急着谈工具先谈逻辑和分层第二道场景题更有意思因为它不只是测试而是融合了开发。很多人一看到“自动化测试框架”立刻开始报菜名用Selenium做UI自动化用JMeter做性能测试用Postman调接口……但一个真正的自动化测试框架核心不是工具有多新而是逻辑分层和稳定性设计。我这些年实践下来的经验是一套可用的自动化框架至少包含五层用例管理层决定用例怎么编写、怎么组织、怎么执行。是采用数据驱动还是关键字驱动用例是放在Excel里由业务人员维护还是用代码直接写这取决于团队的技术水平和项目特点。执行引擎层负责任务调度、用例分发、失败重跑、并发执行。简单场景用Jenkins定时触发就够了复杂场景要自己写调度逻辑支持分布式执行。数据管理层负责测试数据的准备、存储和清理。一套好的自动化框架一定要有独立的数据准备模块保证测试数据不污染生产环境用例执行完能自动清理数据。断言和报告层断言的粒度决定了用例的质量。是只断言接口返回码为200还是同时校验返回内容里的关键字段和数据库落库数据报告系统要有日志、截图、视频回放这些辅助信息否则定位问题会耗费大量时间。稳定性保障层包括等待策略、重试机制、失败用例自动隔离。判断自动化体系成熟度的关键往往不在于用例数量的多少而在于跑十次能稳定通过几次以及失败后定位问题需要多长时间。如果你能在笔试答案中展现出这种分层思维哪怕你没真正搭建过一套完整的框架面试官也会觉得你脑子里有架构概念有设计的潜力。5.3 场景题的通用回答方法论先分维度再讲主次每次模拟面试我都会教候选人一个方法处理任何场景设计题都适用先分维度再定主次然后纵向深挖一个点最后用一个具体案例收尾。分维度意味着你不能只从功能角度思考至少还要有接口、数据、兼容性、性能、安全这些角度哪怕你本身不熟悉某些领域先提出来“这部分可以考虑安全测试”也比完全没提到要好。定主次是告诉面试官在有限的时间和资源里你优先保证哪些场景的质量哪些场景可以适当取舍。纵向深挖一个点是给面试官一个追你细问的接口也向对方证明你不是只在宏观上知道一堆名词。最后用一个自己经历过的案例收尾是把抽象的方法论落到实处的底气所在。场景设计题的本质是考察你用工程化思维解决测试问题的能力。而这项能力没有办法临时抱佛脚靠的是平时一点一滴的项目积累和复盘。6. 从这套题延伸出去测试开发的完整复习路线把整套卷子复盘完我发现了出题人在十年前埋下的一个伏笔——笔试题里考的每一种能力在真实的测试开发工作中都能找到对应的应用场景。如果你现在正准备秋招我建议你按照下面这条路复习效率会高很多。6.1 第一阶段打地基夯实测试方法论和计算机基础这个阶段的目标是把基础分全部拿到手。测试理论方面把软件测试的定义、分类单元、集成、系统、验收测试、测试流程需求分析、测试计划、用例设计、执行、缺陷管理、测试报告、用例设计方法等价类、边界值、因果图、判定表、场景法、正交实验全部梳理一遍确保能用自己的话讲清楚并且能做到随口举出例子。计算机基础方面计算机网络、操作系统、数据库三门课按照校招常考点过一遍不用追求深入源码级理解但核心概念必须滚瓜烂熟。这个阶段大概需要两到三周每天保持三到四个小时的高效学习。6.2 第二阶段练手把代码能力和SQL写熟编程能力没有捷径只有多写。每天保持一两道LeetCode的题量重点是掌握常见数据结构和算法比如数组、链表、栈队列、哈希表、二叉树、分治、贪心、动态规划的基础题型。没有必要所有题目都写出来但最基础的那些一定不能卡壳。SQL练习也是每天必做把简单查询、多表查询、聚合函数、子查询、分组筛选这些常规题型写到条件反射的程度。你可以用本地数据库或在线练习平台总之要有一个能随时执行SQL的环境。6.3 第三阶段做项目从零到一跑通一个自动化测试项目这是很多人忽略但我觉得最关键的环节。校招简历上如果只是写“熟悉常用的测试工具”说服力几乎为零。但如果你能写清楚自己从零搭建了一套自动化测试框架并且用它跑通了某个项目的接口测试或UI测试整个简历的含金量就完全不同了。我当时自己做了一套针对一个开源项目的接口自动化测试框架用Python写请求封装、用例组织、断言校验、结果输出和报告生成。这个项目让我在面试时有了聊不完的话题为什么选择这个库接口的鉴权怎么处理测试数据怎么准备断言是写在用例里还是单独封装这些问题的答案你在准备项目的时候都要反复打磨。如果你已经有测试相关的实习经验那就把实习期的项目彻底复盘一遍重点总结你在项目中遇到的最难的一个问题以及你是怎么定位和解决的。记住一个讲得深入具体的Bug排查故事通常比十个泛泛而谈的项目都更有说服力。6.4 第四阶段实战模拟刷真题练手感备考的最后阶段除了继续刷代码题还要认真做几套完整的测试开发笔试试卷。不要只做一遍看答案就完事要严格按照考试时间模拟做完之后把每一道错题的知识点归因是基础薄弱是审题不清还是时间分配不合理针对不同的归因采取不同的改进措施。还有一个小技巧把你在各类渠道收集到的测试开发面试题整理成文档按模块分类每个模块下整理出标准答案和你的表述版本。面试前过一遍这个文档既能帮你梳理思路也能增强信心。7. 踩过的坑和给后来者的大实话写到这里我突然想起当年备战那会儿的一个场景。我花了一整天时间背测试理论什么V模型、W模型、敏捷测试背得滚瓜烂熟结果做笔试题的时候遇到“请设计一个上传文件功能的测试用例”我竟然愣在原地不知道从哪里下手。说白了知识停留在“知道”层面是没有用的必须转化为“能应用”的能力。这也是为什么我一直在强调刷题一定不能只看答案每道题都要自己动手写一遍、说一遍最好还能讲给别人听。能把别人讲明白才是真正理解了。另外一句大实话是测试开发这个岗位面试时考察的不只是技术还有你的思维方式。同一道测试电梯的面试题有人能答出“电梯高峰期、满载、超载报警、停电”这些场景有人只能想到“按按钮对不对、楼层对不对”。后者缺的不是知识而是把测试思维内化成习惯的过程。测试思维怎么培养我的经验是在日常生活的每一个系统里做练习比如点外卖、坐电梯、用地图导航在脑子里过一遍“如果我是测试我会怎么设计用例”。这种练习成本极低但你坚持两三个月再回头看那些场景设计题思路会完全不一样。美团这套2017年的秋招卷题目本身或许已经有些年头了但它背后那条完整的测试开发能力链路到今天依然是这个岗位的立身之本。我见过太多人刷了无数道题却从未真正思考过“测试开发到底解决什么问题”最后即使进了大厂也会在真正的工作中迷失方向。希望这篇文章能帮你把这条链路理顺让你准备得更踏实也走得更远一些。
返回列表