Files

68 lines
4.1 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
id: frontend.fe-testing-perf.interview
title: 前端测试与性能面试题
type: interview
domain: frontend
stack: [fe-testing-perf]
tags: [测试, 性能优化, Web Vitals, 面试]
level: intermediate
related: [frontend.fe-testing-perf.testing, frontend.fe-testing-perf.web-vitals]
week: [7, 16]
---
# 前端测试与性能面试题
## 基础
### 【基础】单元测试、组件测试、端到端测试的区别?
**参考答案**:单元测试验证函数和模块,快、数量多;组件测试在模拟 DOM 中验证组件与用户交互的行为;端到端测试在真实浏览器中走完整业务流程,最接近用户但慢且脆弱,只覆盖关键路径。
**追问**:你们项目各层大概怎么分配?→ 以单元和组件测试为主,端到端只覆盖登录、下单、核心流程等少量用例。
### 【基础】LCP、INP、CLS 分别是什么?
**参考答案**:LCP 衡量加载(最大内容渲染时间,良好 ≤ 2.5 秒);INP 衡量交互响应(良好 ≤ 200 毫秒);CLS 衡量视觉稳定性(良好 ≤ 0.1)。按 75 分位评估。
**追问**:INP 和 FID 的区别?→ FID 只测第一次交互的输入延迟;INP 考察整个访问期间的交互,并包含处理和渲染时间,2024 年起取代 FID。
### 【基础】怎么测试带防抖的组件?
**参考答案**:使用假定时器,触发多次输入后推进时间,断言请求只发一次且参数是最后一次输入;推进时间要包在 `act` 中让状态更新生效。
**追问**:为什么不用真实等待?→ 慢且不稳定,CI 机器负载高时容易超时。
## 进阶
### 【进阶】Testing Library 为什么推荐用 `getByRole` 查找元素?
**参考答案**:贴近用户和辅助技术的使用方式,不依赖实现细节(类名、结构),重构时测试稳定;同时倒逼组件有正确的语义和可访问性。
**追问**:什么时候用 `data-testid`?→ 实在没有语义化的查找方式时作为最后的选择。
### 【进阶】页面交互卡顿怎么排查和优化?
**参考答案**:用性能面板录制交互,找长任务和调用栈;看是否大量重新渲染、同步计算过重、布局抖动。优化:切分任务让出主线程、Web Worker、虚拟列表、减小渲染范围、防抖节流、React 的并发特性。
**追问**:线上怎么发现?→ RUM 采集 INP 和长任务,按页面和版本聚合。
### 【进阶】端到端测试不稳定(时好时坏)怎么办?
**参考答案**:使用自动等待的定位器和断言而不是固定等待;隔离测试数据(每个用例自己准备数据或拦截接口);避免用例之间共享状态;失败时保存截图、录像和 trace 方便排查;对确实不稳定的用例标记并修复,而不是无限重试。
**追问**:怎么让 CI 跑得快?→ 并行、分片执行,只在关键流程上跑全量浏览器矩阵。
## 场景题
### 【场景题】客服工作台“越用越卡”,你怎么治理并防止退化?
**参考答案**:RUM 采集定位最差页面 → 性能面板找长任务 → 针对性优化(虚拟列表、流式输出批量渲染、状态拆分)→ CI 中加 Lighthouse 和体积预算、关键逻辑测试 → 用 75 分位前后对比汇报。详见[性能治理场景](scenarios/perf-regression.md)。
**追问**:“越用越卡”还可能是什么原因?→ 内存泄漏:事件监听、定时器、订阅没有清理,缓存无限增长;用内存快照对比排查。
### 【场景题】AI 帮你写了一个组件,你怎么证明它是对的?
**参考答案**:先写清楚预期行为(包括边界:空输入、失败、竞态),为这些行为写测试;运行测试,并故意破坏关键逻辑(例如删除中止请求的代码)确认测试会失败——证明测试有效;再做类型检查、代码审查和手动验证。
**追问**:如何把这个过程作为面试材料?→ 保留会话记录(脱敏)、测试代码、失败和通过的输出,作为“AI 编程 + 验证方法”的案例,见 [AI 编程专题](../../ai/ai-coding/index.md)。