编码实战链
自测题
完成以下 3 道题目,检验你的学习成果
问题 1
设计重试机制时,哪些错误不应该重试?
解析:4xx 客户端错误(如参数错误、权限不足)和业务异常(如余额不足)不应该重试。网络超时、5xx 错误、连接异常通常可重试。
问题 2
断言封装的分层设计中,哪层断言可以跨项目复用?
解析:协议层断言通用性强,校验状态码、响应头、响应体结构,可跨项目复用。业务层断言根据具体业务定制,不可直接复用。
问题 3
Fixture 设计中,登录态通常应该使用什么作用域?
解析:登录态通常为 module 作用域,每个测试模块重新登录。session 用于全局共享资源(环境配置),function 用于需要隔离的资源(测试数据)。
测验结果
编码实战链
从基础工具实现到工程化封装的编码能力深度追问。这条链考察候选人的编码能力和工程化思维,从单一功能实现逐步扩展到系统级设计。
第一问
请实现一个通用的重试机制,需要考虑哪些因素?
💡 提示:从重试次数、间隔策略、异常类型、最大超时等角度回答
参考回答要点
- 错误分类:区分可重试错误(网络超时、5xx 错误、连接异常)和不可重试错误(4xx 错误、业务异常、认证失败)。建立错误分类器,根据异常类型和状态码判断。
- 退避策略:不使用固定间隔立即重试。推荐指数退避(base * 2^attempt),加上随机抖动避免惊群效应。设置最大间隔上限。
- 边界控制:设置最大重试次数(通常 3-5 次)和总体超时时间。超时后终止重试并返回错误。
- 幂等性:读操作可以放心重试,写操作需要考虑幂等性。使用幂等键或服务端去重机制。
- 可观测性:每次重试记录结构化日志(时间戳、重试次数、异常类型、退避时间)。接入监控统计重试率和成功率。
面试官考察点
- 是否理解重试的本质和适用场景
- 是否考虑了生产环境必备的保障措施
- 是否有系统稳定性意识
第二问(追问)
如何设计一个灵活的断言封装,支持多种断言方式和自定义断言?
💡 提示:考虑链式调用、软断言、断言失败继续执行等特性
参考回答要点
- 分层设计:协议层断言(状态码、响应头、schema)和业务层断言(订单状态、金额计算)分离。协议层通用可复用,业务层按项目定制。
- 错误信息:失败时必须包含实际值、预期值、字段路径、请求上下文。让排查者无需重新复现即可定位问题。
- 链式调用:支持
expect(response).status(200).body_has("data").body_eq("data.status", "success")写法。每个断言方法返回 self,维护断言结果列表。 - 软断言 vs 硬断言:硬断言失败立即停止,适合关键路径。软断言收集所有失败后统一报告,适合需要完整失败信息的场景。框架应支持两种模式。
- 扩展性:支持注册自定义断言器。通过注册器模式让业务方注册自定义断言类型,断言器基类定义统一接口。
面试官考察点
- 是否有分层设计意识
- 是否考虑了断言失败后的排查效率
- 是否设计了可扩展的框架
第三问(深度追问)
设计一个 Fixture 管理策略,如何处理测试数据的准备和清理?
💡 提示:从数据隔离、并行执行、性能优化等角度回答
参考回答要点
- 作用域选择:根据资源特性选择作用域。session 用于全局共享资源(环境配置、数据库连接),module 用于模块内共享(登录态),function 用于需要隔离的资源(测试数据)。
- 依赖管理:Fixture 可以依赖其他 Fixture,形成依赖链。依赖关系要清晰透明,在定义处用参数明确列出。
- 清理设计:使用 yield 实现前后置分离。清理要覆盖数据库回滚、文件删除、会话关闭等场景。清理顺序与准备顺序相反。
- 数据隔离:每个测试用例使用独立的数据(唯一前缀或独立 schema),避免并行执行时相互干扰。
- 性能优化:大作用域提升速度但降低隔离性,小作用域隔离性好但速度慢。根据资源特性合理选择,平衡速度与隔离性。
面试官考察点
- 是否理解 Fixture 的作用域和依赖机制
- 是否考虑了数据隔离和并行执行
- 是否有性能优化意识
第4问(终极追问)
如何设计测试框架的日志系统,便于问题定位和报告生成?
💡 提示:考虑日志级别、格式化、上下文信息、性能影响等
参考回答要点
- 日志分级:DEBUG(开发调试)、INFO(关键流程节点)、WARNING(异常但可继续)、ERROR(需要关注的错误)、CRITICAL(系统级故障)。级别使用要严格一致。
- 格式规范:统一的结构化格式(推荐 JSON)。必须包含:timestamp、level、logger、message、request_id。可选包含:trace_id、user_id、env、case_name、step、duration。
- 上下文注入:每条日志都应包含足够的上下文。请求日志:URL、方法、参数、耗时。业务日志:用例名、步骤、决策点。异常日志:异常类型、错误信息、堆栈。
- 性能考虑:级别过滤前置,低于配置级别的日志直接丢弃。使用占位符延迟格式化。异步写入,使用队列缓冲,后台线程批量刷新。
- 敏感信息:日志输出前进行脱敏处理。密码完全隐藏,身份证号/手机号中间替换为 *,银行卡号只保留后 4 位。
面试官考察点
- 是否理解日志的核心价值是问题定位效率
- 是否考虑了日志对性能的影响
- 是否有安全意识
第5问(终极追问)
请设计一个测试数据生成器,支持多种数据类型和自定义规则
💡 提示:从数据模板、随机策略、边界数据、数据关联等角度回答
参考回答要点
- 数据结构定义:用 dataclass 或 TypedDict 定义数据实体,保证字段一致性。每个实体有独立的生成器类。
- 生成模式:支持正向数据(正常场景)、边界数据(临界值)、异常数据(违规数据)三种模式。每种模式有独立的生成方法。
- Builder 模式:复杂实体使用 Builder 模式逐步构建。
OrderBuilder().with_user(user).add_item(product, qty=2).build()。 - 数据关联:处理有关联关系的数据时,先生成关联数据,确保外键关联正确。支持预创建关联数据或使用 Mock 关联。
- 可重复性:使用随机种子控制数据生成的随机性,保证测试失败时可以复现。
- 清理机制:测试结束后清理生成的数据,使用事务回滚或记录 ID 批量删除。
面试官考察点
- 是否有数据抽象和结构设计能力
- 是否考虑了数据的可复用性和可维护性
- 是否理解数据生命周期管理
追问链设计逻辑
这条链从「重试机制」→「断言封装」→「Fixture 管理」→「日志系统」→「数据生成器」逐步从单一功能扩展到系统级设计。面试官通过这条链判断候选人的编码能力、工程化思维和系统设计能力。
自测题
完成以下 3 道题目,检验你的学习成果
问题 1
设计重试机制时,哪些错误不应该重试?
解析:4xx 客户端错误(如参数错误、权限不足)和业务异常(如余额不足)不应该重试。网络超时、5xx 错误、连接异常通常可重试。
问题 2
断言封装的分层设计中,哪层断言可以跨项目复用?
解析:协议层断言通用性强,校验状态码、响应头、响应体结构,可跨项目复用。业务层断言根据具体业务定制,不可直接复用。
问题 3
Fixture 设计中,登录态通常应该使用什么作用域?
解析:登录态通常为 module 作用域,每个测试模块重新登录。session 用于全局共享资源(环境配置),function 用于需要隔离的资源(测试数据)。