最近不少准备校招的同学在刷测试开发的笔试题,经常会拿一套“酷家乐2020校园招聘-测试开发B卷”来问我怎么看。说实话,虽然年份早了一点,但这套卷子的出题逻辑放到现在依然很典型,甚至比很多公司的海量八股文更有参考价值。它不是让你背一堆概念就完事,而是要把“测试思维”和“开发能力”揉在一起考。看完这张卷子你会发现,测试开发这个岗位真正要筛的,不是“会点点点的人”,而是“能用代码把测试做成工程的人”。
这篇东西我就以这套B卷为引子,拆一拆测试开发笔试背后到底在考什么,哪些题型是送分题、哪些是拉分题,以及从笔试到实际岗位,你的能力缺口通常出现在哪里。打算投测试开发岗的同学,不管目标是互联网大厂还是像酷家乐这类做SaaS产品的公司,都值得看完后再去刷题。
1. 笔试为什么这样出:先看懂测试开发这个岗位到底要干嘛
1.1 测开不是“点点点”,而是用开发能力解决测试问题
很多同学对测试开发的认知还停留在“平时写写用例,有空点点页面”的层面,这其实是把测试工程师和测试开发工程师混为一谈了。测试开发的核心逻辑是用开发手段去提升测试的效率、覆盖率和可靠性。举个例子,一个Web产品每次发版前都要回归几十条核心用例,纯手工点可能要花半天,测开要做的就是把这部分自动化,写脚本、搭平台,让回归在几分钟内跑完。
放到酷家乐这类做云设计SaaS产品的公司里,这个需求会更复杂。前端要测、接口要测、渲染结果要测、不同浏览器和移动端要适配,甚至还有算法层面的效果验证。单靠人工堆人力一定会出问题。因此笔试卷子里的编程题、数据库题、用例设计题,其实都是在模拟测开未来工作中最常遇到的几个场景,只不过把它们压缩成了一两个小时。
1.2 一张B卷隐藏的能力模型:业务理解、代码、工具化、质量体系
我拆过不少公司的测试开发笔试题,基本都能归到四个能力层:第一层是业务和需求理解能力,能不能把一个功能描述拆成清晰的测试点;第二层是代码能力,能不能把测试点变成可运行的脚本或工具;第三层是工具链熟练度,比如接口测试工具、数据库查询、Linux基础操作;第四层是质量体系意识,能不能通过用例设计、自动化、持续集成去保障整个项目的稳定性。
这套B卷的典型之处就在于,它很少直接问“什么是等价类划分”这种概念题,而是给你一个场景,让你现场设计用例。这种题目最考验人,因为它不考记忆,考你在实际工作中“敢不敢这样测、会不会这样想”。所以你准备笔试的时候,如果只是把网上常见的测试理论八股文背一遍,遇到情景题基本会卡住。真正的准备方式应该是拿真实功能一个个去拆,把自己当成已经入职的测开,去想这个功能上线前你要做什么。
2. B卷重点题型拆解与答题思路
2.1 测试用例设计题:别只写“输入正确、输入错误”
用例设计题几乎是所有测试开发笔试的必考题,B卷里面比较常见的形式是给你一个功能描述,比如“设计一个登录功能的测试用例”,或者给你一组条件让你找出覆盖场景。这类题看着简单,但特别容易暴露水平。低分答案通常只写着“输入正确的账号密码,能登录成功;输入错误的账号密码,提示错误”,这就是典型的没经过思考。
要拿高分,你需要按等价类、边界值、场景法、错误推测法这套体系去覆盖。登录功能起码要拆出几个维度:账号本身的格式(空值、长度边界、非法字符)、密码的正确性、账号密码组合、验证码/密码错误次数限制、网络异常与超时、服务端返回异常、不同状态码提示、安全性(如SQL注入、密码明文传输)等。把这些点列全,再从中挑出核心场景写成测试步骤和预期结果,这才能让面试官觉得你有测试敏感度。
以登录为例,我给你看一个比较标准的用例组织方式:
| 用例编号 | 测试场景 | 前置条件 | 操作步骤 | 预期结果 |
|---|---|---|---|---|
| TC01 | 正常登录 | 已注册账号 | 输入正确用户名和密码,点击登录 | 登录成功,跳转首页 |
| TC02 | 密码错误 | 已注册账号 | 输入正确用户名,错误密码 | 提示“账号或密码错误” |
| TC03 | 密码为空 | 已注册账号 | 输入用户名,密码留空 | 提示“请输入密码”,不提交请求 |
| TC04 | 账号不存在 | 无该账号 | 输入不存在的用户名和任意密码 | 提示“账号或密码错误” |
| TC05 | 连续输错密码 | 已注册账号 | 连续输错5次 | 账号锁定或要求输入验证码 |
| TC06 | 密码边界长度 | 已注册账号 | 输入7位和8位密码边界值验证 | 按设计规则通过或拦截 |
| TC07 | 网络超时 | 模拟弱网 | 登录请求延迟超过设定时间 | 不卡死,给出超时提示并可重试 |
这种表格式的回答,一是条理清晰,二是覆盖维度全,三是能看出你知道边界和异常场景。给你一个建议:笔试时不管题目是登录还是购物车、文件上传、订单支付,先把“输入维度、状态流转、异常分支、安全风险”四类场景在草稿纸上列出来,再逐一细化,宁可多写也不要漏。
2.2 编程题:代码能力是测开发的立身之本
B卷里的编程题通常不会出特别偏的算法,常见的是数组排序、字符串处理、链表操作、二分查找这类基础题,偶尔会结合测试场景,比如写一个函数判断括号是否匹配、解析日志文件中的某些字段。这类题目看似简单,但阅卷人真正看的是你的代码习惯和边界处理意识。
很多同学平时刷LeetCode习惯了,在IDE里写完直接提交,但笔试是白板或在线编辑器,你要在没提示的情况下把代码写完整。我的建议是:写代码的时候一定要先声明解题思路,再动手。比如题目要求给一个整数数组排序,不要上来就Arrays.sort(),你要写上“因为产品后续需要稳定排序且数据量不大,这里选择归并排序或插入排序,时间复杂度是O(nlogn)”这类说明。这会让阅卷人看到你不是背题,而是真的理解。
还有一点特别重要,就是边界测试。写个二分查找,不要只在main里测正常数组,还要测试空数组、只有一个元素、目标值不存在、数组有重复值这些情况。你可以顺手在代码后面写上几组测试输入和期望输出,这对测开岗位来说非常加分,因为它体现的就是你骨子里的测试意识。
2.3 数据库与接口基础:测开手里必须有的基本功
B卷里数据库的题目基本逃不出这几类:单表查询、聚合统计、多表连接、更新删除语句,再进阶一点就是事务隔离级别、索引失效场景。建议你把SQL语法基础过一遍,尤其是GROUP BY、HAVING、LEFT JOIN和子查询的配合。这些在实际做数据校验、准备测试数据的时候特别常用。
接口相关的题目则通常围绕HTTP协议展开,比如GET和POST的区别、常见状态码含义、如何断言一个接口返回是否正确。有些卷子会直接给你一个接口文档,让你根据文档设计测试用例。我见过不少候选人在这里翻车,因为他们只关注“参数传对了没有”,却忽略了鉴权、幂等性、异常码、超时重试这些接口测开的重点关注点。这里我必须强调一句:接口测试不只是调通,而是要把成功路径之外的分支全部覆盖到,这样才能发现真正的问题。
3. 一次完整实操复盘:把一道登录用例题做到自动化
3.1 从需求描述到测试点拆分
理论说再多,不如完整走一遍流程。我拿B卷里最常见的“登录功能”来演示,如何从一段简单的需求描述,一步步落地成自动化用例。假设需求只有一句话:“用户输入手机号和密码登录,登录成功后跳转到首页。”如果只看这句话,新手可能觉得需求很清楚了,但在测开眼里,这句话漏掉的信息太多了。
我会先把可以测试的维度拆出来。功能层面:输入框是否校验手机号格式、密码是否显示掩码、登录按钮 loading 状态是否正常、登录成功路由是否跳转。接口层面:客户端传参是否正确、密码是否加密、服务端鉴权逻辑、token 有效期、异常状态码处理。数据层面:新用户、老用户、被封禁用户、密码连续错误用户分别是什么样的表现。把这些整理成一份测试点清单,再决定哪部分做手工冒烟、哪部分写成自动化脚本。
很多同学在笔试时根本不会做这一步,看到功能描述直接就在想“我该怎么写用例”,顺序就反了。正确顺序一定是:先拆分测试点,再根据测试点推导用例,最后才考虑怎么执行。这个思维模式建议你们在笔试前反复练,练到变成肌肉记忆。
3.2 接口自动化用例落地:用Python写一个可复用的登录测试脚本
登录场景的自动化,通常从接口层开始做性价比最高,因为接口稳定、执行快、容易接入CI。下面这段代码就是我用Python配合pytest和requests写的一个简易登录接口测试脚本,基本结构适用于绝大多数B卷登录场景。
import pytest import requests BASE_URL = "https://api.example.com" def login(username, password): """封装登录接口,返回响应对象""" url = f"{BASE_URL}/login" payload = { "username": username, "password": password } # 模拟前端对密码做MD5加密,实际业务中一般为HTTPS传输 # 这里仅演示参数组装方式 headers = {"Content-Type": "application/json"} resp = requests.post(url, json=payload, headers=headers, timeout=10) return resp class TestLogin: def test_login_success(self): resp = login("valid_user", "valid_pass") assert resp.status_code == 200 data = resp.json() assert data["code"] == 0 assert "token" in data["data"] assert data["data"]["token"] != "" def test_login_wrong_password(self): resp = login("valid_user", "wrong_pass") assert resp.status_code == 200 data = resp.json() assert data["code"] == 10001 assert "账号或密码错误" in data["message"] def test_login_empty_username(self): resp = login("", "valid_pass") assert resp.status_code == 200 data = resp.json() assert data["code"] == 10002 assert "用户名不能为空" in data["message"] @pytest.mark.parametrize("pwd", ["1234567", "12345678901", "12345678"]) def test_login_password_boundary(self, pwd): resp = login("valid_user", pwd) data = resp.json() # 根据需求文档,密码长度8-16位,这里只做请求是否被拦截的校验 assert resp.status_code == 200 assert data["code"] in (0, 10003)这段代码里有一个很容易被忽略的点:timeout=10。很多同学写接口测试脚本时不设置超时,一旦被测环境网络卡住,整个用例会一直挂起。加了超时后,配合pytest的失败信息,你能很快速地判断是网络问题还是服务端问题。另一个细节是断言不只看状态码,还要看业务码和数据内容,因为很多接口无论成功失败都会返回200,真正的判断逻辑在body里。
3.3 执行、定位与回归:跑完脚本之后才是真正开始
脚本写完了,不是执行通过就结束了。实际工作中你会发现,接口在本地跑得通,一到测试环境就挂,原因五花八门:测试环境数据库没有初始化数据、依赖的第三方服务没启动、token鉴权失败、请求头里少了某个必填参数。所以你把脚本跑出失败结果之后,下一步不是改代码,而是看日志、抓请求、复现问题,定位到底是环境问题还是代码问题。
举个例子。之前我自己遇到过一个问题:登录接口在本机调用正常,但放到服务器上执行就报502,查了半天发现是服务器防火墙没有放行目标域名。这种问题如果只盯着测试代码看,永远找不到原因。经验之谈,接口出问题的时候,第一先确认环境可用,第二看接口文档的请求是否完全一致,第三抓包看实际发的请求体。按照这个顺序排,大部分问题能在半小时内定位。笔试里如果问到“自动化用例失败后你怎么排查”,你可以把这套思路说出来,比背概念有用得多。
4. 常见失分点与避坑技巧
4.1 八股文背得再多,题目一变就懵
测试开发面试里,八股文确实会问,比如黑盒白盒、等价类边界值、POM模式、token和session区别。但B卷这类以场景题为主的试卷,光背八股是没有用的。我见过很多同学把“等价类划分”的定义背得很熟,但让他针对“文件上传功能”列测试点时,他只写了“正常上传、上传大文件、上传空文件”三个,覆盖度明显不够。这说明他理解的是字面意思,而不是方法本身。
要破解这一点,我个人的方法是“用功能反向记忆理论”。每学一个测试设计方法,就找一个真实功能去套。学边界值分析,就拿“密码长度8到16位”去套;学场景法,就拿“电商下单流程”去套。这样笔试时看到一个功能描述,脑中会自动把方法和场景对应起来,而不是临时想概念。
4.2 用例设计题里最容易被扣分的三个地方
第一个是只写正常流,不写异常流。第二个是只写了“输入输出”,没有写“前置条件和预期结果”,导致用例不可执行。第三个是缺少辅助性测试,比如权限测试、并发测试、兼容性测试。这些点不是每道题都必须写,但一旦你写的功能明显涉及这些维度却不写,阅卷人就会觉得你的测试思维不够完整。
给你一个自查清单:拿到一道用例设计题,至少问自己五遍——正常流程覆盖了吗?异常分支覆盖了吗?边界值覆盖了吗?是否需要考虑性能和并发?是否涉及安全和权限?五遍问完,你的用例基本就稳了。
4.3 代码题“结果对”却没分的三个原因
第一个原因是不写注释和解题思路,阅卷人看不懂你写了什么,只能靠猜。第二个原因是只写了核心逻辑,没有处理空指针、越界、重复值这些边界情况,打印几个遍历结果就草草交卷。第三个原因是代码风格太随意,变量名从a到z,方法没有拆分,可读性太差。
这里送你一个套路:拿到编程题后,先花一分钟在草稿纸上写下解题思路、时间复杂度和边界条件,再开始写代码,写完后再补一段测试用例。这个过程最多多花五分钟,但分数回报是实打实的。测开岗位本质上是写代码给测试服务的人,代码可读性差,其他测试同事怎么复用和维护?阅卷人扣分扣的就是这个“工程素养”。
5. 从笔试延伸开去:测试开发学习路线怎么走
5.1 先搭骨架、再补血肉:测开能力地图
如果你看完这套B卷,发现自己每个模块都差一点,别慌。测试开发学习路线是可以做到相对标准化的,按阶段走就行。第一阶段是打基础:一门主流语言(Java或Python)必须能熟练写脚本,数据库增删改查要够用,Linux常用命令至少掌握日志查看、进程管理、文件操作。第二阶段是测试专项:把接口测试、自动化用例设计、性能测试入门、持续集成基本概念搞定。第三阶段是往平台化走:尝试写一个简单的测试平台,或者给团队做一个自动化工具,这时候你才是真正的“测开”。
我特别推荐准备校招的同学把“做一个完整项目的测开实践”当成主线任务。比如自己写一个Web的小工具,然后从需求分析、测试用例设计、自动化脚本、CI接入完整走一遍。这个项目既能写在简历上,又能在笔试时让你有真实案例可以举,比刷十套题都管用。
5.2 AI时代,测试开发的边界正在被拓宽
这两年AI辅助编程、AI自动生成用例的工具越来越多,很多同学担心测试开发这个岗位会被冲击。我的观察恰恰相反,AI能替代的是“生成用例”和“执行重复回归”这类低层次工作,但设计什么用例、怎么评估系统风险、如何判断一个bug是表面问题还是架构缺陷,这些仍然需要对人的理解和判断力。工具越强大,对使用者的要求越高。
所以我的个人建议是:基础能力不能丢,代码、数据库、Linux、网络协议这些依然是地基;但同时要有意识地去接触AI提效工具,比如用AI辅助生成接口测试用例,再人工去补边界场景。技术变化很快,但“理解系统、发现问题、推动质量”这个核心逻辑是稳定的。你笔试通过、入职之后真正拉开差距的,往往也是这个能力。
退一步说,这套B卷的所有题目,本质上都在做同一个筛选:你是否具备独立保障一个功能质量的能力。准备的时候别把它当成期末考,把它当成一次上岗前的预演。能把登录、购物车、订单这些经典场景拆透、测透、自动化透,你就掌握了测试开发最基本的生存技能。