ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

搜狗校招测试岗笔试复盘:场景题与测试思维实战解析

搜狗校招测试岗笔试复盘:场景题与测试思维实战解析 搜狗2020校招测试岗笔试第二场我是下午场考的。说实话第一场考完心态有点崩第二场本来不打算去了后来想想反正简历也投了多一次笔试多一次经验硬着头皮上了。结果没想到第二场的题目风格和第一场差别挺大反而让我觉得更有得写、有得复盘。先说结论搜狗这场测试笔试整体难度属于中等偏上不纯考八股文很多题是给一个具体场景让你分析怎么测、怎么设计用例、怎么排查问题。这跟很多公司直接甩一堆软件测试的定义V模型和W模型的区别那种题完全不一样它更看重你的测试思维和工程落地能力。我用了一晚上把整张卷子的考点、我做题的思路、以及后来对答案发现的问题整理了一遍尽量还原考试时的真实状态。这篇就当是给后面投搜狗或者类似互联网公司测试岗的同学一个参考尤其是那些觉得测试笔试就是背理论的人看完你应该会改变一些看法。1. 第二场笔试的试卷结构跟第一场完全不是一个路子先给个整体印象。搜狗这场笔试是在牛客网系统上做的总时长90分钟题量大概在35道左右但分布有点出人意料题型题量分值占比我的感受单选题15题约30%覆盖Linux、网络、数据结构难度中规中矩多选题8题约25%有些选项很有迷惑性少选多选都扣分编程题2题约20%不算难但输入输出处理容易踩坑场景问答题3题约25%给具体功能/项目场景让你设计测试方案这个结构其实已经透露了很多信息搜狗对测试工程师的要求不是会写测试用例就够了而是你既要有计算机基础网络、操作系统、数据结构还得有测试专业能力场景分析、用例设计、自动化、性能排查。我当时第一场考的时候单选和多选占了绝大部分问答题特别少所以第二场看到有3道大题的时候愣了一下。后来想想也合理——测试岗不考场景设计光靠背理论选ABCD根本筛不出真正干过活的人。1.1 搜狗这场笔试想筛选什么样的人从题目设计倒推一下搜狗测试笔试的重点大概是这么几个方向第一是基础扎实。计算机网络、Linux操作、数据库查询这些是测试工程师的日常工具不懂这些连bug都没法定位。第二是有测试思维不是只写输入正确数据返回正确结果这种用例而是能想到异常场景、边界场景、并发场景。第三是动手能力也就是编程题和场景题能不能把想法落成代码能不能设计出可执行的测试方案。我考完跟朋友聊大家普遍觉得选择题还能蒙一蒙场景题是真的裸奔平时没做过实际测试项目的人一下子就能看出来。1.2 时间分配的血泪教训90分钟做35道题听起来平均每题两分半但实际上完全不是这么算的。选择题里有一些是计算题比如子网掩码划分、时间复杂度推导一道题可能要算五六分钟场景题更不用说了三道大题我用了将近40分钟。我个人的建议是选择题控制在40分钟内做完遇到卡壳超过3分钟的题先标记跳过去编程题一旦看到就马上开始写场景题留到最后用剩余时间集中输出。我这次就是这么干的最后场景题虽然写得不算完美但起码每道都答满了不至于大面积空白。2. 选择题里的高频考点Linux、网络、数据结构一个都没落下第二场的选择题整体风格是偏实战、爱挖坑。我挑几个印象比较深的点展开说这些也是测试笔试里最高频的几类。2.1 Linux命令不考命令拼写考你知不知道什么时候用Linux题大概出了3到4道都不难但很讲究细节。比如有一道题问查看某个进程监听的端口号用哪个命令组合选项里有netstat -anp、ps -ef、top、lsof -i。这道题其实有两个正确答案一个是netstat -anp | grep 进程名另一个是lsof -i。单看命令本身都对但题目说最常用且能过滤端口那netstat -anp配合管道过滤就更合适。这种题就是考你平时到底用没用过而不是背没背过。还有一道题是给了一个日志文件问怎么快速找到其中包含ERROR的行数。正确做法是grep -c ERROR xxx.log但选项里混了grep ERROR xxx.log | wc -l——这个其实也数得出来只是多了一步管道。这种两个答案都能做但哪个更优的题目在搜狗的卷子里出现了好几次。提示测试笔试里遇到Linux题先别急着选看清楚题目问的是能实现还是最优实现。大多数公司在这道题上埋的坑就是让你在能用和好用之间做选择。2.2 TCP/IP和HTTP会背三次握手不够要会分析报文网络题大概有4道其中一道非常经典给出TCP三次握手的序列号变化问你第二次握手的SYN和ACK标志位分别应该是什么。这道题考的不只是三次握手的顺序而是你有没有真正理解seq和ack的数值关系——客户端发seqx服务端回复seqy, ackx1然后客户端再发seqx1, acky1。我见过很多人在这种题上翻车原因是只记了三次握手是SYN、SYNACK、ACK这个口诀但没理解每一步的序列号是怎么推出来的。测试工程师排查网络问题时经常要看抓包结果如果连序列号变化都看不懂基本没法干活。另一道HTTP题也很有代表性问HTTP/1.1中Connection: keep-alive的作用是什么——这题本身不难但选项里混了一个保持数据加密状态这是典型干扰项Connection: keep-alive跟加密没关系它只是让TCP连接不立即断开可以复用。还有一道问了Cookie和Session的区别。这个几乎是所有测试笔试必考题搜狗的考法是给一个场景用户登录后服务器重启为什么客户端还能保持登录状态答案是Session存在服务端但SessionID存在Cookie里服务器重启后Session数据丢失但Cookie里的SessionID还有效所以客户端以为还在登录实际请求时会发现Session不存在。这个场景很贴近真实测试中遇到的登录态失效bug。2.3 数据结构和算法难度不高但需要选对方法选择题里数据结构大概有4道主要考时间复杂度和基本的排序搜索。有一道题印象深刻给一个有序数组要求查找某个元素问最优时间复杂度是多少。答案是O(log n)的二分查找。但选项里有个O(n)的线性查找很多同学一看到查找就直接选了顺序查找忽略了有序数组这个前提。还有一道排序题问快速排序在最好情况下的时间复杂度这个最好情況是O(n log n)最坏是O(n²)。题目设置了一个陷阱——把最坏情况和平均情况混在一起当干扰项。其实快速排序平均和最好都是O(n log n)只有极端的逆序输入才会退化成O(n²)。这一块我的建议是复习数据结构时一定要把每个算法的最好/最坏/平均三种时间复杂度都列一遍因为笔试非常喜欢从三个复杂度里挑一个考。2.4 数据库SQL查询和索引考的是基本功数据库题出了两道一道是SELECT ... WHERE ... GROUP BY ... HAVING ... ORDER BY的执行顺序另一道是索引失效场景。执行顺序那题很多人会搞混WHERE和HAVING的执行时机。正确顺序是FROMWHEREGROUP BYHAVINGSELECTORDER BY。WHERE是在分组前过滤HAVING是在分组后过滤这个区别在测试数据库时特别重要——你查数据时如果过滤条件放错位置可能查出完全不同的结果。索引失效那题问的是哪个操作会导致索引失效选项里包括WHERE age 1 20、WHERE name LIKE 张%、WHERE id IN (1,2,3)、WHERE create_time BETWEEN 2020-01-01 AND 2020-12-31。正确答案是age 1 20因为对索引列做了计算导致优化器没法走索引。这个知识点在测试环境做数据查询时很实用你查慢的时候第一反应就应该是是不是索引没走。3. 编程题不考难题考你能不能写能跑的代码编程题一共两道都不算难但非常考验基础功。3.1 第一题字符串去重保序题目大概是给定一个字符串去除重复字符并且保持第一次出现的顺序输出。看到这道题我第一反应是用LinkedHashSet因为它正好满足去重保序两个条件。我用的Java代码大概是这样public static String removeDuplicate(String str) { if (str null || str.isEmpty()) { return ; } SetCharacter set new LinkedHashSet(); for (char c : str.toCharArray()) { set.add(c); } StringBuilder sb new StringBuilder(); for (char c : set) { sb.append(c); } return sb.toString(); }但这里有个隐藏考点题目说字符范围可能包含Unicode不一定是ASCII。如果用char遍历遇到emoji或者中文可能拆成两个char导致结果错误。我当时用的是str.codePoints()转成int再处理稳妥很多public static String removeDuplicate(String str) { if (str null || str.isEmpty()) { return ; } SetInteger seen new LinkedHashSet(); str.codePoints().forEach(seen::add); StringBuilder sb new StringBuilder(); seen.forEach(cp - sb.appendCodePoint(cp)); return sb.toString(); }注意很多笔试编程题的测试用例不会卡你Unicode但你自己心里要有数。用char遍历在绝大多数情况下没问题但一旦测试用例里有中文或特殊字符就是case没过和AC的区别。3.2 第二题字符串括号匹配这道题是经典题给定一个只包含( ) [ ] { }的字符串判断括号是否匹配。我用栈来解决public static boolean isValid(String s) { DequeCharacter stack new ArrayDeque(); MapCharacter, Character map Map.of(), (, ], [, }, {); for (char c : s.toCharArray()) { if (map.containsKey(c)) { if (stack.isEmpty() || stack.pop() ! map.get(c)) { return false; } } else { stack.push(c); } } return stack.isEmpty(); }这道题的边界条件其实就三个空字符串返回true、遍历完栈不为空返回false、遇到右括号时栈为空返回false。写的时候能覆盖这三种情况基本就稳了。不过搜狗的程序题对输入输出格式有明确要求比如输入一行字符串输出true或false但牛客网的系统里如果你用Scanner读需要注意末尾可能有换行符或空格最好trim()一下。我当时就是没trim结果有一个case怎么都过不去排查了半天才发现是输入里带了不可见字符。4. 场景问答题三道题全是实际项目里会遇到的问题这三道大题才是整场笔试的区分度所在。我复盘的时候觉得搜狗出这些题并不是指望应届生能答出完美方案而是想看你面对一个真实复杂场景时有没有一套自己的分析框架。4.1 第一题输入法候选词排序功能的测试设计搜狗是做输入法的所以第一道场景题就是搜狗输入法候选词排序功能的测试用例设计。需求描述大概是根据用户的历史输入习惯和当前上下文把候选词按概率从高到低排序前5个展示在候选栏。这道题我拿到的时候有点懵因为候选词排序听起来不是一个功能而是一个算法模型。后来我理了一下思路按照功能测试接口测试性能测试兼容性测试四个维度去拆解功能测试要覆盖的case包括正常输入拼音时候选项是否按概率降序排列用户选择了第3个候选词后这个词的权重是否提升下次排序是否前移输入上下文变化时比如打完我想再打吃候选词是否根据上下文重新排序特殊输入空串、单字符、生僻字时候选词是否为空或兜底默认排序。接口测试要关注排序接口的入参用户ID、上下文、拼音串缺失时是否返回默认候选候选词最大返回数量有没有上限接口超时或异常时前端是否有兜底展示逻辑。性能测试要关注输入法每敲一个字母都会触发候选词请求所以排序接口的响应时间必须控制在几十毫秒内否则打字会有卡顿感。兼容性测试要覆盖iOS和Android两端候选词排序逻辑是否一致不同屏幕尺寸下候选词的滚动和展示第三方输入法嵌入某些App时候选栏是否被遮挡。我写完功能测试那一部分就花了不少时间但我觉得这道题拿分的重点在于有没有想到上下文和用户行为对排序的影响也就是你能不能理解这个功能背后的算法逻辑而不只是测试表面的UI展示。经验测一个带算法模型的功能千万不要只测输入输出是否正确。你得往深了想一层——模型是依赖什么特征做决策的这些特征变化时输出会不会跟着变以及变了之后是否符合预期。4.2 第二题新闻App首页信息流的性能测试方案设计第二道场景题是新闻App首页信息流用户下拉刷新时会请求一批新内容平均响应时间要求小于1秒请设计性能测试方案。这道题其实非常考验工程能力。我当时的思路是一个完整的性能测试方案至少包含这四块环境准备用测试环境还是线上环境如果线上有真实流量怎么隔离测试数据测试机的配置要和线上一致吗这些都得在方案里写明。测试数据模拟多少用户同时刷新每个用户刷新的频率是多高是不是要模拟不同网络环境4G、Wi-Fi、弱网不同网络下响应时间肯定不一样所以测试数据要分层。监控指标除了平均响应时间还要看TP95、TP99保证绝大多数用户比平均响应时间更慢的感受、错误率、吞吐量QPS、服务端CPU和内存。仅看平均值是一个大坑因为小部分慢请求会把平均值拉高但大部分用户感受是好的。压测执行用JMeter或者Locust模拟并发先跑一个小规模的冒烟测试比如10个并发确认脚本没问题再逐步加大到100、500、1000观察系统在哪个并发量开始出现性能拐点。我当时在答题时写了一个具体的压测脚本示例用JMeter的BeanShell还是太啰嗦了我直接写的伪代码逻辑- 场景下拉刷新首页信息流 - 并发数逐步递增 10 → 50 → 100 → 200 → 500 - 每阶段持续时间5分钟 - 观察指标 - 平均响应时间 1s - TP99 2s - 错误率 0.1% - CPU 70%内存无持续增长 - 结论判定如果某阶段TP99超过2s或错误率超过0.1%记录此时并发数作为系统瓶颈这道题的另一个隐藏考点是弱网测试。手机App在生产环境里大量用户是4G网络尤其在地铁、电梯等场景网络质量很差。如果只在公司Wi-Fi下测性能结果完全不能代表线上用户真实体验。所以方案里得包含弱网工具比如Charles的Throttle设置或者网易的NetTest来模拟高延迟、高丢包。4.3 第三题接口自动化测试框架的设计思路第三道场景题是如果让你为搜狗输入法云同步服务设计一个接口自动化测试框架你会怎么做这道题我觉得是三道里最有区分度的。因为很多人可能没用过接口自动化框架只能写出用Postman测接口这种答案。但搜狗显然想招的是有工程能力的人。我的回答框架大概是这样的框架选型用Java TestNG HttpClient或者Python pytest requests因为Java在搜狗内部用得很多TestNG的依赖管理和数据驱动比较方便。用HttpClient而不是Postman是因为Postman更适合手工测试做不了断言和报表集成。用例分层基础请求层封装公共的请求方法、鉴权逻辑、业务用例层每个接口一个测试类用TestNG的DataProvider做参数化、数据层测试数据写在YAML或Excel里方便非开发同学维护。断言设计不能只断言HTTP状态码200还要断言业务字段比如response里的code是否为0、关键的data字段是否符合预期。我见过太多人接口测试只查status code结果接口返回200但业务逻辑是错的。持续集成写完用例要有CI/CD跑起来我写的是在Jenkins上配置定时任务每天凌晨跑一遍全量用例跑完发测试报告。这样出了问题能第一时间发现不需要等人来报告。数据隔离测试环境要有一套独立的测试账号和数据不能用线上数据否则测试数据污染线上会出大事故。答完之后我觉得这道题能不能拿高分不在于你用了多牛的框架而在于你有没有把数据驱动断言持续集成环境隔离这些工程化关键词说全。搜狗这场笔试不会考你某个工具的具体API而是考你有没有完整的工程视野。5. 从热搜词反推搜狗测试笔试的复习重点考完之后我顺手搜了一下搜狗2020校招测试笔试相关的内容发现其他考生回忆的考点里有几个高频词值得专门准备Appium、pytest、Jenkins、安全测试、冒烟测试、渗透测试。这些词其实对应了测试工程师日常工作的几个核心方向。我建议准备搜狗这类大厂测试笔试前重点复习这几块5.1 自动化测试Appium和pytest是标配Appium是移动端UI自动化的主流框架笔试可能不会让你写具体代码但会问它的架构原理Appium是通过WebDriver协议转发指令到手机上的UiAutomator或XCUIDriver所以它能跨平台。你只要理解客户端-服务端-设备驱动这个三层架构就能应付大部分题目。pytest是Python测试框架笔试可能考它的fixture机制、参数化pytest.mark.parametrize、插件化比如pytest-html生成测试报告。这些属于Python测试的基础常识需要会写简单的断言和fixture用法。5.2 性能和安全测试要懂基本概念性能测试的重点是压测工具JMeter、Locust和监控指标TPS、响应时间、错误率、CPU、内存这个我在场景题4.2里已经详细写了。安全测试的话测试岗笔试不会考太深的渗透技术但会问一些基础概念比如什么是SQL注入、XSS、CSRF它们有什么危害怎么在测试中简单验证。对于应届生来说知道安全测试是测什么比怎么渗透更重要。5.3 冒烟测试不知道这个面试现场会露怯冒烟测试Smoke Test这个词在笔试题里可能作为概念题出现。它的意思是每次构建出新版本后先跑一遍核心功能的主路径用例如果不通过就直接打回开发改不进入详细测试阶段。这个冒烟是一种形象说法——如果新版本连核心路径都跑不通就像电路板一上电就冒烟了根本不用再做后续测试。5.4 设备老化测试和双脉冲测试硬件测试岗才会考我在热搜词里看到了设备老化测试全自动执行脚本、双脉冲测试、内存RCD SI测试这些词这些其实是硬件测试方向的内容。搜狗如果招的是硬件测试工程师确实会涉及这些。但如果是软件测试岗大概率不会考这么深。准备笔试前先看清楚岗位JD别拿硬件测试的题去冲刺软件测试岗那就白准备了。技巧看你投的岗位是测试开发工程师还是测试工程师两者笔试侧重点完全不同。测开会更重编程和自动化测试会更重用例设计和业务理解。搜狗这场笔试题看起来是偏测试工程能力但编程题的存在意味着它也对代码能力有要求。6. 校招测试笔试备考的通用方法论从搜狗这场题反推考完搜狗这场我把前面准备其他公司笔试时用的方法也串起来整理了一下。测试校招笔试本质上逃不出下面这几类搜狗这场基本全踩了一遍6.1 计算机基础是底线不能偏科Linux命令、计算机网络、数据库、数据结构这四门课是测试笔试的四梁八柱。搜狗这场选择题大概有三分之二是这些内容。复习的时候不要只盯着一门刷每门都要过一遍。网络重点看TCP/UDP、HTTP/HTTPS、DNSLinux重点看文件操作、日志查看、进程管理、网络排查数据库重点看SQL查询、索引、事务数据结构重点看数组、链表、栈、队列、树、图的基础操作和时间复杂度。6.2 测试理论要跟场景结合不能只背概念单纯问等价类划分是什么这种题现在是越来越少了。搜狗这次是直接给你一个输入法候选词排序的功能让你设计用例。所以准备的时候要多看真实App功能或者后端接口然后用等价类、边界值、场景法、错误推测法去拆解。我自己的训练方法是打开手机里的任意一个App选一个功能比如微信的朋友圈发布用10分钟时间在纸上写尽可能多的测试用例然后对照正常流程、异常流程、边界条件、并发条件、兼容性条件这五个维度查漏补缺。练个20个功能测试思维基本就出来了。6.3 编程题刷的是手感不是题量搜狗的两道编程题都是LeetCode简单到中等难度但真正拉开差距的不是解题思路而是代码能不能一次性跑通。很多人在本地IDE写得好好的一贴到在线评测系统就各种问题Scanner没读完、输出带了调试信息、边界条件没考虑。这个没有捷径就是多练。我建议至少提前两周开始每天在牛客或LeetCode上做2-3道题重点练字符串、数组、栈/队列、哈希表这几个高频考点。测试笔试的编程题一般是用代码实现某个小功能不太会考特别复杂的动态规划或者图论。6.4 场景题要形成自己的回答框架我在4.1和4.2写到的回答结构其实就是我自己的框架功能测试、接口测试、性能测试、兼容性测试、安全测试、异常测试。这套框架的好处是不管题目给出什么样的功能我都能用这套结构去套保证不遗漏。但要注意套框架不是背模板框架里的每一个维度你都应该结合题目场景展开。比如题目给的是输入法候选词排序你就不能只说验证排序结果是否正确还要具体到用户选择某个候选词后权重如何变化这种细节。框架保证你的回答结构完整细节决定你的回答有没有深度。7. 考完复盘那些我应该在考场上做得更好的地方整理完考卷分析还得诚实面对自己踩过的坑。这场笔试我拿到了面试机会但回头看至少有四个地方如果能提前准备成绩会更好。第一个是网络报文的细节。三次握手的序列号推导我在复习时确实看懂了但考试一紧张就有点懵在草稿纸上推了两遍才敢选。这类题如果平时不亲自抓包看一下序列号变化的规律光靠背是记不牢的。第二个是SQL执行顺序。我准备的时候主要背了先WHERE再GROUP BY再HAVING但题目把ORDER BY和SELECT的执行顺序也加进来问我就有点犹豫。实际上ORDER BY是在SELECT之后执行的所以可以使用SELECT里的别名而HAVING虽然也在SELECT之前执行但在MySQL里却可以用别名这个例外容易把人搞晕。建议复习时把标准SQL和MySQL的差异单独列出来。第三个是场景题的时间分配。我三道场景题里第一道输入法候选词排序写得特别详细导致后面两道题的时间有点紧张。现在复盘的话第一道题点到为止把主要用例写出来就行把时间匀给后面的性能测试方案和自动化框架设计可能整体得分更高。第四个是编程题的输入处理。我前面提到没trim输入导致一个case没过这个真的是非常低级的错误。编试题里输入数据经常带不可见字符Scanner.nextLine()读出来的字符串最好直接trim()掉首尾空格和换行符。最后说说心态。第二场笔试跟第一场最大的区别是我没有因为第一场考砸了就摆烂每一道题都当这题我不会但我至少要写点什么来对待。尤其场景题最怕的是看到题目觉得这怎么测啊就空着你哪怕只写先测正常流程再测边界情况也比交白卷强。笔试不是要你答出满分答案而是通过你的回答看到你的思考路径。这个思路后来我面试时也一直在用。
返回列表