提到测试开发岗的笔试,很多人第一反应是“不就是刷题嘛”。说实话,我见过不少候选人拿着LeetCode从头刷到尾,结果笔试依然挂掉,问题就出在没想明白一件事——测试开发岗位的笔试题,和纯开发岗位的笔试题,出题逻辑和考察重点完全不一样。今天借京东2019春招测试开发类试卷这个话题,聊聊测试开发岗笔试到底在考什么、为什么这么考、以及怎么准备才是有效路径。
这份试卷放在今天看,依然很有参考价值。京东的业务复杂度摆在那里——商城、物流、金融、生鲜多条线并行,测试开发不仅要会写代码,还要懂业务逻辑、懂数据流转、懂线上问题排查。所以它的笔试题型分布、考察深度,基本就是一线互联网大厂测开岗的典型样本。无论你是准备春招秋招的应届生,还是想从功能测试转测试开发的在职人,拆解这份试卷都能帮你少走很多弯路。
1. 从试卷结构反推岗位能力模型:京东测开笔试到底在筛什么人
1.1 题型分布背后的岗位定义
京东2019春招测试开发类试卷,整体可以分成几大块:客观题(单选多选)、编程题、SQL题、场景设计题。这个结构在测开岗笔试里非常典型,和纯后端开发岗有明显区别——纯开发岗一般是客观题加两到三道算法题,算法题比重很大;测开岗的编程题数量相对少一些,但会额外考察数据库、Linux、测试用例设计这些维度。
为什么这么设计?因为测试开发的日常工作场景决定了它需要的是“多边形战士”。我举个实际例子:一个电商订单系统的接口自动化测试,你需要做几件事——先写脚本调接口,这需要编程能力;参数要造数据,这需要会写SQL;接口报错了要查日志,这需要Linux操作能力;出了问题要判断是前端还是后端、是网络还是服务端,这需要网络基础;最后整个测试策略怎么定、哪些场景优先覆盖,这需要测试理论功底。所以每一类题型都不是随便出的,而是对应一个真实的日常工作场景。
1.2 代码题占比为什么没有想象中高
有些同学拿到试卷可能会觉得“编程题不够难啊,比我刷的LeetCode简单多了”。这其实是个认知误区。测开岗考察编程题,目标不是筛出算法竞赛选手,而是确认你具备“能独立写测试工具、能看懂被测系统的代码逻辑”的工程能力。代码题难度控制在LeetCode简单到中等,恰好说明这个岗位的核心竞争力不在算法本身,而在测试思维和业务理解。
但这里有个隐藏加分点:代码题的代码规范和边界处理。我记得这类试卷里往往会出现字符串处理、链表操作一类的题目,看起来不难,但你把代码写得结构清晰、异常处理完整,和写得能跑就算赢,在阅卷人眼里是完全不同的评价。笔试不只看结果,也看代码习惯,因为团队招人是要一起协作的,代码风格太差后面review时大家都会很难受。
2. 高频考点逐项拆解:哪些题一定要稳稳拿分
2.1 编程题:考的不是算法,是工程中的“最小可用能力”
测开笔试中的编程题有几个高频方向:字符串操作(反转、匹配、去重)、链表操作(反转、环检测)、数组处理(排序、查找)、简单动态规划(最大子序列和这类)。以字符串反转这类题为例,你至少应该有三层思路:最简单的是直接用语言内置API;进阶一点的是双指针原地交换;再进一步可以考虑如果字符串里面有Unicode字符怎么处理、内存受限怎么处理。
我建议备考时不要只背题解,要按“暴力解→优化解→工程化解”三层来准备。比如“判断一个字符串是不是回文串”,暴力解法是反转后比较;优化解法是双指针从两端往中间扫;工程化解法是考虑忽略大小写、忽略非字母数字字符、处理null值。面试官后续追问的往往是这第三层,因为这是测试开发日常最需要的思维方式——把各种边界条件都考虑到。
2.2 数据库题:造数、查数、验数是测开日常三件套
数据库在测开笔试里的权重非常高。京东这类电商业务,数据表之间关联关系很复杂,笔试里的SQL题通常涉及多表关联、聚合查询、子查询、分组排序。举个例子,有一个典型题目是“查询每个用户的订单总金额,按金额降序排列,只要消费金额大于1000的用户”。这道题考察的点就很清晰:inner join还是left join、group by的正确使用、having和where的区别、order by的排序方向。
我在实际工作中,SQL几乎是每天都要写的。接口测试要造测试数据、要校验数据库里的落库结果、要清理脏数据;线上问题排查时,要通过SQL快速定位数据异常是哪个环节导致的。所以SQL不是“笔试过了就行”的东西,而是测开的基本功。备考时建议在本地装个MySQL或者直接用在线SQL练习平台,把多表查询练到手写无障碍。
结合我在工作中的经验,实际执行过程中SQL语句经常需要写成存储过程配合脚本使用,我在测试环境自建数据时经常会先写一段类似的SQL构造一批订单数据,再通过JMeter批量调用接口完成全链路造数。比如一个典型的订单数据构造语句,我先查出现有用户表数据量,确保造数范围不重叠,然后用LEFT JOIN关联订单表筛选出未下过单的用户,通过批量UPDATE命令一次性完成数据初始化。
-- 构造测试数据示例:为近30天未下单的用户创建一笔测试订单 SELECT u.user_id, u.user_name FROM t_user u LEFT JOIN t_order o ON u.user_id = o.user_id AND o.create_time >= DATE_SUB(NOW(), INTERVAL 30 DAY) WHERE o.order_id IS NULL LIMIT 100;2.3 Linux命令题:日志和进程是排查线上问题的两条腿
Linux命令在测开笔试中也是必考项。考察方向很聚焦,基本都是围绕“线上问题排查”这个场景展开的。比如:日志文件太大,怎么只查看最后100行?答案是tail -100 app.log。进程卡住了,怎么找到对应的进程号?答案是ps -ef | grep java或者top。端口被占用了,怎么找到占用进程?答案是netstat -tunlp | grep 8080。日志里报错太多,怎么统计某个异常出现的次数?答案是grep "NullPointerException" app.log | wc -l。
这些命令看起来简单,但实际用起来有很多细节。我曾经在排查一个接口超时问题时,在测试环境反复复现不了,后来上生产环境看到服务器负载才发现,问题只在高并发时段出现,而测试环境根本没有那个量级。这个教训让我意识到,测开不仅要会看日志、会查进程,还要能结合环境差异去分析问题根因。另外还有一点特别重要——线上日志往往分散在多台机器上,单机看日志挑不出规律,这时候就需要用awk做个简单的统计聚合。笔试虽然不要求你现场写脚本,但你把awk的常见用法掌握好,在面试时自信地说出来,会是很加分的亮点。
2.4 网络与协议:接口测试的理论地基
网络基础是测开笔试中另一个重要模块。反复出现的考点包括:TCP三次握手和四次挥手的过程、HTTP和HTTPS的区别、GET和POST的区别、常见的HTTP状态码含义、Cookie和Session的区别。这些知识点看起来偏理论,但实际上每一个都对应着实操场景。
拿接口测试来说,你做接口测试时用Postman发请求,就要理解GET和POST在语义上的本质区别——GET用于获取资源,POST用于提交数据;GET参数放在URL上,POST参数放在请求体里。再比如你压测一个秒杀接口,发现大量请求堆积在TIME_WAIT状态,这时候如果你懂TCP四次挥手的状态流转,就能快速判断是连接池配置问题还是服务端主动关闭连接导致的。
我建议这块的备考方式不是死记硬背状态码表,而是结合抓包工具去理解。你在浏览器开发者工具里随便打开一个页面,看看Network面板里的请求,哪些是200、哪些是304、哪些是404,再对照请求头和响应头,比单纯背书有效得多。
2.5 测试用例设计题:拉开分差的关键题型
测试用例设计题是测开笔试中的“分水岭”。见过一段真实的笔试题目:针对购物车页面的“删除商品”功能,设计测试用例。这类题目没有标准答案,但答题思路的差异直接反映出一个人的测试功底。
低分答案往往是这样的:点删除按钮,商品被删掉——通过。这样的答案根本没入门。高分答案应该从功能、兼容、性能、安全、异常等维度全面展开:
- 功能维度:删除单个商品、批量删除、删除最后一件商品、删除已选中商品、删除未选中商品
- 异常维度:网络断开时删除、删除时商品已下架、删除时库存为0、删除接口超时、重复点击删除按钮
- 数据一致性:删除成功后购物车角标数量是否正确、删除的商品是否从结算列表同步移除
- 兼容维度:不同浏览器、不同手机型号上的表现
- 性能维度:购物车有50件商品时删除操作是否流畅
- 安全维度:未登录状态下能否删除、伪造请求能否删除他人购物车商品
这就是典型的测试思维。我在团队里面试候选人时,特别爱看用例设计题的回答,因为它是纸面上最能体现候选人多维思考能力的部分。而且它不靠突击能练出来,需要平时就养成了“破坏式思维”——拿到任何功能,第一反应不是验证它能用,而是想方设法找到它会出问题的场景。
3. 从笔试到面试:试卷映射出的技术栈与业务sense
3.1 自动化测试工具链:从Selenium到接口测试平台
笔试过了之后,面试环节一般还会深入考察自动化测试的实操能力。京东测开岗位的技术栈主要有两条线:UI自动化以Selenium为主,接口自动化以Python+requests或者Java+RestAssured为主。近年很多团队在建设自研的接口测试平台,核心逻辑就是把接口用例维护在平台上,通过配置参数化、断言、数据驱动来实现自动化回归。
我在实际项目中推荐过一个相对轻量但很实用的落地组合:pytest框架做测试用例组织和管理,requests库发送HTTP请求,pytest-html生成测试报告,再配合Jenkins做定时任务。用这套组合,一个接口的自动化测试用例,从编写到跑通大概需要20分钟。对于中小型项目来说,这个组合足够支撑日常回归,而且没有额外的平台维护成本。但如果团队规模大、接口数量多,就要考虑建设接口测试平台了,逻辑是相通的——用例数据化、执行自动化、报告可视化。
3.2 电商业务场景:优惠券、库存、秒杀、订单状态流转
京东是电商公司,笔面试里自然会涉及电商业务的理解。测开不能只懂技术不懂业务,这是测试岗位和开发岗位一个很大的区别。开发可能只负责其中一个微服务模块,但测试需要理解整个业务链路,知道一个用户从下单到收货经历了哪些环节、每个环节的数据是怎么流转的。
电商业务里那些高复杂度场景,基本都是测试的重点。优惠券叠加就非常典型:一张满减券和一张折扣券能不能叠加?叠加时先算哪个?如果优惠后金额出现小数怎么处理?订单金额为0时能不能支付?还有库存扣减——用户下单时扣库存还是支付时扣库存?超卖问题怎么防止?Redis预扣库存和数据库实际扣减的最终一致性怎么保障?秒杀场景下,用户疯狂刷新页面、重复提交订单,幂等性怎么设计?这些都是测试用例设计的高频素材,也是面试官判断你业务sense深浅的重要依据。
3.3 质量保障思维:测试开发不等于“写自动化”
聊到测试开发,很多人会把注意力全部放在“开发”两个字上,忽略了“测试”才是定语。随着测试开发岗位越来越热,有些候选人给我一种感觉——他们把自己定位成写代码的,自动化框架搭得很漂亮,但问到“你这个项目当前最大的质量风险是什么”,反而答不上来。这就是本末倒置了。
测试开发的本质是“用工程手段解决测试问题”,而不是“把测试做成开发”。质量保障思维体现在什么方面?比如你做接口自动化,不是把接口用例录进去就完事了,你要去分析哪些接口适合自动化回归、哪些接口变更频繁不适合写死用例、自动化用例跑挂了怎么快速定位是环境问题还是代码问题还是数据问题。再比如你在制定测试策略时,要能根据需求变更频率、影响范围、风险等级,决定冒烟测试、全量回归、探索性测试怎么安排。这些是笔试和面试都很难考到、但实际工作中每时每刻都在用的能力。所以备考时不要只学技术,要刻意训练自己从质量角度思考问题的习惯——每做一个测试工作,先问自己一句“这件事对保障质量到底有多少帮助”。
4. 一份可落地的测试开发备考路线
4.1 刷题之外的SQL专项训练
如果你现在准备测开笔试,我强烈建议不要只刷算法题,更要花时间练SQL。我说的练不是看题解,而是真正在本地把库建起来、把数据插进去、把查询写出来、看到结果。为什么会这么强调?因为我在面试中遇到过太多候选人,代码题写得很好,但手写SQL语句时连left join和inner join都分不清。这种候选人给我的感觉就是“准备错了方向”。
SQL专项训练可以分阶段:第一阶段是单表查询,把where、group by、having、order by、limit这些搞熟;第二阶段是多表关联,搞清楚inner join、left join、right join、full join的区别;第三个阶段是子查询和窗口函数,比如row_number() over(partition by ...)这样的分析函数,在实际测试中做数据去重和排名场景非常好用。每个阶段一天就能练完,一周时间SQL完全能应付笔试和日常工作了。
4.2 从0到1搭建一个接口自动化项目
测开面试几乎是必问项目经历的,而最好的项目经历不是“我参与了XX项目的测试”,而是“我从0到1搭建了一套接口自动化测试体系”。这个项目的搭建过程其实是有固定套路的:找一个开源项目或者公司现有系统,梳理出核心接口列表,用Python+requests封装一个简单的接口测试框架,设计用例数据管理和断言机制,接上Jenkins做持续集成,最后形成一份测试报告。
我在工作中就是按这个套路一步步搭建测试框架的。第一步先定义接口请求的公共方法,把get、post请求封装成一个类,统一处理请求头、超时、重试和日志;第二步实现断言机制,对接口返回码、关键字段、数据库落库结果做自动化校验。实际工作中我发现,最花的功夫其实是在断言上,因为很多接口的返回结构非常复杂,一个响应体嵌套多层JSON,校验逻辑写不好就非常冗余。我的做法是先用递归的方式遍历JSON全部字段,再对关键业务字段做专门的断言方法,这样既保证了覆盖度,也保证了维护时的可读性。整个过程大概两周能完成一个能演示的版本,面试时把这个项目的设计思路、踩过的坑、优化过程讲清楚,比任何八股文都有说服力。
4.3 用例设计能力的日常训练法
用例设计能力怎么练?这里分享一个我一直在用的方法——“产品说明书拆解法”。你用任何App,小到计算器、大到电商平台,打开它的功能介绍页,每读一个功能,就在脑子里列出这个功能的测试用例要点。比如看到一个社交App的“朋友圈仅三天可见”功能,你就要想到:设置后朋友看到什么界面、非朋友看到什么、自己的视角是什么样、设置前发的朋友圈是否受影响、不同时区的用户看到的时间点是否一致、取消设置后是否立即恢复……坚持一段时间,用例设计能力会有明显提升。
笔试时碰到用例设计题,回答框架建议用“总分式”:先说明测试范围(功能、兼容、性能、安全、异常),再逐项展开具体用例,最后补充说明优先级和风险点。这样结构完整且有层次感,阅卷人一眼就能看出你的测试思维。
5. 笔试面试高频翻车点与应对策略
5.1 笔试翻车点速查表
| 翻车点 | 具体表现 | 应对策略 |
|---|---|---|
| SQL关联方向用错 | 需要left join用了inner join,导致数据被过滤 | 先明确以哪张表为主表,主表数据必须全部出现在结果中就用left join |
| 编程题边界忽略 | 只处理正常输入,空字符串、null、超大值没考虑 | 写完代码后面试时主动补充边界情况,展示工程思维 |
| 网络概念混淆 | GET和POST本质区别说不清、常见状态码记不住 | 结合抓包工具和实际接口测试场景记忆 |
| 用例设计没层次 | 一上来就写具体用例,没有先划分测试维度 | 按照功能、异常、性能、安全、兼容等维度先搭框架 |
| Linux命令不熟 | 只记得几个常用命令,遇到组合场景就卡壳 | 每天花10分钟在虚拟机里练习管道、重定向、awk组合使用 |
5.2 面试官追问时怎么应对
笔试通过后的面试,测试开发岗一般会有两到三轮技术面。面试官追问的方式通常不是“你做过什么”,而是“你做的过程中遇到什么问题、怎么解决的”。这里有一个很多候选人会踩的坑——项目经验讲得太顺利,听起来像背稿子,面试官一追问细节就露馅。
我的建议是准备项目介绍时,按“背景→动作→结果→反思”四段式来组织。重点是“反思”部分,主动说出项目里做得不够好的地方以及后续怎么改进,这比单纯展示成绩更能让面试官信任你的真实参与度。比如可以说“我当时做的自动化用例稳定性只有80%,跑一次挂几个,后来我分析了挂掉的原因,发现主要是测试数据污染和等待时间设置不合理,把这两个问题解决后稳定性提升到了95%”,这样的回答既真实又能体现你的分析和解决能力。
另外还有一个加分技巧——面试官问到你不会的内容时,不要慌着说不知道。你可以把问题拆解一下,把你理解的部分说出来,然后说“这块我了解得不够深入,但我理解大概是XX的原理,后续我会重点补充”。这个反应展示的是你的学习能力和逻辑推导能力,比硬答或者沉默好得多。
写在最后
回到京东这套2019春招测试开发类试卷,它的价值不在于“背下这几十道题”,而在于帮我们看清楚一个事实——测试开发岗位的考察,本质上是“工程能力+测试思维+业务理解”的三位一体。代码能力只是入场券,拉开差距的是你用测试思维解决实际问题的能力。
我个人见过太多备考测开的同学,把精力全部扑在算法刷题上,结果笔试过了、面试挂在项目深挖环节;也见过有人技术能力很强,但用例设计一塌糊涂,暴露出最基本的测试素养缺失。所以如果你正在准备测开岗,我建议按这条线铺开:编程基础保持手感、SQL练到条件反射、Linux命令融入日常操作习惯、用例设计勤加训练、再拿一个自动化项目兜底。这条路走扎实了,不管是京东还是其他大厂,测开笔试面试都没有想象中那么难。