自动化里断言(Assert)一般断言哪些内容?
👔 Raina面试官: 自动化里 Assert 一般断言哪些东西?是不是页面没报错就行?
🙋 候选人:
- 不是没报错就行,要断言业务结果而不只是操作成功。
- UI 层:页面标题/文案、元素状态(可见/禁用)、跳转 URL、Toast 提示、列表条数变化。接口层:HTTP 状态码、响应体字段值、schema 结构、响应时间阈值。数据层:DB 记录状态、库存/余额变化、日志和消息是否发出。
- 断言要少而精——一条 case 聚焦一个业务验收点,多个断言用 soft assert 或拆 case,失败时能一眼看出哪条业务规则破了。
👔 Raina面试官: 动态内容比如订单号怎么断言?
🙋 候选人:
- 用模式匹配而非硬编码:正则、长度范围、前缀格式。
- 或先提取再存变量,后续步骤用这个值做关联断言,验的是链路一致性而不是固定值。
如何处理弹窗、iframe、下拉框、日期控件这些难定位元素?
👔 Raina面试官: 弹窗、iframe、下拉框、日期控件这些难搞的元素,你怎么处理?
🙋 候选人:
- 难元素的处理思路是先识别类型,再切上下文,能绕 UI 就绕 UI。
- 弹窗:区分 alert(driver.switch_to.alert)和自定义 modal(等 modal 容器出现再操作内部元素);必要时用 ESC 或点遮罩关闭。iframe:switch_to.frame 切进去操作,完事 switch_to.default_content 切回。下拉框:优先 Select 类;自定义下拉用 click 展开 + 选项定位,或直接用 value 设 hidden input。日期控件:能调 API 设值就不点日历;必须 UI 操作时拆成年月日分步点选。
- 通用技巧:Playwright 的 frameLocator、shadow DOM 穿透;实在搞不定评估是否下沉到接口层断言。
👔 Raina面试官: 嵌套 iframe 两层以上呢?
🙋 候选人:
- 逐层 switch,或用 frame 的 name/id 直接定位。
- 封装成 Page 方法隐藏切换逻辑,用 try/finally 保证一定切回主文档,避免后续 case 全挂。
自动化脚本里如何做失败重试和失败截图?
👔 Raina面试官: 自动化脚本失败重试和失败截图,你们怎么做的?
🙋 候选人:
- 重试和截图要分层做:框架层统一兜底,case 层谨慎加。
- 截图:pytest hook(pytest_runtest_makereport)或 afterEach 里,失败时自动截图+保存 page source/HTML;Allure 附件 attach。重试:pytest-rerunfailures 或自写 decorator,CI 里失败重跑 1-2 次排除环境抖动;flaky case 打 tag 单独统计。
- 注意:重试不能掩盖真 bug——连续失败 N 次要 quarantine;截图路径按时间+用例名归档,CI artifact 永久存储方便回溯。
👔 Raina面试官: 重试 3 次都过了,算 pass 吗?
🙋 候选人:
- 算 pass 但要记 flaky 指标,不能当没事。
- 报告里标 rerun 次数,定期修 flaky case;P0 门禁对 rerun pass 可以 warn 甚至 block,看团队成熟度。
接口自动化框架你用过哪些?(pytest + requests / RestAssured 等)
👔 Raina面试官: 接口自动化框架你用过哪些?pytest + requests、RestAssured 这类。
🙋 候选人:
- Python 栈我最熟pytest + requests + jsonschema/Pydantic,Java 栈用过 TestNG/JUnit + RestAssured。
- pytest 优势:fixture 管前置后置、参数化、插件生态(allure、rerun、xdist 并行)。requests 轻量直接;复杂场景用 httpx 支持 async。RestAssured 链式断言可读性好,和 Java 项目集成自然。
- 框架层我会封装:BaseClient 统一 base_url/headers/token 刷新;响应断言工具;日志和报告;环境配置切换。工具选型看团队语言栈,工程化能力比框架名字重要。
👔 Raina面试官: Postman 写的接口 case 怎么和 CI 集成?
🙋 候选人:
- Newman CLI 跑 collection,或导出转 pytest/RestAssured 脚本进 Git。
- Postman 适合探索,回归集最终要版本化管理;环境变量用 CI secret 注入,别提交明文 token。
数据驱动(DDT)和关键字驱动有什么区别?
👔 Raina面试官: 数据驱动和关键字驱动,很多人混为一谈,你怎么区分?
🙋 候选人:
- 简单说:数据驱动是同逻辑多数据,关键字驱动是同关键字拼流程。
- 数据驱动(DDT):一条用例模板 + CSV/YAML/Excel 多组输入输出,pytest parametrize 或 TestNG DataProvider 实现;适合边界值、算价规则、多账号场景。关键字驱动:把操作抽象成关键字(登录、搜索、下单),用例用表格或 DSL 排列关键字序列,非开发也能维护;Robot Framework 是典型代表。
- 实际项目常组合:Page Object 封装操作,DDT 喂数据,关键字层给业务方低代码维护入口。别为了关键字而关键字——维护成本可能比直接写代码还高。
👔 Raina面试官: 小团队适合哪种?
🙋 候选人:
- 先pytest 参数化做 DDT,ROI 最高。
- 关键字驱动适合有专职业务测试写 case 且流程相对固定的团队;三人以下测试组直接代码+参数化更务实。
自动化项目里配置文件、环境切换怎么设计?
👔 Raina面试官: 自动化项目配置文件和环境切换,你怎么设计?
🙋 候选人:
- 设计原则是配置与代码分离、环境变量优先、敏感信息不入库。
- 结构:config/base.yaml 放公共项;config/dev.yaml、staging.yaml、prod.yaml 放环境差异(base_url、账号前缀、超时);.env 或 CI secret 管密码 token。切换方式:命令行 --env=staging、环境变量 TEST_ENV、或 pytest ini 配置。
- 代码里通过 Config 单例读取,禁止硬编码 URL。多环境账号用 data factory 按 env 前缀造数;prod 只跑 read-only smoke,写操作限 test/staging。
👔 Raina面试官: 本地和 CI 配置不一致导致偶发失败怎么办?
🙋 候选人:
- 统一配置源和默认值,CI 和本地读同一套 yaml 模板。
- 差异项全部走 env override;启动时打印当前 env 和 base_url,失败报告附配置快照,方便 diff。
如何保证自动化用例可独立运行、互不依赖?
👔 Raina面试官: 自动化用例怎么保证能独立跑、互相不依赖?
🙋 候选人:
- 核心是每条 case 自包含:自己造数、自己清理、不依赖执行顺序。
- 做法:fixture setup/teardown 或 API 前置造数,保证初始状态已知;用唯一前缀(时间戳+随机)避免并发冲突;禁止 case A 创建的数据给 case B 用;共享状态放 session 级 fixture 且只读。
- pytest 用独立 function scope fixture;并行跑(xdist)时必须数据隔离。发现依赖时拆成独立 case 或合并成一条端到端,别用 depends 硬串。
👔 Raina面试官: 登录态能不能全局只登一次?
🙋 候选人:
- 可以,但用session token 注入而非 UI 登录串依赖。
- 全局 fixture 调登录 API 拿 token 写 header,各 case 独立带 token 跑;UI 登录 case 单独一条验证登录功能,其他 case 不重复走 UI 登录。
App 自动化(Appium)和 Web 自动化主要差异是什么?
👔 Raina面试官: Appium 做 App 自动化和 Web 自动化,主要差异在哪?
🙋 候选人:
- 差异主要在驱动模型、元素定位、环境依赖和稳定性挑战。
- Web:浏览器标准化,DOM 稳定,Playwright/Selenium 生态成熟,auto-wait 好做。App:Android/iOS 双端,Native/WebView/Flutter 混合,用 UiAutomator2/XCUITest 驱动;定位靠 accessibility id、xpath、Android uiautomator;受设备、系统版本、安装包、权限弹窗影响大。
- App 额外要管:真机/模拟器池、WDA 稳定性、应用 reset 策略、手势操作、前后台切换。执行慢、flaky 率通常高于 Web,所以 App 自动化更聚焦 P0 主路径,细节探索性手工补。
👔 Raina面试官: 混合 App 里 H5 页面怎么测?
🙋 候选人:
- 识别 context 后switch_to.context 切 WebView,再用 Web 定位策略。
- 封装自动检测 WebView 可用;测完切回 NATIVE_APP。H5 和 Native 断言分层,别在一个 case 里混太多 context 切换。
一份好的 Bug 单应该包含哪些字段?
👔 Raina面试官: 提 Bug 的时候,你觉得一份好的缺陷单最少要有什么?
🙋 候选人:
- 好 Bug 单要让开发不用猜就能复现、能判断严重度、能追溯版本。
- 必填:标题(现象+模块)、复现步骤、实际结果 vs 期望结果、环境(版本/浏览器/账号/数据)、严重度和优先级、附件(截图/日志/录屏)。加分项:影响范围、是否阻塞、关联需求或用例 ID、初步根因猜测。
- 标题别写太泛,比如登录失败不如写 iOS 15 微信登录点击无响应。步骤要可执行,别写操作一下就不行。
👔 Raina面试官: 开发说信息不够复现不了,你怎么补?
🙋 候选人:
- 按复现三角补:步骤、数据、环境。
- 附上 HAR、接口请求响应、服务端 traceId、数据库快照。能录屏就录屏,偶现 Bug 标注概率和触发条件。目标是让开发 10 分钟内进入排查,而不是来回问测试。
Bug、Defect、Error、Failure 有什么区别?
👔 Raina面试官: Bug、Defect、Error、Failure 这几个词经常混用,你怎么区分?
🙋 候选人:
- 按发生阶段理解最清晰:Error → Defect → Failure,Bug 是口语统称。
- Error:人写代码时的失误,比如边界条件写错。Defect:Error 进入产品后的静态缺陷,代码或文档里已存在。Failure:运行时暴露的失效,用户看到崩溃、算错账。Bug 日常指 Defect 或 Failure,面试说清因果链即可。
- 测试发现的是 Failure,追溯到 Defect,根因往往是开发阶段的 Error。别纠结术语宗教战争,团队统一词典更重要。
👔 Raina面试官: 测试能发现 Error 吗?
🙋 候选人:
- 测试直接发现的是Failure 和 Defect 表现,Error 要靠代码审查、静态分析、单测在编码阶段抓。
- Shift-left 的意义就是让 Error 少变成 Defect——需求评审、设计评审、CR 都是测 Error 的延伸。
严重程度(Severity)和优先级(Priority)不一致时怎么处理?
👔 Raina面试官: Severity 和 Priority 对不上的时候,比如严重但优先级低,你怎么处理?
🙋 候选人:
- 两者独立是常态,处理原则是测试定 Severity,项目组定 Priority。
- 典型冲突:后台报表小数点偏差 Severity 高(数据错)但 Priority 低(少量用户、下版本修);首页错别字 Severity 低但 Priority 高(大促前品牌敏感)。我会在缺陷单写清技术影响和业务影响,让 PO/项目经理拍 Priority,不自己改对方的字段。
- 若开发擅自调低 Severity 逃避修复,拿 AC 和影响数据说话,必要时三方会议定夺并留痕。
👔 Raina面试官: 发布前还有 P1 Severity 但 Priority 被标 P3,你怎么办?
🙋 候选人:
- 在测试报告和发布评审里单独列出,写清风险、影响面、workaround,要求决策人签字。
- 测试职责是暴露矛盾,不是替业务做发布决定。没有书面接受风险,我会给出不建议发布的结论。
什么是缺陷逃逸?你怎么统计和降低逃逸率?
👔 Raina面试官: 缺陷逃逸是什么?你怎么统计、怎么降?
🙋 候选人:
- 逃逸指测试阶段未发现、上线后才暴露的缺陷,逃逸率是质量门禁的核心指标之一。
- 统计:逃逸数 /(测试发现数 + 逃逸数),按版本、模块、严重度拆分。数据源对齐缺陷系统标签——线上 Bug 打 production-found,回溯是否测试环境可复现、用例是否覆盖。
- 降低:逃逸复盘找根因(用例缺失、环境差异、需求变更未回归);补自动化和探索性 charter;高风险模块加结对测试;发布前对照逃逸历史 checklist。
👔 Raina面试官: 逃逸率多少算合格?
🙋 候选人:
- 没有 universal 标准,看业务容忍度和趋势。
- 核心模块 P0/P1 逃逸应趋近零;整体逃逸率逐季下降比绝对值更重要。配合缺陷密度、发布成功率一起看,单指标容易 gaming。
