上海能良武汉研发基地 - 测试工程师校招面试 Q&A
一、自我介绍类
Q1:请做一个简单的自我介绍。
参考回答:
“面试官好,我叫陈启明,昆明理工大学计算机科学与技术专业,2026届本科毕业生。
大学期间我系统学习了软件测试相关知识,具备扎实的黑盒测试方法论,能熟练运用等价类、边界值、场景法进行业务分析。技术层面,我掌握了Python + Pytest + Selenium + POM的自动化测试框架搭建,能结合Allure生成可视化报告,利用Fixture和conftest实现用例的前后置处理与数据共享。接口测试方面,我熟悉Postman进行接口调试与断言,能用JMeter做简单的性能压测。
项目方面,我有三个经历:一是在极客资讯平台做功能测试,设计了AI辅助用例生成Skill提效;二是在安享智慧理财项目独立搭建了UI自动化框架并完成接口测试,累计开发20+条核心业务自动化用例,效率提升60%;三是最近刚完成一个电商APP的手工专项测试项目,涵盖了功能、兼容性、Push消息、性能监控等专项测试。
我对电商业务非常感兴趣,能良是天音控股旗下的核心电商企业,业务覆盖全主流电商平台,技术场景复杂,对测试工程师来说是很好的成长环境。希望能有机会加入,谢谢!”
二、项目深挖类(重点!)
Q2:挑一个你最拿手的项目,详细介绍一下。
参考回答(以“安享智慧理财”为例,用STAR法则):
S(情境):这是一个金融借贷平台,涉及借款人、投资人、审核员三种角色,包含借款、投资、还款等复杂业务流程。项目前后端分离,需要保证核心链路的功能正确性和稳定性。
T(任务):我负责针对借款、投资、还款三大核心业务链路,搭建UI自动化框架并完成接口测试。
A(行动):
- 基于POM设计模式封装了Selenium基类,把页面元素定位和业务操作分离,提高代码复用性;
- 通过Pytest + Fixture管理用例执行前后的数据准备和登录态处理;
- 集成Allure生成可视化测试报告,方便团队查看执行结果;
- 使用Charles模拟弱网环境,测试APP在网络不佳时的表现;
- 根据接口文档,使用XMind梳理测试点,用Postman对核心业务接口进行调试和断言。
R(结果):累计开发了20+条核心业务自动化用例,覆盖借款、还款全链路场景。UI自动化回归效率提升了60%,用例成功率稳定在98%以上。
Q3:你项目中“效率提升60%”是怎么算出来的?
参考回答:
“60%的提升是基于对比得出的。在引入自动化之前,核心业务链路的回归测试完全靠手工执行,一轮完整的回归需要大约2小时。
搭建自动化框架后,核心业务用例全部实现自动化执行,加上Allure报告的自动生成和分析时间,一轮回归控制在48分钟左右。
具体计算是:(120分钟 - 48分钟)/ 120分钟 ≈ 60%。当然这个数字会随着用例数量的增加有所浮动,但整体上自动化确实大幅提升了回归测试的效率。”
Q4:POM分层架构你是怎么设计的?为什么要用POM?
参考回答:
“POM即Page Object Model,是我在安享智慧理财项目中采用的架构设计。主要分为三层:
Page层(页面对象层):存放每个页面的元素定位和页面操作方法。比如登录页有输入用户名、输入密码、点击登录等方法,每个方法封装了具体的元素定位和操作细节。
TestCase层(测试用例层):编写具体的测试用例,调用Page层的方法组合成业务场景。用例层只关心业务逻辑,不关心元素怎么定位。
Base层(基础层):存放Selenium的二次封装、日志、配置文件、工具方法等公共模块。
为什么要用POM:
- 当页面UI发生变化时,只需要修改Page层的定位器,测试用例层不需要改动,维护成本大幅降低;
- 测试代码可读性强,用例层读起来就像在描述业务操作;
- 代码复用率高,避免重复写元素定位代码。”
Q5:自动化用例执行失败了,你的排查思路是什么?
参考回答:
“我的排查思路分四步:
看Allure报告:先看报告里的失败截图和错误日志,初步判断是元素找不到还是断言失败。Allure会记录每一步的执行截图,能快速定位到哪一步出的问题。
检查测试环境:确认测试环境是否正常、测试数据是否被污染。有时环境问题导致页面加载慢,触发超时。
本地复现:在本地调试模式执行失败的用例,观察浏览器操作过程,看看是页面元素变化了还是业务逻辑变更导致的。
定位问题归属:如果是前端页面改版导致定位器失效,更新Page层的定位表达式;如果是后端接口返回异常,提交Bug给开发修复。修复后全量回归验证。”
Q6:你是怎么用AI生成测试用例的?“Skill”具体指什么?
参考回答:
“在极客资讯项目中,我设计了一套可复用的AI提示词模板,我称之为‘用例生成Skill’。
具体做法是:针对登录、文章发布等核心模块,我设计了Few-shot + 角色扮演模式的Prompt。我会在提示词中:
- 先设定AI的角色:‘你是一位资深测试工程师’;
- 然后给出2-3个功能描述和对应测试用例作为示例(Few-shot);
- 最后输入新的功能需求,让AI参考示例格式批量生成用例。
生成完成后,我会结合等价类、边界值等黑盒方法进行人工复核和补充,确保没有遗漏异常场景。
这套模板可以快速复用到其他模块,只要换掉功能描述就能生成一批基础用例,我再去做增量补充。单模块的用例设计时间从原来的2小时压缩到了40分钟左右。”
Q7:你用Postman怎么处理接口依赖的?
参考回答:
“在安享智慧理财项目中,很多接口需要登录后才能访问。我用Postman的变量机制来处理:
- 写一个登录接口的请求,在Tests脚本中用
pm.response.json()提取返回的token数据; - 用
pm.environment.set(‘token’, token值)将token设置为环境变量; - 后续所有需要鉴权的接口,在请求头中添加
Authorization: Bearer; - 在Collection级别的Pre-request Script中可以统一处理,确保每次执行Collection时自动完成登录和token刷新。
这样做的好处是:单接口调试时独立方便,批量执行时又能自动串联,兼顾了灵活性和自动化。”
Q8:APP测试和Web测试最大的区别是什么?
参考回答:
“最大的区别体现在三个方面:
架构不同:APP端是C/S架构,Web端是B/S架构。APP需要安装在移动设备上,Web通过浏览器访问。
测试范围不同:APP除了功能测试,还有专项测试——包括安装卸载升级、兼容性(机型/系统版本/分辨率)、交叉事件(来电/网络切换/旋转屏幕)、Push消息推送、流量/电量/CPU/内存等性能指标。Web测试相对更侧重兼容性和服务器性能。
交互方式不同:APP支持多点触控、手势、传感器等,Web主要是鼠标键盘操作。”
Q9:你用ADB做过哪些事情?
参考回答:
“在电商APP测试项目中,我使用了ADB命令行工具做辅助测试:
- 安装与卸载:用
adb install批量安装不同版本的APK,用adb uninstall卸载验证数据清除; - 日志抓取:用
adb logcat抓取APP运行日志,辅助定位崩溃和异常问题; - 稳定性测试:用
adb shell monkey执行随机事件对APP进行压测,检查是否出现ANR或崩溃; - 性能监控:用
adb shell dumpsys meminfo查看内存占用,监测是否有内存泄漏;用adb shell top实时查看CPU使用情况; - 页面信息获取:用
adb shell dumpsys window | findstr mCurrentFocus获取当前页面名称,用于启动测试和自动化定位。”
三、技术基础类
Q10:接口测试中GET和POST的区别?
参考回答:
| 对比点 | GET | POST |
|---|---|---|
| 数据位置 | 参数拼接在URL后面(Query String) | 参数在请求体中(Body) |
| 数据长度限制 | URL长度有限制(约2KB) | 理论上无限制 |
| 安全性 | 参数暴露在URL中,不安全 | 参数在Body中,相对安全 |
| 缓存 | 可以被浏览器缓存 | 默认不会被缓存 |
| 幂等性 | 幂等(多次请求结果相同) | 非幂等(多次请求可能产生不同结果) |
| 典型场景 | 查询、搜索 | 提交、创建、修改 |
面试时可以说: “GET一般用于获取数据,参数暴露在URL;POST用于提交数据,参数放在Body中。做接口测试时,我习惯结合业务场景判断用GET还是POST——比如登录接口用POST,商品列表查询用GET。”
Q11:说一下常见的HTTP状态码?
参考回答:
| 状态码 | 含义 | 举例场景 |
|---|---|---|
| 200 | 成功 | 请求成功,返回数据 |
| 301 | 永久重定向 | 网址迁移,永久跳转 |
| 302 | 临时重定向 | 临时跳转,如未登录跳转到登录页 |
| 400 | 请求错误 | 参数格式不对或缺少必传参数 |
| 401 | 未授权 | 需要登录或token过期 |
| 403 | 禁止访问 | 登录了但没权限 |
| 404 | 资源不存在 | 请求的URL不存在 |
| 500 | 服务器内部错误 | 后端代码异常 |
面试时可以说: “测试接口时,我主要关注2xx表示成功,4xx代表客户端问题(参数、鉴权),5xx代表服务端问题。发现4xx先检查自己传参,发现5xx直接提单给开发。”
Q12:Cookie和Session的区别?
参考回答:
| 对比点 | Cookie | Session |
|---|---|---|
| 存储位置 | 存储在浏览器端 | 存储在服务器端 |
| 大小限制 | 一般4KB以内 | 无明确大小限制 |
| 安全性 | 相对不安全(可被篡改) | 相对安全(存储在服务端) |
| 生命周期 | 可设置过期时间 | 一般会话结束就失效 |
| 依赖关系 | 独立存在 | 依赖Cookie存储SessionID |
面试时可以说: “Cookie是存在客户端的身份凭证,Session是存在服务端的用户状态。用户登录成功后,服务器生成Session并返回SessionID给客户端存到Cookie中,后续请求带上Cookie中的SessionID,服务器就能识别用户身份。在做接口测试时,如果涉及登录态,我通常会先获取Cookie或Token,再传递给后续接口。”
Q13:你熟悉哪些Linux命令?平时怎么用?
参考回答:
“测试工作中常用的Linux命令有这些:
| 命令 | 用途 | 测试场景举例 |
|---|---|---|
ls | 查看目录文件 | 查看日志文件是否存在 |
cd | 切换目录 | 进入日志存放目录 |
grep | 搜索文件内容 | 过滤日志中的ERROR关键字 |
find | 查找文件 | 查找指定名称的配置文件 |
tail -f | 实时查看文件末尾 | 实时监控日志输出 |
ps | 查看进程 | 查看服务进程是否在运行 |
netstat | 查看网络端口 | 确认端口是否被占用 |
mkdir/touch | 创建目录/文件 | 创建测试数据存放目录 |
实际工作中最常用的是tail -f实时看日志,和grep过滤关键字定位问题。比如服务报错时,我会用grep ERROR app.log快速找到错误信息。”
Q14:手写一个多表联查的SQL。
参考回答:
-- 场景:查询每个用户的订单数量,只显示下单超过3笔的用户
SELECT u.user_name, COUNT(o.order_id) AS order_count
FROM users u
INNER JOIN orders o ON u.user_id = o.user_id
WHERE o.order_status = '已完成'
GROUP BY u.user_id, u.user_name
HAVING COUNT(o.order_id) >= 3
ORDER BY order_count DESC;核心知识点(被追问时展开):
- INNER JOIN:取两个表的交集,只返回匹配的记录;
- GROUP BY:按用户分组,再用COUNT聚合统计订单数;
- HAVING:对分组后的结果做筛选(WHERE是对原始行做筛选);
- 执行顺序:FROM → JOIN → WHERE → GROUP BY → HAVING → SELECT → ORDER BY。
Q15:Python中没什么是Fixture?为什么用它?
参考回答:
“Fixture是Pytest中用于管理测试前置和后置操作的装饰器。在安享智慧理财项目中,我主要用它来处理登录态:
import pytest
from selenium import webdriver
@pytest.fixture(scope=“session”)
def driver():
“”“每个测试会话只创建一次浏览器驱动”“”
driver = webdriver.Chrome()
yield driver
driver.quit()
@pytest.fixture(scope=“function”)
def login(driver):
“”“每个测试函数执行前自动登录”“”
driver.get(“登录页面”)
driver.find_element(...).send_keys(“用户名”)
driver.find_element(...).send_keys(“密码”)
driver.find_element(...).click()
yield # 测试函数在这里执行
# 测试完成后清理数据使用Fixture的好处:
- 代码复用:登录逻辑只需要写一次,多个用例共享;
- 依赖管理:自动处理用例的执行顺序和依赖关系;
- 多种作用域:
session级别(整个测试会话共享)、function级别(每个用例独立),灵活控制资源的创建和销毁。”
四、测试基础与流程类
Q16:你熟悉的黑盒测试方法有哪些?举个例子。
参考回答:
“我常用的黑盒测试方法有四种:
等价类划分:把输入数据分成有效等价类和无效等价类,每类选一个代表值测试。比如登录密码要求6-20位,有效类是6-20位的密码,无效类是少于6位、多于20位、为空。
边界值分析:测试边界值最容易出错。比如密码6-20位,边界值是5位、6位、20位、21位。
场景法:模拟用户真实操作路径。比如登录场景包括:正确的用户名密码登录、密码错误登录、用户不存在登录、连续输错锁定等。
判定表:处理多条件组合。比如优惠券使用规则:订单金额、用户等级、使用平台等多个条件组合时,用判定表确保覆盖所有组合。”
Q17:完整的测试流程是怎样的?
参考回答:
“标准的企业级测试流程分为六个阶段:
- 需求分析阶段:参与需求评审,理解业务逻辑,识别测试点和风险点;
- 测试计划阶段:制定测试策略、资源排期、测试范围边界;
- 用例设计阶段:用等价类、边界值、场景法等方法设计用例,用XMind梳理脑图,进行用例评审;
- 用例执行阶段:按计划执行用例,记录测试结果;
- 缺陷跟踪阶段:发现Bug提交到禅道等管理工具,跟踪开发修复,回归验证直到关闭;
- 测试报告阶段:输出测试报告,包括用例执行情况、Bug统计、遗留风险、测试结论。”
Q18:Bug的生命周期有哪些状态?
参考回答:
“一个Bug从发现到关闭,通常经历以下状态流转:
| 状态 | 含义 | 谁操作 |
|---|---|---|
| 新建(New) | 测试刚提交,尚未确认 | 测试 |
| 已确认(Confirmed) | 开发确认是Bug | 开发 |
| 已修复(Fixed) | 开发完成修复 | 开发 |
| 待验证(Verify) | 等待测试验证 | 测试 |
| 已关闭(Closed) | 验证通过,正式关闭 | 测试 |
| 拒绝(Rejected) | 开发认为不是Bug/或无法复现 | 开发 |
| 重新打开(Reopen) | 验证不通过或复现 | 测试 |
实际工作中,重点跟踪的是‘新建→已确认→已修复→已关闭’这条主线。遇到‘拒绝’状态,要和开发沟通确认,无法达成一致时找产品经理评判。”
五、职业规划与行为类
Q19:你未来3-5年的职业规划是什么?
参考回答:
“我是从长远发展来看待这个岗位的。我的规划分两个阶段:
短期(入职后1-2年):在能良打好电商业务基础和技术功底,尽快熟悉公司的业务和技术架构,成为一个能独立负责模块的测试工程师。同时利用轮岗机会深入理解用户侧和业务侧的需求逻辑。
中期(3-5年):向测试开发方向深入发展,从‘执行测试’逐步过渡到‘设计测试框架、搭建测试平台’,成为团队中的技术骨干。如果有机会,希望在接口自动化或全链路压测方面建立更深的技术壁垒。
长期来看,我的目标是在测试技术领域深耕,但不排除向测试管理方向发展的可能——但这需要建立在扎实的技术功底之上,所以前几年我会把主要精力放在技术积累上。”
Q20:为什么选择做测试而不是开发?
参考回答:
“选择测试而不是开发,基于我对自己的认知和对测试这个岗位的理解:
视角优势:我的思维习惯是比较全面的——做测试时,我会下意识考虑各种异常情况和边界场景,而不只是‘功能能跑通就行’。这种思维模式让我更适合做质量保障工作。
用户视角:测试是离用户最近的岗位之一,能真正感受到自己工作带来的价值——保障了用户体验、拦截了线上事故。我比较享受这种‘发现问题、解决问题’带来的成就感。
测试开发的复合性:现在的测试岗位早已不是‘点点点’,而是需要写代码、搭框架的测试开发。这个岗位既能让我发挥编程能力,又比纯开发多了一层对系统整体质量的责任感。”
Q21:你的优点和缺点是什么?
参考回答:
优点:
- 自驱力强:大学期间我主动学习了自动化测试框架、接口测试、APP专项测试等多个方向,不只是跟着学校课程走,而是自己找资料、动手实践;
- 做事细致:写测试用例时会反复琢磨边界值和异常场景,发现Bug后喜欢追根究底;
- 学习速度快:从零搭建自动化框架、学ADB命令,基本都是边查边做,上手比较快。
缺点:
- 经验不足:毕竟还没正式工作过,对大型商业项目的复杂度和团队协作流程还在学习中;
- 容易过度追求完美:写用例时总想把所有场景覆盖完,有时候会在细节上花太多时间。现在会有意识地先保证核心场景覆盖,再补边缘场景。”
Q22:你对轮岗(客服1.5个月+直播1.5个月)怎么看?
参考回答:
“我理解这是能良培养校招生的特色机制,轮岗对我来说不是‘打杂’,而是真正理解业务的机会:
客服轮岗:能直接接触到用户的真实反馈和痛点——哪些功能用户最困惑、哪些报错最容易出现。这些信息对测试来说非常珍贵,能帮助我在设计用例时更贴近用户场景。
直播轮岗:能理解流量转化和用户行为逻辑,比如直播间的用户是怎么下单的、支付转化路径是怎样的。这些是我作为测试在办公室里接触不到的。
总结来说:我愿意接受轮岗,也期待通过这3个月真正理解电商业务——我相信这段经历对我以后做测试,尤其是场景覆盖和缺陷定位,是很大的加分项。”
Q23:为什么选择能良?
参考回答:
“选择能良有三点原因:
平台价值:能良是天音控股旗下的核心电商企业,业务覆盖淘宝、拼多多、京东、抖音、快手等全主流电商平台,在各大平台拥有700多家店铺。技术场景复杂、数据量庞大,对测试工程师来说是很好的成长环境。
技术导向:武汉是公司的研发基地,说明公司对技术足够重视。岗位明确是‘研发工程师-测试方向’,走的是测开路线,和我自身的技能积累和发展方向一致。
培养体系:公司有明确的校招培养机制和轮岗安排,说明愿意花时间和资源培养新人。对刚毕业的我来说,第一份工作最看重的就是‘能不能学到东西’。”
六、向面试官提问
Q24:你有什么想问我们的吗?(必备问题库)
建议选2-3个提问:
技术与发展类:
- “这个岗位的自动化测试占比大概是多少?团队目前主要使用哪些自动化框架和技术栈?”
- “测试团队目前面临的最大技术挑战是什么?”
- “公司对校招生的培养路径是怎样的?入职后会有导师带吗?”
团队与业务类: 4. “武汉研发测试团队目前有多少人?测试和开发的比例大概是多少?” 5. “测试团队是如何参与需求评审的?测试在项目中的话语权怎么样?” 6. “公司的产品迭代周期大概是多久?测试团队如何应对快速上线的压力?”
岗位细节类: 7. “定岗方向的分配是在offer时确定,还是轮岗后双向选择?” 8. “这个岗位的晋升路径大概是怎样的?从初级到高级大概需要多长时间?”
七、面试避坑提醒
| 不要这样说 | 建议改成 |
|---|---|
| “我不会,但我可以学” | “我对XX了解还不够深入,但我在XX项目中有类似经验,相信能快速上手” |
| “那个项目是练手的” | “虽然是练习项目,但我严格按照企业级标准执行了完整测试流程” |
| “开发写的Bug太多了” | “我发现问题后会积极推动开发修复,共同保障产品质量” |
| “我不想轮岗,只想写代码” | “我理解轮岗的价值,愿意通过轮岗深入理解业务” |
| “我没什么想问的” | 准备2-3个有深度的问题反问面试官 |
祝面试顺利!🍀