前阵子帮学弟复盘网易2020校招测试开发工程师正式批的笔试,发现不少人对测开笔试的理解还停留在“比开发简单、考考基础就行”的层面。结果一到实际做题就懵了:既要写代码,又要补测试用例,还要分析TCP为什么粘包、死锁怎么产生、SQL为什么走不上索引。这篇文章我就以网易这场正式批笔试为样本,把测试开发笔试到底考什么、怎么准备、现场怎么避坑,一次讲透。全文适合正在准备校招测开岗的应届生,也适合想从功能测试转测试开发、想系统补基础的同学。
1. 先拆透这场笔试:测开岗到底在筛什么人
1.1 笔试在招聘流程中的定位与筛选逻辑
校招的流程一般是简历筛选、笔试、技术面、HR面。笔试放在简历之后第一关,它的作用不是选“最优秀”的人,而是快速筛掉“基础有明显短板”的人。网易这种大厂正式批的笔试,通常题量不小、题型组合也复杂,目的就是在一两个小时里评估你的计算机基础、代码能力、逻辑思维和测试敏感度。
很多人误以为测开笔试会比开发笔试简单,这是个大误区。测开笔试的代码题难度通常略低于同场开发岗,但不代表容易,它还会额外增加测试相关的考察点。你可能会在同一次笔试里看到:几道选择题、两道编程题、一道测试用例设计题,甚至还有智力题或逻辑推理题。这样组合的本质是——企业想知道你的代码能力够不够用、测试思维有没有雏形、遇到陌生问题能不能拆解。
从招聘方的角度来说,笔试筛选的画像很清晰:代码能力达到及格线,计算机基础体系完整,有测试思维潜力。所谓“测试思维潜力”,说白了就是你面对一个功能时,能不能不自觉地想到“这里会出什么问题”“那个边界值要不要验一下”。这种思维比死记硬背测试理论更重要。
1.2 高频考点全景:知识板块与大致占比
综合历年各类测开笔试的情况,网易这场正式批笔试的考点可以分成几大板块,我从信息密度和出题频率两个维度给你做个参考:
| 知识板块 | 大致占比 | 典型考察方式 |
|---|---|---|
| 数据结构与算法 | 30%-40% | 选择题 + 1-2道编程题 |
| 计算机网络 | 15%-20% | 选择题 + 简答/填空 |
| 操作系统与数据库 | 20%-25% | 选择题、SQL书写、死锁/索引分析 |
| 测试基础与用例设计 | 15%-20% | 简答题 + 测试用例设计大题 |
| 逻辑推理与智力题 | 5%-10% | 选择题、找规律题 |
注意,这个比例不是每年固定的,但大方向不会变。算法编程是最大头,决定了你能不能过线;测试用例设计是测开岗的差异化题目,决定了你在同批候选人里能不能出彩。
我见过有些同学拼命刷测试理论题,结果编程题没做出来,直接挂掉。也见过代码写得不错但测试用例设计完全没思路的人,同样很吃亏。笔试不像面试,没有追问和提示,所有能力短板都会被直接摊开。所以你复习时不能偏科,得把“开发能力”和“测试意识”放在一起练。
1.3 测开笔试和普通开发笔试的核心差异
测开笔试和普通开发笔试最大的区别在于:开发笔试几乎只看你的“构造能力”,而测开笔试还看你的“拆解能力”和“怀疑能力”。
举一个很直观的例子。开发岗出题可能是“请实现一个函数,把传入的字符串反转”,你只要把代码写对就得分。但测开笔试里同样的题,后面可能还会跟一个小问:“如果要为这个函数设计测试用例,你会从哪些角度考虑?”这时候你不能只写一个“输入abc,输出cba”,而是要做成一个用例集合:空字符串、单字符、带空格、带特殊字符、超长字符串、全角半角、是否返回新对象等,这才算答到点子上。
再比如选择题里,开发岗可能考“以下哪个排序算法平均时间复杂度最低”,测开岗可能换成“在什么情况下快速排序最慢,你会用数据验证吗?”这就把纯理论题变成了带测试思维的场景题。你要习惯这种视角切换:刷题不只是为了写AC代码,还要多想一步“我写的代码怎么验证、怎么测”。
2. 核心细节解析与实操要点:每类题的解题套路
2.1 数据结构与算法题:不是要你当算法专家,而是要你够用
测开岗的编程题通常不会出太难的高级算法,更多集中在数组、字符串、链表、栈、队列、二叉树、哈希表、简单动态规划这些范围。刷题建议按这个优先级来:字符串处理、数组与双指针、链表、栈与队列、二叉树遍历、排序与二分、哈希表。
以一道常见的“反转字符串中的单词顺序”为例,思路并不复杂:先把字符串按空格切分,过滤掉空串,再反转数组顺序,最后拼接。但这题容易暴露几个问题:Python用split默认切分可能和题意的“连续空格”处理不一致;C++选手容易忘记考虑字符串首尾空格;Java选手要注意字符串不可变导致的大量拼接开销。这种边界细节,恰恰是笔试选择题最喜欢挖坑的地方。
为什么测开岗也要刷LeetCode?因为在真实测试开发工作中,你经常要写自动化脚本、写测试框架、写数据构造工具,底层全是代码能力。测试开发不是“点的功能测试”,你写的工具质量直接影响团队效率。所以笔试里代码题的目的,是验证你有没有能力独立写出可维护、可运行的代码。
刷题建议从剑指offer和LeetCode Hot 100开始,把每个题的暴力解法和最优解法都理解一遍。不要只背代码,要能说清为什么这个方法是O(n)而不是O(n^2),因为面试阶段也很容易追着复杂度问。
2.2 计算机网络:从接口测试角度理解协议,比死记硬背更高效
计算机网络在测开笔试里的考法很固定:TCP与UDP的区别、TCP三次握手和四次挥手、HTTP与HTTPS的区别、GET与POST的区别、常见状态码含义、Cookie与Session的区别、TCP粘包问题、DNS解析过程等。
死背这些概念效率很低。我建议你换一个思路——把自己当成一个正在做接口测试的测开工程师,从测试视角去理解这些协议。比如你测一个登录接口,要验证它的安全性,自然就要知道HTTPS相比HTTP多了TLS加密,证书校验在哪一步发生。又比如你测文件上传接口,常遇到大文件传输不完整,这个问题的根源就在TCP的粘包和拆包机制,你懂了底层原理才知道测试用例该怎么设计。
TCP三次握手为什么是三次而不是两次?因为要保证双方都具备收发能力,同时避免历史重复连接请求被误建立。理解了这个“为什么”,比记住“SYN, SYN+ACK, ACK”更有用。笔试中选择题有时候会故意改乱顺序,你不理解原理就很容易被骗。
HTTP状态码也要熟记:2xx表示成功、3xx表示重定向、4xx表示客户端错误、5xx表示服务端错误。面试和笔试常考的是301和302的区别、401和403的区别、500和502的区别。这些在接口测试中都是高频接触的状态码,当测试用例的预期结果非常有用。
2.3 操作系统与数据库:并发、死锁、索引是三大热门考点
操作系统常考的知识点包括进程与线程的区别、进程调度算法、死锁产生的四个必要条件、银行家算法、虚拟内存与分页、用户态与内核态。其中死锁是整个考点的重中之重。
死锁产生的四个必要条件:互斥、持有并等待、不可剥夺、循环等待。我见过很多同学把四个条件背得滚瓜烂熟,但题目一换成场景题就不会了。比如:“两个线程分别持有锁A和锁B,然后互相请求对方的锁,这属于什么情况?”这就是循环等待。笔试不会直接问定义,更喜欢给你一段伪代码或场景,让你判断是否可能发生死锁以及如何处理。
数据库的考察则集中在SQL书写、索引原理、事务特性与隔离级别、存储引擎对比。测开岗位为什么要考数据库?因为做测试时你要造数、查数、验证数据一致性,写SQL是最基本的技能。
SQL题有一个高频类型:多表联合查询 + 分组聚合 + 条件过滤。比如“查询近30天每个用户的下单次数和订单总额,只显示下单次数大于5的用户,并按订单总额降序排列”。解题的关键是先把表和表之间的关联关系理清楚,再用GROUP BY和HAVING去过滤。写SQL时先确定主表、再写连接条件、再加过滤条件、最后分组排序,这个顺序不要乱。
索引部分要理解为什么覆盖索引快、什么情况下索引失效。典型的索引失效场景包括:对索引列进行了函数运算、隐式类型转换、LIKE左模糊、WHERE条件里用OR连接非索引列等。笔试里的选择题非常喜欢出这类“以下哪个写法会导致索引失效”,你要能从执行计划的角度去理解,而不是死记。
2.4 测试基础与用例设计:拉开差距的核心大题
测试基础这块,重点看测试金字塔、软件测试生命周期、测试用例设计方法(等价类划分、边界值分析、因果图、判定表、场景法、错误推测法)、缺陷生命周期、接口测试和性能测试的基本概念。
其中测试用例设计几乎是大厂测开笔试的必考大题。它考察的不是你会不会背方法名,而是你能不能系统化地设计出一个覆盖全面、有层次、可执行的用例集合。
我以“登录功能”为例,给你拆一道典型的用例设计大题。很多同学的第一反应是写“输入正确用户名密码,登录成功”“输入错误密码,提示错误”两条用例,这显然远远不够。你可以按下面这个框架来写:
- 功能正确性:正确账号密码登录成功、账号不存在、密码错误、账号被锁定、密码过期、验证码错误。
- 边界值:用户名为空、密码为空、用户名和密码都是超长字符串(比如1000个字符)、用户名包含特殊字符、密码包含空格。
- 异常与安全:连续多次输错密码是否有锁定机制、SQL注入字符(用户名传单引号)、密码是否明文传输、登录后是否有会话超时。
- 兼容性与体验:不同浏览器、不同分辨率、移动端和PC端的表现是否一致、弱网环境下的提示是否友好。
写用例的时候,把输入、操作步骤、预期结果三要素写清楚,别只写一个标题。很多人用例设计题丢分,不是没思路,而是格式不规范、没有优先级、没有分层。你可以给每条用例标注优先级P0/P1/P2,这样能体现你的工程化思维。
我建议你把这种“功能正确性—边界—异常—安全—兼容—性能”的思路练成一套自己的万能模板,不管碰到登录、注册、购物车、转账、搜索,都能套用再根据业务场景填充细节,这就是测开笔试的大题武器。
3. 实操过程与核心环节实现:从模拟到实战的完整准备路线
3.1 明确起点:先给自己做个能力自测
准备笔试之前,最怕的就是盲目刷题。我建议你先花半天时间做个自测,搞清楚自己的起点。你不需要把每题都做对,重点是找出自己的薄弱板块在哪。你可以这样自测:
- 数据结构与算法:随机抽剑指offer的简单和中等题各5道,看能否在30分钟内写出正确答案。
- 计算机网络:把TCP三次握手、HTTP状态码、GET/POST区别这几个问题开口讲一遍,看能不能讲清楚。
- 操作系统与数据库:写一条涉及两表关联的分组查询SQL,并解释执行过程。
- 测试用例设计:给“一个只有手机号和密码两个字段的登录框”设计10条以上测试用例,看能否写满一页。
如果自测后发现自己连“二分查找边界条件”都写不对,不要慌,这很正常。校招笔试的备考本来就是“基础积累+专项突破+模拟实战”的过程。关键是你要清楚自己的短板,然后在复习计划里给短板分配更多时间。
3.2 三个月复习路线参考:基础、专项、模拟三阶段
我按三个月周期给你做一个复习路线参考,如果你是时间更紧的同学,可以把每个阶段压缩,但尽量不要跳步骤:
| 阶段 | 时间 | 核心任务 | 推荐动作 |
|---|---|---|---|
| 基础期 | 第1-4周 | 补计算机基础 | 计算机网络/操作系统过一遍教材,每天刷2-3道LeetCode简单题 |
| 专项期 | 第5-8周 | 按板块突破 | 每天3-5道算法题+专项练习SQL、测试用例设计 |
| 模拟期 | 第9-12周 | 全真模拟与复盘 | 每周2-3次计时笔试模拟,整理错题和笔记 |
基础期不要贪多,每天保持稳定输出比突击更重要。我见过很多同学第一周热血满满刷了50道题,第二周就坚持不下去了。正确的节奏是每天刷2-3道,保持手感,同时搭配计算机基础知识的阅读。专项期则要有意识地做测试相关练习,因为测试思维不是光靠刷算法题能练出来的。
网络上有不少测试开发学习路线和面试题整理,你可以用于参考,但不要陷入“刷面经”的误区。面经只能帮你查漏补缺,真正决定笔试过不过的,还是你的代码能力和思维框架。
3.3 一次模拟笔试的完整过程示范
模拟笔试就是要尽量还原真实场景。假设你报名的笔试时间是晚上19:00-21:00,题型是10道选择题+2道编程题+1道用例设计题,总分100分。你可以这样安排模拟:
19:00-19:20,先快速扫一遍所有题目。不要从头开始死磕,先把2道编程题看清楚难度,把用例设计题的要求读明白。记住一个原则:选择题拿不准的先标记,不要反复犹豫,编程题先写有把握的那道。
19:20-20:00,集中做第一道编程题。审题至少花2分钟,把输入输出格式和边界条件想清楚再动手。写完代码后,不要急着交卷,先在本地把常规用例、边界用例、异常用例都跑一遍。
20:00-20:30,做第二道编程题。如果发现这道题确实没有思路,先把暴力解法写出来,能拿一部分分也是一部分分。笔试评分通常是按照例通过率给分的,不是只有AC和0分两档。
20:30-20:50,写测试用例设计题。这类题只要你有框架,得分都很稳定。先按功能、边界、异常、安全、兼容几个维度列提纲,再逐条补充输入和预期结果。
20:50-21:00,检查阶段。重点检查选择题有没有漏选和误触,编程题的输出格式是否和题目要求完全一致。很多线上笔试系统对输出格式非常敏感,多一个空格、少一个换行都可能导致0分。
模拟完之后一定要复盘。我建议你做一张“错题记录表”,记录题目类型、错误原因、正确解法和对应考点,每周回头看一遍。这样的复盘比盲目刷题有用得多。
3.4 笔试中的答题策略:时间分配与做题顺序
答题顺序没有绝对标准,但有一个原则:先做确定性高的题,再做需要思考的题,最后挑战难题。具体到测试开发笔试,我建议的顺序是:编程题中你有把握的那道 → 测试用例设计题 → 选择题 → 另一道编程题。
为什么把用例设计题放在编程题之后、选择题之前?因为用例设计题只要写就有分,而且能体现你的测试思维,性价比很高。选择题往往有迷惑选项,如果你在一个不确定的选择题上纠结太久,会严重影响后面大题的发挥。
时间分配上,如果总时长120分钟,我一般建议编程题留70分钟左右,用例设计题25分钟,选择题20分钟,最后5分钟检查。当然,具体你要根据题目难度灵活调整,但核心思路是:不要把时间耗在“跳一跳也够不到”的难题上,先把基础分拿稳。
4. 常见问题与排查技巧实录:笔试现场容易踩的坑
4.1 在线笔试系统的操作坑
很多同学平时在本地IDE写代码习惯了,一到在线笔试系统就各种不适应。最常见的坑包括:没选对编程语言导致语法高亮异常、代码模板里没有主函数导致本地跑得通但线上编译不过、输入输出格式没按样例写导致提交后0分、不小心切出页面被系统判定为作弊等。
我建议你在正式笔试前,至少用牛客网或赛码网做两次完整模拟,熟悉在线笔试的答题界面和输入输出处理方式。这类平台通常有“本地调试”和“在线提交”两种模式,你要确认代码里到底要不要包含文件读写逻辑,大部分情况只需要从标准输入读取、向标准输出打印。
另外,有些在线系统对题目有一段模板代码,你只需要填写核心函数,这种情况下千万不要自己再加一个main函数,容易编译报错。你可以在本地测试时临时加main,提交前记得删掉或注释掉。
4.2 编程题的边界条件与调试技巧
编程题最常见的失分原因不是算法不会,而是边界条件没处理好。比如二分查找的left和right边界问题、数组越界问题、空字符串和空数组问题、数值溢出问题、循环中的死循环问题。
我教你一个很实用的调试习惯:写完代码后,不要急着提交,先用题目给的示例输入跑一遍。再自己想几个“攻击性”用例跑一遍,比如空输入、单元素输入、最大输入长度、负数和零、重复元素等。每跑一个用例,就检查一下代码结果是否符合预期。这个习惯在平时刷题时就要养成,不要等到笔试时才想起来。
如果你在一个用例上卡了很久,不要一直耗着。先把当前思路写成注释,回溯一下哪里可能出现问题。还有一个技巧:输出中间变量。你在本地调试时可以在关键位置打印变量值,在线笔试系统一般也支持标准输出,你提交时再把调试输出删掉就好。
4.3 用例设计题写不满的根源与破解方法
很多同学写用例设计题最大的问题不是不会写,而是写到中途就写不下去了,总觉得“好像都覆盖到了,但又感觉不够”。这个问题的根源是缺少结构化的框架。
你可以用下面这个“六维检查法”来检查自己的用例是否完整:
- 功能维度:各种正常流程是否覆盖,包括主流程和分支流程。
- 边界维度:空值、超长值、极值、临界值是否覆盖。
- 异常维度:非法输入、系统异常、网络中断、超时是否覆盖。
- 安全维度:越权、注入、篡改、加密传输是否覆盖。
- 兼容维度:不同设备、浏览器、操作系统、分辨率下的表现是否覆盖。
- 性能维度:并发用户数、响应时间、资源占用是否覆盖。
每写一组用例,就用这六个维度过一遍筛子,缺什么补什么。另外要记住,答题纸有限,你不需要写几十条用例堆字数,而是要写出有代表性、有优先级、覆盖全面的10-20条用例。质量比数量重要。
4.4 心态与时间管理:最后一刻也不能自乱阵脚
笔试中还有一个隐形杀手是心态崩盘。我见过一个同学,第一道编程题做了40分钟没通过,后面的选择题和用例设计题全部草草了事,最终总分惨不忍睹。这就是典型的时间分配失败。
其实在线笔试是允许你反复提交的,题目也没规定必须按顺序做。卡在一道题上超过15分钟还没有思路,就应该果断放弃,先把其他题做完,最后有时间再回头攻坚。你要有个心理预期:校招笔试题不可能让你全部做完做对,尤其编程题,可能只有一半的人能完整AC。你要做的不是“全对”,而是在有限时间里拿到尽可能多的分。
考前半小时,把该带的证件、计算器(如果允许)、草稿纸(有些在线笔试允许)准备好,找一个安静的、网络稳定的房间。提前10分钟登录系统,测试摄像头和网络环境,避免出现开考后才发现设备不行的窘境。
4.5 避坑速查表
| 风险点 | 常见表现 | 破解方法 |
|---|---|---|
| 选择题纠结 | 一道题花5分钟以上,影响后续大题 | 先标记,做完大题再回头 |
| 编程题输出格式错误 | 本地通过,线上0分 | 提交前严格对照样例格式,检查空格和换行 |
| 用例设计题无框架 | 想到哪写到哪,覆盖率低 | 按功能/边界/异常/安全/兼容/性能六维逐一填充 |
| 复习偏科 | 只刷算法或只背测试理论 | 按1.2节的知识板块占比分配时间 |
| 忽略复盘 | 刷了很多题但错题反复错 | 建立错题记录表,每周回顾 |
我个人在实际操作中的体会是,测试开发笔试的备考,其实不是“背题”能解决的,它更接近一种思维方式的养成。你在刷算法题时多想一步“如果这个函数要给用户用,哪些输入会导致它崩溃”,你在看协议文档时多问一句“如果网络突然断开,这个接口应该返回什么”,这些习惯一旦养成,笔试的用例设计题和场景题都会顺很多。最后再分享一个小技巧:每次模拟笔试结束,别急着对答案,先自己给自己打分,再对照参考答案,这个过程最能暴露出你和企业要求之间的真实差距。