ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

京东测试开发校招笔试题深度复盘:考点、答题框架与备考攻略

京东测试开发校招笔试题深度复盘:考点、答题框架与备考攻略 “京东2019校招笔试测试开发工程师笔试题”这个话题放在现在看依然很有复盘价值。原因很简单从2019到今年互联网大厂测试开发校招笔试的核心框架没有发生颠覆性变化依然是“计算机基础 算法编程 测试设计 逻辑思维”的组合拳变的只是题目皮囊和难度微调。特别是京东这种电商业务极其复杂的公司测试开发笔试的定位从一开始就很清晰——它不指望你直接写出生产级测试框架而是考察你有没有“代码能力过关、测试思维成体系、业务理解速度快”的底子。这篇文章我就以过来人的视角把这套笔试题拆开揉碎从题型分布、考点逻辑、编程题实战、测试设计题应答框架到时间分配与备考路线完整梳理一遍。无论你是准备校招的应届生还是想转岗测试开发、想系统补基础的在职同学这篇都能帮你少走不少弯路。1. 这套笔试题的核心定位想清楚面试官在筛选什么样的人1.1 从“测试开发工程师”这个岗位名拆能力模型很多人第一次看到“测试开发工程师”这个岗位名容易把它理解成“做测试的顺便写点脚本”。这个理解在笔试阶段就会吃大亏。京东这类大厂对测试开发的定位从岗位名称的语序就能读出来先是“开发”再是“测试”。笔试环节不会直接考你“请你讲讲怎么设计测试用例”这种纯理论题而是大量考察数据结构、算法、数据库、操作系统、计算机网络这些硬核基础。原因在于测试开发的核心工作之一是搭建自动化测试平台、编写测试工具、维护测试框架这本质上是软件工程开发只不过服务的对象是质量保障体系。如果你的代码能力不过关后续做接口测试平台、性能压测工具、CI流水线集成时会非常吃力。所以这套笔试题的第一个隐藏信号是先按“开发岗”的标准筛代码能力再用测试设计题和逻辑题筛“测试思维”。两个维度都过关才能进入面试环节。很多同学只刷算法题、不准备测试理论或者只背测试理论、算法一塌糊涂都容易挂在这一关。1.2 电商业务背景对测试开发的隐性要求京东的笔试题目往往带有强烈的电商色彩。比如测试设计题喜欢围绕登录、购物车、订单、支付、优惠券这类核心电商链路出题编程题也偶尔会结合字符串处理、日志分析、库存扣减这类场景。这背后是业务复杂度决定的。电商系统的典型特征是高并发、多端协同App、H5、小程序、PC、复杂的促销规则、分布式事务、支付对账。一个订单从用户点击“提交订单”到最终“交易成功”背后经过的子系统可能超过二十个。测试开发如果对电商核心链路没有基本认知连“该测什么”都找不到方向。因此在复盘这套笔试题时不要只盯着题目本身要思考题目背后的业务场景。比如遇到“怎么测试一个购物车功能”这样的题不能只回答“加入商品、删除商品、修改数量”而是要往“价格计算是否正确满减、会员价、优惠券叠加、库存变动是否一致、并发操作是否安全、异常场景商品下架、价格变动如何提示”这些方向展开。这种思路不是天生的需要提前对电商业务有系统性梳理。2. 高频考点盘点计算机基础与算法题到底考到什么程度2.1 数据结构与算法刷题刷到什么标准才算够用京东2019校招笔试测试开发的算法题难度整体处于LeetCode中等题偏下的水平但和纯后端开发岗相比题量更少、分值占比略低更侧重基础数据结构的灵活运用。重点考察的数据结构主要是这几类哈希表解决查找、去重、计数类问题O(1)复杂度的随机访问特性是核心。字符串回文判断、子串匹配、字符统计、正则表达式简单应用。数组与双指针有序数组合并、滑动窗口、三数之和这类经典题型。链表反转链表、判断环、合并有序链表。栈与队列括号匹配、单调栈解决“下一个更大元素”问题。二叉树前中后序遍历、层序遍历、二叉树深度、最近公共祖先。动态规划也会考但不会出太难的状态转移常见的是背包问题变体、最大子序和、爬楼梯这类入门级DP。我给大家一个可量化的刷题标准如果把LeetCode热题HOT 100刷完并且每道题都能做到“看到题目就有思路、十五分钟内写出无Bug代码”那京东这套笔试的算法部分基本是稳的。不需要去死磕难题压轴题测试开发岗的算法筛选逻辑是“基础扎实、代码能力过关”不是“竞赛选手级思维”。实操中我见过太多同学在算法题上犯一个策略性错误——花大量时间刷难题结果基础题反而容易出错。这套笔试题的算法部分看起来不难但坑点往往在边界条件上比如数组越界、字符串为空、链表只有一个节点、整型溢出。刷题时一定要养成习惯每个算法题提交前花一分钟过一遍边界条件。注意事项笔试环境通常不提供本地IDE的智能提示和调试功能代码是写在网页上的。平时练习时就要适应“无补全、无报错提示”的裸写环境否则考场上会因为手写HashMap的 equals 和 hashCode 而浪费大量时间。2.2 计算机网络与操作系统经典八股这样答不丢分计算机基础和网络知识在笔试题中通常以选择题形式出现题量不大但覆盖面广。2019年这套题的重点集中在网络方面必考的是TCP和HTTP。TCP三次握手、四次挥手的状态变迁、TIME_WAIT为什么存在、TCP和UDP的区别这些是雷打不动的题目。HTTP侧重点是HTTP/1.0、HTTP/1.1、HTTP/2.0的区别常见的状态码200、301、302、403、404、500、502、503含义以及HTTP无状态特性如何通过Cookie和Session解决。操作系统方面重点在进程与线程的区别、进程间通信方式管道、消息队列、共享内存、信号量、Socket、死锁产生的四个必要条件互斥、持有并等待、不可剥夺、循环等待、虚拟内存与页面置换算法。这些内容看起来是纯背的八股但笔试会换着花样出。比如不直接问“死锁的条件是什么”而是给一个多线程加锁场景问你“这段代码是否可能死锁为什么”。所以在复习网络和操作系统时不要只背结论要能说出“为什么”。我举个例子TCP为什么要三次握手而不是两次如果只有两次握手服务端无法确认客户端的接收能力是否正常。通俗地讲A和B打电话A说“你能听到吗”B回答“能听到”但A无法确认B能不能听到自己的声音所以还需要B再确认一次“你也能听到我吗”。这种理解在笔试选择题中能帮你快速排除错误选项。2.3 数据库与Linux笔试中藏得最深的“送分题”大多数同学复习测试开发笔试时会把重心放在算法和网络上容易忽略数据库和Linux。但实际上这两块往往是拉开分数差距的地方。因为电商业务的核心就是数据和数据处理测试开发在日后的工作中必然要写SQL验证数据、上服务器查日志。数据库的考察集中在SQL编写和索引原理。笔试题里常见的是给出两张表比如用户表、订单表要求写出查询语句涉及GROUP BY、HAVING、JOIN、子查询、聚合函数。索引方面主要考察聚集索引与非聚集索引的区别、最左前缀原则、索引失效场景。事务方面是ACID特性和隔离级别。Linux的考察一般是选择题包括常用命令的功能——ls、cd、grep、awk、sed、find、top、ps、netstat、chmod以及日志查看、进程管理、端口查看这些场景化命令。这里有一个很实用的复习思路不需要背所有命令的参数而是记场景。我给大家一个自测清单“查看某个Java进程的CPU和内存占用”应该用什么命令组合ps aux | grep java或top“查看8080端口被哪个进程占用”netstat -tunlp | grep 8080或者lsof -i:8080“统计一个日志文件中某个关键字出现的次数”grep -c “关键字” xxx.log“将一个目录下所有文件的权限改成755”chmod -R 755 目录名这些命令在笔试中属于白送分但前提是你真的在Linux环境里操作过。只看不练考场上一旦选项里有相近参数干扰很容易选错。3. 编程题实战拆解一道典型题从读题到AC的完整过程3.1 题目复盘字符串处理类题型的通用解法当年这套笔试的编程题里有一道很典型的字符串处理题大概是这个意思给定一个字符串找出其中每个字符出现的次数并按出现次数从高到低输出如果次数相同则按字符ASCII码升序输出。这个题目在原题基础上可能换成“统计日志中每个IP的访问次数”“统计一个文本中每个单词的频率”之类的皮但核心解法完全一致。这是测试开发笔试里最典型的场景——日志分析、数据统计因为测试工程师经常需要统计测试结果、分析错误日志。拿到题目后我的思路是三步走第一步明确输入输出。输入是一个字符串或日志文本输出是一个排序后的字符-次数列表。确认题目是否包含空格、数字、大小写敏感等细节这决定了统计时需要不需要降噪处理。第二步选择数据结构。需要O(1)的插入和查找能力用哈希表。Java里是HashMapC里是unordered_mapPython里直接就是dict。第三步排序。统计完频率后对条目进行自定义排序。排序规则是“次数降序ASCII升序”。核心代码用Java写出来大概是import java.util.*; public class Main { public static void main(String[] args) { Scanner sc new Scanner(System.in); String input sc.nextLine(); MapCharacter, Integer freq new HashMap(); for (char c : input.toCharArray()) { freq.put(c, freq.getOrDefault(c, 0) 1); } ListCharacter chars new ArrayList(freq.keySet()); chars.sort((a, b) - { int countCompare freq.get(b) - freq.get(a); if (countCompare ! 0) return countCompare; return a - b; }); StringBuilder sb new StringBuilder(); for (char c : chars) { sb.append(c).append(:).append(freq.get(c)).append(\n); } System.out.print(sb.toString()); } }这段代码有两个关键点值得说。一是getOrDefault的用法。很多同学会先判断containsKey再put代码多了三行还容易出错用getOrDefault一行搞定既清晰又不会踩空指针。笔试阅卷虽然不直接按代码风格打分但逻辑清晰能降低自己写错的风险。二是排序比较器的返回值。这里不能直接写freq.get(b) - freq.get(a)就结束因为当频次相同时还要按ASCII升序。很多同学会漏掉第二层比较规则导致在“同频次”这个边界条件下丢分。实操心得这种“统计排序”的题型本质上是在考察哈希表的运用和自定义排序。测试开发日常写自动化测试脚本时统计测试结果、聚合报告数据是高频操作所以这个知识点几乎是必考。建议把Java中的HashMap、TreeMapPython中的dict和sorted函数都熟练掌握至少三分钟能把主逻辑手写出来。3.2 复杂度分析与边界条件比写出答案更重要的事笔试编程题除了要求答案正确还会通过复杂度和边界条件来筛选候选人的工程素养。很多同学能写出朴素解法但达不到最优复杂度或者代码在特殊输入下崩溃这些都是扣分点。针对上面那道题最常用的解法是“哈希表统计 排序”时间复杂度O(n k log k)n是字符串长度k是不同字符数量空间复杂度O(k)。这个复杂度在笔试中已经完全达标。如果你用了双重循环遍历来统计字符次数时间复杂度是O(n²)当字符串长度达到10⁵级别时必然超时。边界条件方面需要意识到这些场景输入字符串可能为空此时应输出空结果而不是抛异常。字符串可能全部是同一个字符排序逻辑依然要正确。可能包含空格、标点符号——如果题目标明只包含字母就可以放心按字母处理如果不限定不能假设输入是纯字母。如果输入包含中文需要确认题目是按字符还是按字节处理Java的char和UTF-16编码在这里有坑。说白了笔试的编程题考察的从来不只是“会不会”而是“在约束条件下能不能完整、健壮地解决”。建议每做完一道题都习惯性地在注释里或草稿纸上列出至少三个边界输入并手动验证结果这个习惯能帮你避免大量低级失误。3.3 编程语言的选型策略用你最稳的语言而不是最酷的语言京东笔试的编程题一般支持Java、C、Python等主流语言。我的建议非常明确用你最熟悉、最稳定的那门语言而不是临场尝试新语言。如果你在Java和Python之间纠结给你一个判断标准日常练习和刷题主要用Java笔试就写Java因为Java的集合类框架在排序、哈希等场景下非常好用而且你不需要额外的“语言心法”。如果Python用得更熟写Python也没问题代码更短调试更快。但要注意Python的输入输出处理方式、运行效率边界。Python在某些OJ环境下跑大数据量可能更慢如果题目有严格的时间限制需要评估是否够用。最忌讳的是笔试前一周临时换语言。我见过有同学刷题一直用Python到笔试时觉得Java的岗位更对口临时换Java写代码结果HashMap的遍历方式都记错了白白丢分。语言只是工具关键是你的逻辑和工程意识不是编辑器里那块语法高亮有多华丽。4. 测试设计题才是笔试分水岭用例设计的高分应答框架4.1 场景型测试题从登录功能到购物车怎么答才算完整京东的测试开发笔试题和纯开发岗笔试题最大的区别就是会出现测试设计题。这类题的典型问法是“请设计登录功能的测试用例”“如何测试一个购物车功能”“给你一个二维码扫码支付功能你怎么测”。很多第一次接触这类题的同学答案写得毫无章法——想到什么写什么写了三五条就停了。比如“输入正确的用户名密码可以登录”“输入错误的提示报错”完了。这种答案在阅卷人眼里等于没答。测试设计题考察的核心是你的思维完备性而完备性来自方法框架不来自灵光一现。以“测试登录功能”为例一个合格的回答应该分层展开功能测试层正确的用户名密码登录成功用户名正确密码错误提示明确信息密码正确用户名不存在提示用户不存在用户名为空、密码为空、两者都空时分别检查前端校验和后端校验连续输错密码多次是否会锁定账号登录后跳转页面是否正确登录状态在刷新、关闭浏览器后是否保留。接口与数据层密码在传输过程是否加密HTTPS提交登录请求的参数是否完整用户输入的密码是否包含特殊字符、超长字符串、SQL注入关键词时系统是否安全处理同一账号的并发登录是否互踢或提示。兼容与体验层不同浏览器、不同操作系统、不同移动端尺寸下的页面显示和功能是否正常弱网、断网、超时场景下是否有合理的加载提示和错误提示。安全与异常层验证码是否正确校验且一次有效是否可绕过前端直接调用后端接口登录后的Session或Token有效期与续期机制是否合理。这样答下来一题覆盖了功能、接口、兼容、安全、异常至少五个维度阅卷人一眼就能看出你具备系统性的测试思维而不是想到哪写到哪。重要操作建议考场上时间有限不需要铺开写每个分支的每个细节但一定要把“维度”写全。先写大分类再在每个分类下补两三个具体用例。这样告诉阅卷人“我有完整框架细节也懂”比只写十个具体用例但没有分类的答案得分高很多。4.2 测试用例的标准维度功能、接口、兼容、性能、安全一个不能少结合京东电商业务的笔试特点测试设计题的范围通常围绕订单、支付、优惠券、购物车、商品搜索这些核心场景。无论具体题目是什么我建议你心里固定一套“五维测试模型”维度考察重点电商场景典型例子功能测试业务逻辑正确性商品加入购物车后总价是否随数量正确累计接口测试数据传递和异常处理下单接口在商品库存为0时是否返回友好提示兼容测试多端多环境适配支付功能在安卓/iOS/小程序/H5上行为是否一致性能测试响应速度和并发能力秒杀场景下5000并发用户同时提交订单是否出现超卖安全测试数据保护与权限控制未登录用户是否可以直接通过URL访问订单详情这个模型可以应对绝大多数场景型测试题。答题时先写出五个维度再针对题目的具体业务在每个维度下补充2到3个有针对性的用例整个答案的完整性立刻上一个档次。另外提醒一句别忽略“隐式需求”。比如优惠券功能除了“领券、用券、券过期”这些正常流程还要考虑“用户已领取但未使用再次领券是否会提示”“订单取消后优惠券是否返还”“优惠券和满减活动叠加时价格计算是否按最少金额给用户”这类容易出Bug的隐性场景。测试思维的高低往往体现在能不能主动发现这些隐性需求上。4.3 开放性思维题测试同学怎么展示自己的软实力除了场景测试题笔试题里偶尔会出一两道开放性问题比如“你觉得测试开发工程师的价值是什么”“你怎么看待自动化测试的投入产出比”“给你一个不熟悉的功能你如何快速开始测试”。这种题没有标准答案但恰恰是展示思维深度的机会。答这类题时要避免两个极端一是写空话套话比如“保证软件质量提高测试效率”二是偏激观点比如“自动化测试能替代手工测试”。我的应答思路是“价值分层法”。把测试开发的价值拆成三层来回答第一层是保障质量通过系统性的测试设计发现Bug阻止线上故障发生。第二层是提升效率通过自动化脚本、测试平台替代重复劳动让测试从“人工点点点”变成“每次提测自动跑一遍回归”。第三层是赋能研发通过质量数据反馈、风险预警、线上监控帮助研发团队更早发现问题和更精准定位问题。这样答的逻辑是先基础、后进阶让别人看到你不是只会点页面的功能测试而是站在质量保障体系层面思考的测试开发。5. 实战时间分配与心态管理把有限时间花在刀刃上5.1 不同题型的答题顺序与时间配比京东校招笔试的总时长一般在90到120分钟题型分布大概是选择题30到40道、编程题2到3道、测试设计题1到2道。计算下来每道选择题平均只能分到约1分半钟编程题每道约20分钟测试设计题每道约15分钟。我给自己定过一套时间分配策略实测下来比较稳第一优先级是编程题因为分值最重且最需要整块时间思考。我的习惯是开考后先花两三分钟快速浏览所有题目如果编程题里有明显很简单的送分题比如字符串反转、数组求和先动手把它写掉确保保底分拿到。第二优先级是测试设计题这类题不需要连续多次思考只要框架清晰就能写得又快又全适合在思维还没疲劳的前半段完成。第三优先级才是选择题。选择题虽然量大但总有一个大概的知识边界会就会、不会就快速标记跳过。不要在不确定的题上耗太久一道题纠结超过两分钟就直接影响整体节奏。整体时间配比建议是编程题占40%测试设计题占25%选择题占25%剩余10%用于检查和应对突发情况。5.2 当场发现自己不会做时怎么“抢分”笔试不是每道题都必须会。遇到完全没思路的题时以下几个“抢分”技巧很实用编程题没思路不要直接交白卷。写一个暴力解法的框架至少能通过部分测试用例拿部分分数。很多在线笔试系统是按通过的测试用例比例给分的暴力解往往能过掉小数据量的用例。同时在注释里写下你的思路即使代码不完整阅卷人也能看到你的思考路径。选择题不确定用排除法去掉明显错误的选项在剩余选项中猜一个不要空着。很多公司笔试的计分规则是不倒扣分或者空着按零分算猜一个比不填多一线机会。测试设计题没思路把五维测试模型的框架先写上。即便你不熟悉具体业务只要每个维度下有具体用例方向就能拿到基础分。例如不熟悉“秒杀”功能但你可以从并发超卖、页面提示、库存一致性这些方向入手写出来就比空白强得多。5.3 笔试结束到面试之间的复盘方法笔试交卷只是第一步考完立刻复盘的价值甚至高于考前突击。我的习惯是笔试结束后当天趁记忆还新鲜把每个题型的考点整理到备忘录里。具体做法是给自己提三个问题第一选择题里有哪些知识点我拿不准这些大概率是面试时被追问的高频点。比如你选择题里遇到了“数据库隔离级别”拿不准那么面试前一定要把四个隔离级别以及对应的脏读、不可重复读、幻读问题彻底吃透。第二编程题我的解法是最优复杂度吗如果笔试时只写出了暴力解法面试前把这道题的最优解法重新写一遍因为面试官很可能会让你“讲一下笔试最后一题的解题思路”。第三测试设计题我是否遗漏了关键维度把自己写的答案和五维模型对比缺了哪块补哪块。面试时被问“你还有什么补充吗”这块复盘内容就是现成的加分材料。这套复盘方法的本质是把笔试从“一次性的筛选”变成“给面试做预演”。大厂面试官非常喜欢针对笔试内容进行追问你如果能在复盘中把题目吃透面试时就会有明显的“提前准备过”的优势。6. 从笔试到面试备考路线的复盘与建议6.1 不同基础的同学怎么规划复习周期准备时间的长短取决于你当前的底子。我把它分成三类你可以对号入座。科班出身、数据结构与操作系统基础尚可的同学建议提前一个月开始准备。前两周用来过LeetCode热题HOT 100中的简单和中等题每天3到5道注重独立写出完整代码。第三周补网络、操作系统和数据库知识以选择题自测为主。最后一周做整套真题模拟严格按照笔试时长来训练。非科班但代码能力过关的同学需要提前一个半月以上。除了算法需要额外花时间系统补计算机网络和操作系统的基础理论。笔试选择题对非科班同学最不友好因为八股知识没系统学过只能靠背而背的前提是先理解整体框架。数据库中的SQL语法也必须练习到“手写”不卡壳的程度。已经在实习、有测试经验但代码偏弱的同学建议算法优先。你的测试设计题大概率没问题因为工作中每天都在写用例。但笔试的算法题不会因为你有工作经验就降低难度反而可能要求更高。每天必须保证两小时以上的算法手写练习直到能独立写出中等难度的常规题。6.2 备考资料与工具清单这套资料清单是我自己总结的核心逻辑是“真题 专项 模拟”三层结构算法方面LeetCode或牛客网刷题是标配。重点刷数组、字符串、哈希表、链表、栈、队列、二叉树、基础动态规划。不需要买额外纸质书把典型题总结成自己的“题解笔记”比任何教材都有效。计算机基础方面推荐看两本经典书一本是《图解HTTP》把网络各层的核心概念快速过一遍另一本是《深入理解计算机系统》的虚存、进程线程、并发章节不用全读挑笔试常考的部分针对学习。如果时间紧张直接看牛客网或各类题库的“面经/笔经”汇总效率更高。数据库方面把SQL的增删改查、连表查询、分组聚合、子查询练熟练透再做几套索引和事务相关的选择题。推荐用在线SQL练习网站实操每天写十道SQL题大概一周就能形成肌肉记忆。测试设计题的准备不需要刷大量题目核心是吃透一套“万能框架”。我在上面给出的“五维测试模型”就是一个起点把它应用到登录、购物车、订单、支付、物流、优惠券、搜索、推荐这些电商核心模块上每个模块设计10到15个用例基本上笔试中的测试设计题就全覆盖了。6.3 最后聊聊笔试的“弦外之音”很多人觉得笔试只是面试的敲门砖过了就行分数不重要。这个看法不完全对。对于京东这类大厂笔试成绩通常会影响后面的面试定级和谈薪空间同时面试官手里有你的笔试答卷会根据答题情况现场追问。所以笔试的目标不是“低分飘过”而是尽量拿高分拿高分的关键不是做对每一道题而是在有限时间内展现出你的能力全貌。我个人的体会是校招笔试的筛选逻辑和企业内部做技术选型的逻辑很像——不是找“完美的候选人”而是找“在约束条件下最优的候选人”。时间有限、题目有难有易、现场环境有压力谁能合理分配精力、稳定输出、不犯低级错误谁就能脱颖而出。这套能力会直接迁移到你的工作中。测试开发这个岗位本质上就是在“资源有限、时间有限、需求无限”的约束下找到最优的质量保障方案。从这个角度看笔试其实从第一分钟开始就已经在模拟你未来的工作方式了。
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进