1. 从360校招笔试题聊起:测试工程师到底在考什么
很多人一听到“笔试”两个字就头皮发麻,尤其是测试岗,总觉得不如开发岗“有技术含量”,应该随便写写就能过。说实话,这种想法我当年也有,直到真正参加了360那年的校招笔试,才发现自己错得离谱。
360的测试工程师笔试,客观题部分涵盖的范畴非常广:软件测试基础理论、测试用例设计、Linux命令、数据库SQL、计算机网络协议、数据结构与算法、自动化测试工具、性能测试指标、安全测试常识,甚至还包括一些逻辑推理和场景分析题。它不要求你把某一门课学成专家,但要求你在本科四年学过的所有计算机核心课程里,都有扎实的基础,并且能把它们和“测试”这件事联系起来。
换句话说,它考的不是“你会不会写代码”,而是“你有没有测试思维”,以及“你知不知道在什么场景下用什么手段保证质量”。这篇文章我就结合360这套客观题合集,把典型的考点拆开揉碎了讲一遍,也会把我自己备考和实际工作多年后回头看的一些体会放进去。不管你是正在准备校招,还是刚入行想补基础,这篇内容应该都能给你一个比较完整的参照系。
2. 测试基础理论类题目:最容易拿分,也最容易丢分
2.1 软件测试的定义与目的:少背概念,多理解本质
笔试里最常见的一类送分题,就是关于软件测试的定义、目的、原则。比如“软件测试的目的是什么”“下列哪项不属于测试原则”等等。很多同学背得滚瓜烂熟,却还是选错,原因在于概念背得太死,没有理解背后的逻辑。
软件测试的目的,本质上不是“证明软件没有Bug”,而是“发现程序中的错误从而证明软件质量不满足要求”。注意这里的措辞差异——测试是一个“证伪”的过程,不是“证实”的过程。这就像你检查一扇门有没有锁好,你只能通过反复拉动来确认它可能存在锁不上的情况,但永远无法通过拉动一次就证明它永远锁得好。笔试题目喜欢在这种地方挖坑,把“证明正确性”这种话放在选项里,很多不细想的人就直接跳进去了。
测试的基本原则也是高频考点。比如“测试应尽早介入”“测试中存在杀虫剂悖论”“缺陷具有集群性”“测试不能穷尽”等。其中“杀虫剂悖论”这个概念,笔试经常换着花样考:如果反复执行相同的测试用例,新的缺陷就无法被发现了,因为系统已经“适应”了这套用例。这个比喻来自农药杀虫,害虫会产生抗药性,软件也一样。答题时要抓住关键词“相同用例反复执行”,基本就能锁定答案。
2.2 测试用例的组成要素:比你想象的更细
还有一类题是给出一段需求描述,让你判断测试用例中缺少了什么要素。标准的测试用例要素包括:用例编号、测试标题、前置条件、测试步骤、测试数据、预期结果、实际结果、优先级等。笔试中常考的坑是“预期结果”和“测试数据”被混在一起,或者把“前置条件”和“测试步骤”混淆。
我举个例子你就明白了。比如要测试一个登录功能,前置条件是“用户已注册且账号未被锁定”,测试步骤是“输入用户名和密码,点击登录”,测试数据是“用户名test,密码123456”,预期结果是“登录成功,跳转到首页”。这里每一步都有各自的位置,不能乱塞。有的题目会把“点击登录后页面跳转”放在前置条件里,那就是错的。
这类题看似简单,但恰恰是很多科班出身的人容易栽跟头的地方,因为平时写用例少,对要素的理解停留在理论层面。我的建议是,不管是不是在准备笔试,都亲手写几轮完整的测试用例,从登录、注册这种基础功能开始,写到购物车、订单流程这种带状态的场景。写多了,要素自然就刻在脑子里了。
2.3 测试分类与开发模型:V模型、W模型和敏捷测试
测试的分类也是个重要出题点。按阶段划分、按是否运行程序划分、按是否查看源代码划分,这三种维度要分清楚。
- 按阶段:单元测试、集成测试、系统测试、验收测试
- 按是否运行程序:静态测试、动态测试
- 按是否查看源代码:黑盒测试、白盒测试、灰盒测试
这里最容易混淆的是“集成测试”和“系统测试”的区别。集成测试关注的是模块之间的接口和交互是否正确,系统测试关注的是整个系统作为一个整体是否满足需求规格说明。打个比方,集成测试像是检查水管和龙头接在一起漏不漏水,系统测试像是打开总阀门看整个房子所有水路通不通。
开发模型里,V模型是笔试绝对绕不开的重点。V模型把开发和测试对应起来:需求分析对应验收测试,概要设计对应系统测试,详细设计对应集成测试,编码对应单元测试。这个映射关系几乎每年都考,而且有时会换个形式,比如给出一个阶段让你选对应的测试类型。W模型则是V模型的补充,强调测试与开发同步进行,也就是“双V”模型,开发和测试并行。敏捷测试在笔试里相对没那么深,但近几年的题开始涉及“测试驱动开发(TDD)”和“持续集成中的测试分层”这类概念,可以适当留意。
3. 测试用例设计方法:黑盒测试的看家本领
3.1 等价类划分:别把边界值混进来
黑盒测试的用例设计方法里,等价类划分和边界值分析是笔试的绝对主力。等价类划分的核心思想是:把输入域划分成若干个子集,每个子集中的数据对揭露程序错误的作用是等价的,所以只需要从每个子集中取一个代表值进行测试即可。
这里有个关键点需要理解:有效等价类和无效等价类的区分。所谓有效等价类,是满足需求规格说明的输入;无效等价类,是不满足需求的输入。大多数情况下,笔试题目会这样出:一个输入框要求输入1到100之间的整数,问下列哪组数据属于无效等价类。答案是0、101、-5、3.14这类。但注意,3.14这个选项其实是有争议的,因为它不只是超出了范围,还涉及类型不对。有些严谨的题目会把“类型不合法”作为一个独立的无效等价类来处理,和“范围超界”分开考。
3.2 边界值分析:笔试的送分题,也是丢分题
边界值分析可以和等价类划分结合使用。它关注的是输入域边界附近的情况,因为大量缺陷都发生在边界值上。一个取值范围是1到100的输入框,边界值要测的是:0、1、2、99、100、101这六个点。笔试题目往往会在选项中设置一些干扰项,比如50、98这种中间值,它们不是边界值,选了就错。
为什么要重视边界值?因为开发人员在写判断条件时经常会写错等号,比如写成“age < 18”而不是“age <= 18”,或者把“>”写成“>=”。这些错误在输入中间值的时候根本测不出来,只有在边界上才会暴露。实际工作中我就遇到过很多次,金额计算、日期区间判断、分页查询的页码边界,这类Bug在开发自测阶段完全发现不了,一上边界值用例就现出原形。
3.3 判定表、因果图和场景法:逻辑组合题怎么破
当输入条件存在组合关系时,等价类和边界值就不够用了,这时候要用判定表或因果图。
判定表由条件桩、动作桩、条件项和动作项组成。笔试中常考的是根据一段需求画出判定表,或者根据判定表判断覆盖了哪些规则。实际上,判定表就是一种穷举策略,列出所有条件组合及对应的动作,它的好处是保证完整性,不会漏掉某种组合。缺点是当条件数量多时,组合数会呈指数增长,所以实际工作中通常只对关键业务规则使用判定表。
场景法在笔试中也经常出现,尤其是考“基本流”和“备选流”的概念。比如一个ATM取款流程:基本流是插卡、输密码、输入金额、出钞、退卡;备选流包括密码错误、余额不足、ATM机没钱、银行卡被吞等。题目会问某个异常分支属于基本流还是备选流,或者要求你识别某个场景漏掉了哪条备选流。这类题的答题技巧是:把自己代入用户视角,把所有可能走歪的路都列出来,就基本不会漏。
4. 自动化测试与工具:不只是Appium和Selenium
4.1 自动化测试的适用场景和局限性
自动化测试的题目在笔试中大致分两类:一类是概念性的,比如“自动化测试能替代手工测试吗”“什么项目适合引入自动化测试”;另一类是具体工具使用,比如Selenium定位元素的方式、Appium的架构、pytest的断言写法等。
概念题里,最常见的正确表述是“自动化测试适合回归测试、重复执行的测试场景,不适合探索性测试和一次性的测试任务”。很多同学会选“自动化测试可以完全替代手工测试”,这在任何情况下都是错的。自动化测试有其局限性:脚本维护成本高、对需求变更敏感、初期投入大、无法模拟人的主观判断。实际工作中,我见过太多团队一上来就想把所有用例自动化,结果一个版本迭代后脚本全部废掉,维护成本比手工执行还高。
4.2 Selenium和Appium的常见考点
Selenium的笔试考点非常固定:元素定位方式(id、name、class name、tag name、link text、partial link text、xpath、css selector)、显式等待和隐式等待的区别、WebDriver的工作原理。
这里要说一个高频陷阱题:显式等待和隐式等待的区别。显式等待是针对某个元素设置的,可以在代码中指定等待条件和超时时间;隐式等待是全局设置的,在WebDriver实例化后设置一次,对所有元素生效。如果同时使用显式和隐式等待,超时时间以较长时间为准,而不是取较短的那个。这个细节很多资料里没写清楚,笔试里一旦出对比题,特别容易错。
Appium的笔试考点主要集中在架构上:Appium是基于WebDriver协议扩展而来的,通过Android的UIAutomator和iOS的XCUITest驱动底层自动化。还有一个常考的点是,Appium的会话(Session)机制,以及Desired Capabilities的作用——它是启动Appium会话时传入的一组键值对,用来告诉Appium服务端你要测试什么平台、什么应用、什么设备。
4.3 pytest和Jenkins的联动:笔试题的新趋势
近几年,测试开发的概念越来越普及,笔试题也开始涉及测试框架和CI/CD的内容。pytest作为目前Python生态里最主流的测试框架,在笔试中出现频率越来越高。
pytest的常见考点包括:fixture的作用域(function、class、module、session)、参数化(parametrize)、断言写法(assert语句)、用例收集规则(test_开头或_test结尾的文件、函数以test_开头)。这里我提醒一句:pytest的fixture作用域是经常考的点,尤其是session和module的区别——session是每个会话只执行一次,module是每个模块执行一次。如果你没实际用过fixture,光靠背概念,遇到参数组合的题很容易搞混。
Jenkins相关的题目则偏向于流水线概念,比如“持续集成中,哪个阶段适合执行自动化测试”。答案是构建后的测试阶段。有些题还会问“在Jenkins中配置定时构建用什么表达式”,答案是cron表达式,例如“H 2 * * *”表示每天凌晨2点执行。这类题属于没接触过就不会,接触过就白送分,性价比很高,建议备考时稍微了解一下。
5. 性能测试与安全测试:两道硬菜
5.1 性能测试的核心指标:QPS、响应时间、并发数、吞吐量
性能测试在笔试客观题里,考的是指标概念和工具参数。核心指标包括:响应时间、吞吐量、并发用户数、QPS(每秒查询数)、TPS(每秒事务数)、错误率、资源利用率。
这里有个概念辨析题非常经典:并发用户数和在线用户数的区别。并发用户数是指同时发起请求的用户数量,在线用户数是指同时连接在系统上的用户数量。一个在线用户可能并不会发起任何请求,所以并发数一般远小于在线数。题目如果描述“系统有1000个在线用户,其中10%的人同时提交请求”,那么并发用户数是100而不是1000。
另一个容易混淆的是QPS和TPS。QPS偏重查询类请求,TPS偏重事务类请求。一个事务可能包含多个查询,所以在有些场景下TPS是小于QPS的。但在纯查询接口的压测中,两者数值可能接近。笔试中一般不会考得太深入,只要记住QPS衡量每秒请求数,TPS衡量每秒事务数即可。
5.2 性能测试工具:JMeter和LoadRunner怎么选
JMeter近年来越来越火,因为它是开源免费的,而且支持协议广泛。笔试中关于JMeter的考点集中在:线程组(Thread Group)的含义、监听器(Listener)的作用、断言(Assertion)的作用、参数化(CSV Data Set Config)的实现方式。
有一个点很多新手会忽略:JMeter默认情况下不会自动保存测试结果,需要在测试计划中添加“查看结果树”或“聚合报告”等监听器来查看结果。笔试中如果问“在JMeter中查看响应数据需要添加什么元件”,答案是监听器中的查看结果树。这个题不难,但没见过就是不会。
LoadRunner在笔试中也会出现,但频率明显低于JMeter。主要记住它的三大组件:Virtual User Generator(VuGen,录制脚本)、Controller(设计场景、监控场景)、Analysis(分析测试结果)。这三个组件的功能分别是做什么的,这是一个非常经典的笔试题。
5.3 安全测试:从SQL注入到XSS
安全测试的客观题在测试岗笔试中占比不算大,但几乎每年都会出。最常考的漏洞类型是SQL注入和XSS(跨站脚本攻击)。
SQL注入的笔试形式通常是:给一段代码,问存在什么安全漏洞。比如:
String sql = "SELECT * FROM users WHERE username = '" + username + "' AND password = '" + password + "'";如果username传入' OR '1'='1,整个SQL就会变成:
SELECT * FROM users WHERE username = '' OR '1'='1' AND password = '' OR '1'='1'这样无论密码是否正确,查询都会返回数据,从而达到绕过登录的目的。答案是SQL注入。预防手段是使用参数化查询(PreparedStatement),而不是通过字符串拼接SQL。
XSS则有两类需要区分:反射型XSS(非持久化)和存储型XSS(持久化)。反射型XSS是恶意脚本通过URL参数传入,服务器未做过滤直接返回给浏览器执行;存储型XSS是恶意脚本被存储到数据库中,其他用户访问页面时被加载执行。存储型XSS危害更大,因为它影响所有访问该页面的用户。笔试中如果问“攻击者将恶意脚本上传到服务器数据库中,其他用户访问时触发,这属于哪类攻击”,答案是存储型XSS。
除了这两种,偶尔也会考CSRF(跨站请求伪造)、越权访问、文件上传漏洞等。对于测试岗的客观题,不需要你会挖洞,但要知道每种漏洞的基本原理和最常见的防御手段。
6. 网络、数据库、操作系统:测试工程师的基础课
6.1 Linux网络排查:测试工程师的日常
Linux命令在测试工程师笔试中的重要性,怎么强调都不过分。因为测试环境大多部署在Linux服务器上,日志查看、服务启动、端口检查、进程管理,这些都绕不开Linux。
常考命令我整理一下:
- 查看端口占用:
netstat -tlnp或ss -tlnp - 查看进程:
ps -ef | grep java - 查看日志:
tail -f app.log(实时跟踪日志) - 查看磁盘空间:
df -h - 查看内存使用:
free -h - 文件传输:
scp -r local_dir user@host:/remote_dir
笔试中比较常挖坑的是“如何查看某个端口被哪个进程占用”和“如何实时查看日志变化”。前者答案是lsof -i :8080或netstat -tlnp | grep 8080,后者答案是tail -f。有些选项会混入cat、vim这些不合适的命令,眼力不好的同学会选错。
6.2 数据库与SQL:多表查询和事务隔离级别
测试工程师笔试中,SQL题目通常考三类:单表查询(where、group by、having、order by的配合使用)、多表连接(inner join、left join、right join的区别)、事务隔离级别。
这里说一个高频但容易错的知识点:where和having的区别。where是在分组之前对记录进行筛选,不能使用聚合函数;having是在分组之后对分组结果进行筛选,可以使用聚合函数。比如“查询平均成绩大于80分的学生姓名”,需要在group by student_id之后用having avg(score) > 80,而不是用where avg(score) > 80。
事务隔离级别在测试岗笔试中出现的概率稍低,但在面试中几乎是必问。四个级别:读未提交、读已提交、可重复读、串行化。其中“可重复读”是MySQL InnoDB引擎的默认级别,这一点经常考到。脏读、不可重复读、幻读这三种异常分别发生在哪一级别之下被解决,也建议背清楚——它们之间的对应关系是:读未提交可能发生所有三种,读已提交解决脏读,可重复读解决不可重复读和脏读,串行化解决所有三种。
6.3 HTTP协议与接口测试:状态码和请求方法
接口测试相关的笔试题,核心还是HTTP协议基础。常考的状态码有:
- 200:请求成功
- 301:永久重定向
- 302:临时重定向
- 400:客户端请求语法错误
- 401:未认证
- 403:服务器拒绝执行,已认证但无权限
- 404:资源不存在
- 500:服务器内部错误
- 502:网关错误
- 503:服务不可用
这里特别容易混的是401和403。401是“你是谁?”(未认证),403是“我知道你是谁,但你不许进来”(无权限)。笔试里经常会出一个场景让你判断返回什么状态码,比如“用户未登录访问需认证的接口”应该返回401,“普通用户访问管理员接口”应该返回403。
请求方法方面,GET和POST的区别是经典题。GET参数放在URL中,长度受限,主要用于查询;POST参数放在请求体中,适合提交大量数据。还有几个容易被忽略的:PUT(更新资源)、DELETE(删除资源)、HEAD(只获取响应头)。注意PUT和POST的区别——PUT是幂等的,执行多次和执行一次效果相同;POST不是幂等的,每次执行都可能创建新资源。
6.4 数据结构和算法:不考手写代码,但考思路
测试工程师的笔试,算法题一般不会像开发岗那样要求手撕LeetCode,但会通过选择题考察基础的数据结构知识和复杂度分析。
常见考点包括:栈和队列的区别(后进先出 vs 先进先出)、二叉树的遍历方式(前序、中序、后序、层序)、排序算法的时间复杂度、二分查找的前提条件(有序数组)等。
这里说个有意思的题:用两个栈实现一个队列。这个题目在开发笔试中也出现过,但测试笔试里它换了个问法——问入队和出队的时间复杂度。两个栈实现队列的经典做法是:入队时直接压入栈1;出队时如果栈2为空,把栈1的元素全部弹出压入栈2,然后从栈2弹出栈顶。这样入队时间复杂度O(1),出队平均时间复杂度O(1),最坏情况O(n)。
还有一个测试相关的高频考点是算法的时间复杂度分析,比如冒泡排序的时间复杂度是O(n^2),快速排序平均复杂度是O(n log n),二分查找是O(log n)。这些数字要记牢,因为题目里可能会混入“不稳定排序”或“最坏情况”等限定词,比如快速排序在最坏情况下复杂度会退化为O(n^2)。
7. 客观题避坑指南:这些细节决定你能不能进面试
7.1 题干中的绝对化用词:看到“一定”“全部”“必须”要警惕
做客观题有一个通用技巧:选项里如果出现“一定会”“完全不会”“任何情况下都”这类绝对化表述,这个选项大概率是错误的。测试领域更是如此,因为软件测试本身就充满不确定性,很少有绝对的结论。
举个例子,一道题问“关于自动化测试的描述正确的是”,选项中有一个是“自动化测试可以完全替代手工测试”,有一个是“自动化测试适合所有类型的应用”。这两项都含绝对化表述,直接排除。虽然不绝对,但大部分情况下这个技巧能帮你排除一到两个错误选项,提高蒙对概率。
7.2 多选和不定项:宁缺毋滥还是宁滥勿缺
360的笔试客观题,我记得是包含单选和多选的。多选是很多人的噩梦,因为少选、多选都不得分。策略上,如果你对某个选项不确定,建议不要选。因为多选的计分规则通常是全部选对才得分,少选一个和错选一个结果都一样是0分,那不如只选有把握的。
但要注意,有些题目会标注“至少有一个正确选项”或者“可能有一个或多个正确选项”,读题时看清楚,别拿单选的态度做多选,也别拿多选的态度做单选。我见过很多同学栽在“不定项选择”上——题目其实是单选,但因为没仔细看选项之间的关系,多选了一个,直接丢了分。
7.3 时间分配:客观题不要恋战
整份试卷里,客观题之后往往还有简答题和编程题。我的建议是:客观题部分控制在总时长的三分之一以内,遇到卡壳的题先标记,不要在一道选择题上花超过两分钟。
笔试考的不只是你会不会,还有你在有限时间内如何分配精力。一道选择题只有一两分,花五分钟去纠结,挤占了后面大题的时间,非常不划算。我自己当年考试时,客观题有大概五道题是拿不准的,全部先蒙了一个答案并做了标记,等做完后面的题再回头复查,最后复查改对了两道。
7.4 从错题中总结知识图谱,而不是背答案
很多同学复习笔试题的方法是背答案,比如“这道题选B,下一道选C”。这种做法非常低效,因为同一道题几乎不可能原封不动地出现在下一场笔试中,但知识点是会反复考的。
我建议每做完一套题,就把错题对应的知识点记到一个表格里,然后按照“测试理论/用例设计/自动化/性能/安全/网络/数据库/Linux”这几个维度分类。复习时重点看那些你反复出错的知识点——要是两套卷子都栽在“等价类划分”,说明这块理解有问题,需要回归教材重新梳理,而不是继续刷题。
我自己整理错题时用过一个简单的方法:把知识点写成问题形式,比如“边界值分析需要测哪六个点?”“V模型中系统测试对应哪个开发阶段?”然后遮住答案自己回答,答不上来的就标记为薄弱点,下一轮重点复习。这个方法比反复过一遍笔记有用得多,因为它在逼你主动回忆,而不是被动浏览。
8. 从笔试到面试:客观题结束,真正的考验才开始
客观题只是校招的第一关,通过之后还有面试,面试里问的东西反而比笔试更开放、更深入。360的面试通常会有技术面,面试官可能会让你现场设计测试用例,或者问“如何测试一个电梯”这种生活中随处可见却非常考验思路的题目。
关于这类开放性问题,笔试客观题打下的基础就派上用场了。回答“如何测试一个电梯”时,你需要把等价类划分、边界值分析、场景法这些方法结合实际场景展开:楼层选择要测的是超出范围(比如只有1到30层,输入31层)、边界值(1层、30层)、非法输入(负楼层、字母);场景法要覆盖正常乘梯、紧急呼叫、超载报警、停电困人等流程。这些思路,本质上就是在客观题中反复训练的测试思维。
所以不要觉得笔试就是背题刷题,它其实在帮你建立一个完整的测试知识体系。认真对待每一道客观题,理解它背后的原理,你收获的不只是笔试通过,还有真正入行干活时需要的基本功。
我在实际工作中带过不少校招新人,发现一个规律:笔试成绩高的人,不一定干活最稳,但基础知识扎实的人在面对新场景时,思路明显更清晰。最终你会发现,校招笔试真正折磨人的不是那几道不会做的题,而是你平时到底有没有构建起属于自己的测试思维体系。这套体系一旦建立起来,无论面试还是工作,你都会比别人走得轻松从容。