测试替身与服务虚拟化

共 19 题
#

1. Mock、Stub、Fake、Spy、Dummy 五种测试替身的本质区别和使用场景?请为每种替身举一个典型应用示例。

A Stub 提供预置数据用于驱动被测逻辑,但不验证交互 ✓ 正确答案
B Mock 只提供数据,不验证调用
C Dummy 会验证交互是否发生
D Spy 与 Mock 完全等价
#

2. Stub、Spy、Mock、Fake 四类测试替身在行为验证上的本质区别与误用场景?

A Stub 主要用于行为验证
B Mock 典型用于行为验证(verify 交互),而 Stub 只供状态验证 ✓ 正确答案
C Spy 不记录任何调用
D Fake 用于记录调用并断言
#

3. Mock 过多导致的"实现耦合测试"如何识别与重构,如何以契约测试替代?

A 实现耦合测试改动内部实现时不易失败
B 契约测试用共享契约替代测试内 mock,既解耦又防止替身与真实 API 漂移 ✓ 正确答案
C Mock 越多越好,能覆盖更多分支
D 契约测试只适用于单元测试
#

4. 服务虚拟化(Service Virtualization)在微服务测试中的价值,与 Mock/Stub 的关系和差异?

A 服务虚拟化是代码级替身,与 Mock 等价
B 服务虚拟化是进程/网络级替身,模拟真实协议与故障,与代码级 Mock/Stub 互补 ✓ 正确答案
C 服务虚拟化只能用于单元测试
D 服务虚拟化不能模拟故障
#

5. WireMock/Hoverfly 在服务虚拟化中的典型模式,请求匹配策略(URL/Header/Body)、有状态场景模拟(Stateful Scenarios)和延迟注入的设计?

A 请求匹配只能按 URL 匹配
B Scenario 机制可模拟有状态流程,延迟注入可模拟慢接口/故障 ✓ 正确答案
C WireMock 不支持 Header 匹配
D 延迟注入只能用于成功响应
#

6. 契约感知(Contract-Aware)的 Mock 生成,如何基于 OpenAPI/AsyncAPI 规范自动生成测试替身,确保 Mock 行为与真实服务一致?

A 基于 OpenAPI/AsyncAPI 契约自动生成替身,可确保替身行为与真实服务一致 ✓ 正确答案
B 契约感知 Mock 与契约无关
C OpenAPI 只能描述异步事件
D 契约感知 Mock 无法校验请求
#

7. 事件驱动系统(Event-Driven Systems)中的测试替身,如何模拟消息队列(Kafka/RabbitMQ)的行为?事件顺序、重复投递和消费者组的测试策略?

A 只需 Mock 队列客户端即可覆盖所有场景
B 事件顺序无需测试
C 需覆盖事件顺序、重复投递与消费者组语义,并用真实队列容器保证投递语义真实 ✓ 正确答案
D 消费者处理重复事件是允许的,无需幂等
#

8. 服务虚拟化(WireMock/Mountebank)与真实下游联调环境的取舍,虚拟化度如何度量?

A 应"日常虚拟化 + 定期真实联调"互补,并用虚拟化度衡量覆盖决策 ✓ 正确答案
B 虚拟化越彻底越好,可完全替代真实联调
C 真实联调永远优于虚拟化
D 虚拟化度无需度量
#

9. AI 生成单元测试时,替身选择错误(如把真实依赖当 Mock)如何通过代码评审发现?

A 把真实依赖当 Mock 使用可让测试更快更稳
B 评审时应检查测试是否触真实 IO、是否 verify 真实对象,并约束 AI 用 Fake/Stub ✓ 正确答案
C AI 生成的替身选择无需人工审查
D 单元测试应尽量访问真实数据库
#

10. Mockito/pytest-mock/Vitest 等框架中 when/stub 与 verify 的职责边界,何时断言交互、何时只 stub 返回值?

A stub 用于断言交互,verify 用于返回数据
B 所有测试都应 verify 每个内部调用
C when 与 verify 可以随意互换
D 能状态验证就不行为验证,仅在协作本身是被测点时用 verify 断言交互 ✓ 正确答案
#

11. 测试替身的层级选择,对象级(Mock 对象)、进程级(WireMock/Mountebank)与容器级(Testcontainers)各自的适用场景?

A 所有测试都应使用真实服务
B 单元测试用容器级替身最合适
C 层级越高越轻越快
D 对象级用于单元、容器级用于集成、进程级用于跨服务虚拟化,按测试目标选择 ✓ 正确答案
#

12. 测试替身与测试金字塔的配合,单元层用 Mock/Stub、集成层用 Testcontainers、端到端用真实服务,各层替身策略如何避免"重单元轻集成"?

A 单元测试越多越好,集成测试可有可无
B 端到端测试应该最多
C 金字塔各层替身策略完全相同
D 用 Testcontainers/契约测试降低集成测试门槛,按金字塔分层配置替身,避免重单元轻集成 ✓ 正确答案
#

13. 替身与真实实现的漂移治理,替身行为与真实 API 不一致导致假绿,如何用契约测试(Pact)与定时真实联调对冲?

A 替身永远不会漂移
B 用 Pact 契约测试固化契约一致性,并结合定时真实联调对冲真实行为漂移 ✓ 正确答案
C 假绿无需处理
D 契约测试只能用于单元测试
#

14. 测试替身框架的实现原理,Mockito 如何用字节码/动态代理生成替身,final 类与方法为何难 mock(inline mock maker)?

A Mockito 只能 mock 接口
B Mockito 通过生成真实子类并重写方法,final 类无法被继承故需 inline mock maker 改写字节码 ✓ 正确答案
C final 类无需任何特殊处理即可 mock
D Mockito 不能 mock 类
#

15. 为什么"为新需求写 Mock"经常是危险信号?

A 新需求写 Mock 说明设计良好
B 新需求无法用真实对象测试
C Mock 越多,测试越好
D 可能反映耦合过重、边界不清,应优先用真实逻辑/Fake 驱动,仅在跨边界时再 Mock ✓ 正确答案
#

16. 过度 Mock 的反模式识别,哪些信号表明测试替身使用过度(如 Mock 链过长、Mock 与实现强耦合、测试通过但集成失败)?如何重构?

A 识别信号如 Mock 链过长、与实现强耦合、假绿,重构应转状态验证并减少对内部细节的 mock ✓ 正确答案
B Mock 链越长测试越可靠
C 测试通过即说明替身无误
D 过度 Mock 无法重构
#

17. 测试替身在并发与性能测试中的适用边界是什么?

A 性能测试应多用替身以提高性能
B 替身能反映真实并发语义
C 并发测试用替身即可覆盖所有问题
D 替身仅适用验证逻辑正确性,性能指标与真实资源语义必须用真实依赖 ✓ 正确答案
#

18. 测试替身带来的「假绿」问题,替身行为与真实实现漂移导致测试通过但生产失败,如何用契约测试与定期联调对冲?

A 假绿无法避免
B 替身永远不会与真实实现不一致
C 契约测试能覆盖所有真实行为细节
D 假绿是替身行为与真实实现漂移导致,需用契约测试与定期真实联调对冲 ✓ 正确答案
#

19. 服务虚拟化的录制-回放模式,录制真实下游响应生成虚拟服务,如何保证录制数据的脱敏与时效性?

A 录制数据可直接使用,无需脱敏
B 录制数据需脱敏保护敏感信息,并定期重新录制以保证时效性 ✓ 正确答案
C 录制数据永远不会过期
D 脱敏会破坏所有录制结构