拓冰建站拓冰建站
首页 / 资讯中心 / 正文

字节跳动2018校招测试开发笔试面试真题解析

1. 先还原一下2018年那场笔试的“战场地形”很多人现在回头看“字节跳动2018校招测试开发方向第一批”第一反应是“这是五年前的老题了还有什么参考价值”。但我的观点恰恰相反——2018年是字节跳动大规模校招的关键年份那一批题目基本奠定了后来几年测开岗位的选拔框架。你如果能把这一批题吃透再去看现在的测开面试题会发现核心逻辑几乎没有变只是技术栈从框架使用变成了源码理解从手工执行变成了工具平台建设。先明确一个事情2018年的“测试开发”不等于“功能测试”。在字节的招聘语境里测开工程师既要有开发能力能写自动化脚本、能搭建测试平台又要有测试思维能在产品上线前找到那些边界条件和数据一致性问题。所以那批笔试题目一上来就是算法题加计算机基础选择题再配合一部分测试设计题整体风格非常“混合”。从岗位JD倒推能力模型我当时总结了三层第一层是硬编码能力算法题、数据结构、数据库SQL、Linux命令这些必须过关至少达到能写生产级代码的边缘水平第二层是测试专业能力包括测试用例设计、自动化框架的使用、接口测试、性能测试的基本思路第三层是产品思维特别是对字节系产品当时主要是今日头条、抖音、西瓜视频等业务逻辑的理解你能不能针对信息流推荐、短视频上传、评论互动这类业务设计出合理的测试方案。这一批次的笔试题型结构大概是这样的选择题占一部分主要覆盖计算机网络、操作系统、数据结构编程题占两到三道难度在LeetCode中等偏下还有一道测试设计题或者场景题专门考察你对异常输入、极端情况、竞态条件的敏感度。这里面的坑在于很多人只刷算法题忽略了测试设计题结果笔试挂得莫名其妙——不是代码不够强而是没有用测试思维去回答一个“怎么测”的问题。2. 笔试算法题难度不算顶格但坑都藏在边界里2.1 高频考点盘点与一道典型题的精讲2018年这一批算法题从后续的考生回忆和面经汇总来看频率最高的几个考点是字符串处理、链表操作、数组的滑动窗口类问题、二分查找的变体、简单的动态规划。和同一年算法岗的题目比起来测开方向的算法难度确实低了一档但这不代表可以掉以轻心。测开岗位的算法题考察重点不是“你能否设计出精妙的算法”而是“你的代码是否严谨、是否考虑了所有边界条件、是否有bug”。这个取向和测试思维是一脉相承的。拿一道非常经典的题目来举例给定一个字符串找出其中无重复字符的最长子串长度。这道题现在看着不新鲜但在2018年那批笔试里它频繁出现在各个大厂的测开卷子里。标准解法是滑动窗口加哈希集合用一个左指针和一个右指针维护当前窗口右指针每次向右移动如果新字符在集合里已经存在就不断移动左指针并从集合中移除对应字符直到窗口内没有重复字符然后更新最长长度。def length_of_longest_substring(s: str) - int: char_set set() left 0 max_len 0 for right, ch in enumerate(s): while ch in char_set: char_set.remove(s[left]) left 1 char_set.add(ch) max_len max(max_len, right - left 1) return max_len代码写出来很顺但笔试评分的时候考官真正看重的是这几个点一是空字符串的处理二是指针移动的顺序三是窗口长度的计算方式。如果while循环里忘记移除左指针字符就会陷入死循环如果在更新长度时直接用right - left而忘了加1边界就直接错了。这些细节看起来小但在线上的编译器里跑不过测试用例就是零分。2.2 计算机基础选择题网络与OS是重灾区算法题之外选择题是拉分大户。2018年这批次的选择题范围集中在计算机网络、操作系统、数据库、Linux基础。网络部分HTTP状态码的含义、TCP三次握手和四次挥手的过程、TCP与UDP的区别、HTTP与HTTPS的差异都是高频题。操作系统部分进程与线程的区别、死锁产生的四个必要条件、虚拟内存与页面置换算法是常见考点。数据库部分SQL基本语法、索引失效的场景、事务的ACID特性、隔离级别都出现过。我在这里要说一个很多人忽略的事实测开岗位考这些内容并不是为了选拔“计算机理论专家”而是因为这些基础知识和实际测试工作直接挂钩。举个最简单的例子接口测试中你看到一个HTTP 304状态码如果不懂它表示“资源未修改可以使用本地缓存”你很可能把缓存机制当成bug报上去做性能测试时如果不懂线程和进程的区别你就无法判断应该用多线程模拟并发还是用多进程模拟查数据库超时问题时如果不懂索引失效的几种场景比如在索引列上使用函数、隐式类型转换、左模糊查询你就只能在SQL层面瞎猜。所以复习这些内容时我建议大家不要死记硬背而是把每个概念和“在测试中什么时候会遇到它”对应起来。比如看到TCP三次握手你就想一下用抓包工具排查连接超时时三次握手的过程如何帮助你判断问题出在哪一段看到死锁的四个必要条件互斥、持有并等待、不可剥夺、循环等待你就想一下在压测数据库连接池时连接耗尽导致的线程阻塞是不是就是一种死锁。2.3 笔试题里暗藏的“测试思维”这一批笔试里真正区分度最高的是那道看着不起眼的测试设计题。有些年份它会直接让你设计一个测试方案有些年份它会伪装成一个选择题问你“下面哪个测试用例最有可能发现某个bug”。我当年参加和后来辅导过的同学里不少人在这道题上翻了车原因是他们用“开发思维”而不是“测试思维”去答题。举个例子题目可能会是一个函数接收两个整数a和b计算a除以b的结果请设计测试用例。开发思维的人会写输入10和5期望输出2输入-10和5期望输出-2这些能证明代码基本可用但放到测试场景里远远不够。测试思维要求你回答的是完整的分层用例集合正常功能用例正整数除以正整数、负数参与运算、结果为小数的情况边界值用例除数为0、被除数为0、被除数为整数最小值、被除数为整数最大值、绝对值为1的情况异常输入用例输入类型错误传入字符串或浮点数、参数缺失、超过整数范围的超大数特殊场景除数和被除数都取极端值时的溢出问题、精度要求、异常处理分支是抛出异常还是返回特定错误码。这四种用例一层层铺开才是一个测试人员脑子里的完整画面。2018年的笔试题目不管表面问法是什么核心都在考察你脑海中是否可以随时调出这个“分层测试用例”的框架。这一点我在后面讲面试环节时还会反复提到因为线上的代码题可以靠刷题解决但测试思维只能靠反复练习真实场景来养成。3. 面试现场测试用例设计是真正的分水岭3.1 一道登录用例题从“能用”到“加分”的答题路径笔试过了之后面试才是真正筛选人的地方。2018年字节的面试流程通常是三轮技术面加一轮HR面每一轮技术面都必然包含手撕代码和测试用例设计。而测试用例设计题中最经典的“入门款”就是让你设计登录功能的测试用例。这个问题看起来简单实际上考察维度非常立体我用它来详细展示从“能用”到“加分”的完整答题路径。第一层大多数人能想到的是从功能角度拆解输入正确的用户名和密码能登录成功输入错误的密码提示错误用户名为空时提示不能为空密码为空时提示不能为空。这些是基本盘能说清楚这个你至少不挂。第二层加分的做法是引入等价类划分和边界值分析。等价类划分把输入数据分为有效等价类和无效等价类比如合法用户名、非法用户名、特殊字符用户名、超长用户名合法密码、错误密码、空密码、密码首位为空格的场景。边界值分析则盯着长度的临界点比如用户名限制为6到20个字符那6个、20个、5个、21个、19个、7个都是必测的点。第三层达到这个层级基本就能锁定offer了加入场景交互和异常情况。登录功能不是孤立的它要依赖网络请求、后端接口、数据库、token过期机制。用例设计就要覆盖断网时点击登录有没有友好提示弱网状态下请求超时有没有重试机制连续输错五次密码是否触发锁定或验证码用户登录成功后token失效再次操作是否需要重新认证用户同时在线两端登录另一端的表现是什么密码经过加密传输是否正确。再往后还有兼容性维度不同浏览器、不同手机型号、不同操作系统的表现是否一致Web端和App端的登录流程差异在哪里。你把这几个层次一层层讲出来面试官看到的不是一个背用例的人而是一个真正理解“登录”这个业务背后包含技术栈全链路的测试工程师。我当时在模拟面试中带过一个候选人他按这个框架回答后面试官当场追问了一个延伸问题“如果登录接口被刷怎么设计测试方案”他顺着限流、验证码、IP封禁、风控策略几个角度展开面试官直接点头说“这个岗位很适合你”。3.2 业务测试方案题用产品视角拆解Feed流如果说登录用例是热身那么业务测试方案题就是真正的分水岭。2018年字节的面试官特别喜欢问一个类型今天我们在App首页展示信息流内容请设计一个完整的测试方案。这里的“信息流”可以替换为视频推荐、短视频上传、评论系统等。这类问题的核心难点在于它要求你跳出页面级测试的框框站在全局视角去思考一个业务链路涉及的模块与交互。以Feed流为例一个完整的测试方案至少要覆盖这些维度数据来源与排序规则内容从哪里来是本地审核通过的内容、策略推荐的内容还是广告内容不同来源内容在Feed中的占比和排序算法如何验证接口测试层面请求参数分页参数、用户ID、设备ID、场景ID、响应数据的完整性、下拉刷新和上拉加载更多时的数据拼接是否有重复内容、是否有内容丢失客户端状态管理下拉刷新时在弱网环境下是否出现loading卡死切换前后台再回来时Feed数据是否需要重新请求本地缓存如何与最新数据保持一致具体业务功能点赞、评论、分享、关注作者、点击进入详情页、点击广告的外跳链接每一个交互点都需要独立的用例集合兼容性与性能Android和iOS不同版本上的布局是否错乱老机型低端机上的滚动是否卡顿首屏加载耗时是否超过竞品基准线。这里最核心的思路是“端到端测试方案”和“分层测试策略”。面试时不宜一上来就埋头说“点击哪里、验证什么”而是先给一个骨架从数据源到客户端展示从接口到UI把整个链路的过程先描述清楚然后按模块填充测试细节。这种结构化的表达方式跟工作里做测试方案评审时完全一致面试官要看到的就是这种可迁移的工作能力。3.3 手撕代码环节的实际难度与应对策略关于面试中的手撕代码我直接说结论这一环在2018年测开方向中的难度上限基本就是LeetCode Medium级别。考什么通常是从数组、字符串、链表、二叉树、动态规划这些“基础题型”中抽取不会抽冷门题更不会考复杂图论加高阶数据结构。但我见过很多人刷了三百道题却在手撕环节翻车原因不是题不会做而是现场的代码习惯太差。具体来说有三类问题非常致命第一类是完全没有沟通就埋头写代码。面试官给的题目往往是有歧义的比如“实现一个LRU缓存”没有指定容量、没有指定是线程安全还是非线程安全如果你不问清楚就直接写很容易写出和面试官期望不符的方案。正确的做法是先复述一遍你对题意的理解再抛出两三个关键问题比如数据规模多大、是否需要线程安全确认清楚了再动手。第二类是边界条件考虑不全。手撕代码时写完主逻辑后一定要自测几个用例空输入、单元素输入、极值输入、重复元素输入。我自己在面试时见过候选人写了一个看起来完美的快速排序但当输入数组里包含大量重复元素时就会进入最坏复杂度——他并没有意识到这一点。能主动指出这个问题并给出优化方案比如三路快排思想比闷头写完一道难题要加分得多。第三类是代码风格混乱。变量命名随意函数逻辑堆在一起不分层没有返回值约定这些都是硬伤。手撕代码本质上是让面试官评估你的代码能力是否达到工程标准如果连缩进、命名、可读性都过不了关即使逻辑对了评价也会打折。一个好的习惯是写完之后主动从头到尾过一遍代码边读边解释每一步在做什么这是在展示你具备代码评审的能力。4. 从2018年真题到今天的测试开发能力树4.1 当年的复习范围八股文的正确打开方式每次提到面试准备“八股文”这个词都会出现。我理解大家说八股文时的无奈但我的态度是八股文不是用来背的是用来建立知识骨架的。2018年准备字节测开面试时我的复习范围大致是这样的数据结构与算法数组、链表、栈、队列、哈希表、树、图的基本操作以及排序、二分、双指针、滑动窗口、递归、动态规划等算法范式计算机网络三次握手四次挥手、TCP可靠传输机制、HTTP请求响应结构、HTTPS握手过程、常见状态码含义、DNS解析流程操作系统进程与线程、进程间通信方式、死锁、内存管理、虚拟内存、文件系统的基本概念数据库SQL基础语法、连表查询、子查询、索引原理、事务隔离级别、乐观锁与悲观锁设计模式单例、工厂、观察者、策略重点是单例模式的双重检查锁写法面试中出现频率极高测试理论黑盒测试与白盒测试、等价类划分、边界值分析、因果图、场景法、错误推测法、用例设计步骤、Bug生命周期管理。正确的打开方式不是一遍遍地背诵而是对每个知识点能举出“工作中或项目里是怎么用到的”实际案例。比如单例模式你可以说在做自动化测试框架时driver对象就是单例的避免每个测试类都创建一个新的浏览器会话比如HTTP状态码你可以说在做接口自动化时断言模块会统一处理200、201、204、4xx、5xx等不同响应码。当一个概念能和你自己的项目经历挂钩你就用不着死记硬背了它已经长在你的知识体系里。4.2 自动化与工具链会用框架只是及格线2018年的测开岗位在工具链方面的要求还停留在“会用“的阶段会用Selenium写Web自动化会用Appium写App自动化会用JMeter做压测会用Postman调试接口会写基本的Python或Java测试脚本。但放在今天来看只会用框架已经远远不够了现在的要求是“能改造框架甚至自研工具”。反推回2018年那批面试题当时题目里已经种下了这个伏笔。面试官问你的不是“Selenium定位元素的几种方式”而是“如果页面元素频繁变化导致自动化脚本维护成本居高不下你会怎么解决”。这个问题现在看就是一个典型的“平台化思考”题——你可以用Page Object模式把元素定位和业务操作分离也可以做一个元素变化自动提醒的巡检机制还可以引入视觉回归测试。但在当时大多数人只会回答“用更稳定的选择器比如xpath中相对路径”这种答案只能算是基础分。所以我的建议是不管你现在是准备当面的面试还是重温过去的真题都不要停留在“我会用某个工具”这个层面。你对一个自动化框架的理解至少要达到知道它的核心架构是什么知道它在启动时做了什么初始化工作知道它如何和测试用例执行器集成知道它的断言机制和报告生成机制是怎么实现的。只有到了这个深度你在面对“你怎么优化现有测试框架”这类问题时才不至于无话可说。4.3 全流程测试思维从需求评审到线上监控最近有个热词叫“用opencode开发一个项目从需求到设计到开发到测试”我不是程序员不评判AI开发工具的具体能力和边界但它背后反映了一个趋势测试的角色正在从“开发完成后的质检员”前移为“全流程的质量守护者”。这个趋势在2018年字节的面试题里其实已经有雏形了。当时有一道高频面试题是“如果产品需要三天内上线一个新功能测试时间只有一天你会怎么做”。多数人的回答聚焦在“提高测试效率“上——用例设计精简、自动化执行、加班赶工。但分高的答案是先做风险排序和质量评估这个功能的核心链路是什么哪些功能点对用户影响最大哪些是高风险模块哪些流程可以走冒烟测试哪些必须做完整回归在时间不足时怎么和产品经理确认最低可上线标准上线后是否要安排线上监控和AB实验来兜底。这个思维模式放到今天就是完整的“测试左移”和“测试右移”需求评审阶段就介入把可测性、边界条件、异常路径的疑问在设计和编码前解决掉上线后继续监控线上指标、错误日志、用户反馈形成质量反馈闭环。2018年的面试题考察的是你有没有这个意识现在的面试题考察的是你有没有实际落地过这条链路。不管哪个阶段全流程思维都是测开工程师区别于点点点测试员的核心能力。5. 翻车经验与加分细节这些坑当年不少人踩过5.1 面试讲项目别把“做了什么”说成“接口清单”我在模拟面试和真实面试中都反复看到一个问题候选人介绍自己做的测试项目时讲成了接口清单。比如“我负责了XX系统的测试涉及用户模块、订单模块、支付模块我用Postman调了100个接口用JMeter做了压测用Selenium写了自动化脚本”。这段话信息量其实很大但听下来的感觉是“什么都有但什么都没有”。问题出在缺少“为什么”和“结果如何”。正确的讲法应该是我在这个项目中遇到了一个什么样的测试难题比如订单状态变更涉及的异步调用非常复杂测试环境经常出现数据不一致我采取了什么样的策略引入消息队列的消费延迟模拟设计了针对中间状态的断言方法最后达到了什么效果线上故障率下降了多少或者回归测试时间缩短了多少。项目经历的价值不在于数量而在于你能否完整讲出一个发现问题、分析问题、解决问题的闭环。面试官想听的是你的决策过程不是你的接口数量统计。另外一个容易踩的坑是“项目里没有你自己的思考”。有人讲自动化框架时只说“我用了Pytest加Selenium写了100条测试用例”但被追问“为什么选Pytest而不是Unittest”时就直接卡壳。你不需要用过的每一样技术都做深度研究但是写进简历的重点项目一定要能经得起追问包括选型原因、架构设计、遇到的难点和替代方案。5.2 反问环节怎么问出水平面试结尾的反问环节是很多候选人会浪费掉的机会。常见的失败反问是“请问这个岗位平时加班多吗”“请问薪资范围是多少”——这些不是不能问但在技术面阶段问会拉低面试官对你的评价。比较理想的提问策略是展示你已经在思考入职后的实际工作同时把面试官当成一个行业前辈向TA请教经验。我建议的技术面反问方向有这么几类一是问团队技术栈和测开平台建设比如“公司目前的自动化测试平台是内部自研的还是基于开源框架二次开发”二是问业务质量侧的挑战比如“信息流推荐这类业务你们在测试数据构造和结果验证上有什么沉淀”三是问岗位的成长路径比如“测开工程师在团队里的发展方向是走某个垂直领域性能、安全,还是往测开平台架构方向深入”。这些问题有一个共同点它们表明你不是在为了找一份工作而面试而是在认真思考自己进入团队后如何创造价值。5.3 心态与节奏一批次竞争激烈补录也很常见最后说一说心态问题。2018年的校招批次,尤其是“第一批”往往竞争格外激烈,因为大部分学生还在海投阶段各家公司都处在“试水”状态。如果第一次笔试或面试没通过并不代表你能力不行很可能是岗位匹配度、当时的面试状态、甚至简历排期等多种因素的综合结果。字节在那几年一直在大量快速招人后续批次和补录的机会非常多我在实际接触中见过笔试没过但过了几个月补录上岸的案例也见过一面挂了但次年春招通过的同学。所以千万不要因为一批次失利就自我怀疑。正确的做法是每次笔试面试后都做复盘记录把自己被问到的问题、没答上来的点、卡壳的瞬间都记录下来然后针对性地补缺口。我第一次参加类似的校招面试时算法题写出来了但测试设计题回答得很浅复盘后意识到自己缺少“异常流程优先”的测试习惯后面专门拿两周时间做边界值和异常场景专项训练。下一次面试再遇到同类题目时整个人的状态完全不一样。面试这种东西量变到质变的拐点往往就是在你认真复盘完两三场之后出现的。
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门