Skip to content

编码实战链

自测题

完成以下 3 道题目,检验你的学习成果

问题 1

设计重试机制时,哪些错误不应该重试?

问题 2

断言封装的分层设计中,哪层断言可以跨项目复用?

问题 3

Fixture 设计中,登录态通常应该使用什么作用域?

编码实战链

从基础工具实现到工程化封装的编码能力深度追问。这条链考察候选人的编码能力和工程化思维,从单一功能实现逐步扩展到系统级设计。

第一问

请实现一个通用的重试机制,需要考虑哪些因素?

💡 提示:从重试次数、间隔策略、异常类型、最大超时等角度回答

参考回答要点

  • 错误分类:区分可重试错误(网络超时、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

设计重试机制时,哪些错误不应该重试?

问题 2

断言封装的分层设计中,哪层断言可以跨项目复用?

问题 3

Fixture 设计中,登录态通常应该使用什么作用域?