遗留代码接缝与测试替身

共 18 题
#

1. 接缝的"类型"(type)中 preprocessing seam、link seam、object seam

A preprocessing/pre-link/object 三种接缝分别在编译前、链接期、运行时改变行为,object seam 在现代语言中最常用 ✓ 正确答案
B 接缝只有一种类型
C 接缝只能通过修改源码实现
D 接缝与测试替身无关
#

2. 接缝的"识别"(identify)中哪些点可注入测试替身

A 所有代码都天然存在可用的接缝
B 从依赖调用点出发,找到接口、构造器、方法参数、工厂等可注入替身的位置 ✓ 正确答案
C 接缝只在编译期存在
D 没有接口就无法制造接缝
#

3. 接缝(seam)的"位置"(location)中编译期、链接期、对象构造期、方法调用期、拦截期

A 接缝只存在于编译期
B 接缝可位于编译期、链接期、对象构造期、方法调用期、拦截期,越靠后越灵活但常伴随更多开销 ✓ 正确答案
C 接缝位置与注入机制无关
D 所有接缝都通过 mock 实现
#

4. 测试替身(test double)的五类型中 dummy、stub、spy、mock、fake

A stub 提供预设返回值,spy 记录调用,mock 验证调用,fake 提供可运行的真实简化实现 ✓ 正确答案
B stub 用于验证调用,mock 用于提供返回值
C 五类替身完全相同
D spy 会修改真实依赖的行为
#

5. 遗留代码的"依赖隔离"(dependency breaking)中打破紧耦合的工程手法

A 依赖隔离是删除所有依赖
B 通过提取接口、参数注入、构造注入、工厂、封装调用等手段制造接缝,打破紧耦合 ✓ 正确答案
C 依赖隔离只针对数据库
D 依赖隔离无法与测试结合
#

6. 遗留代码接缝的引入顺序中面对无法快速重构的巨型函数,如何先用「提取函数 + 参数注入」制造最小接缝,再逐步放大可测试面?

A 必须先一次性重构整个巨型函数
B 接缝引入顺序与测试无关
C 巨型函数无法测试,只能重写
D 先用提取函数+参数注入制造最小接缝并测试,再逐步放大可测试面 ✓ 正确答案
#

7. 遗留系统解耦的切入点中数据访问、全局状态与长方法三条路径如何选择第一个接缝,降低首次改造风险?

A 应优先解耦全局状态
B 三条路径必须同时改造
C 优先选风险最低、改动最小的长方法提取,建立测试后再逐步处理数据访问与全局状态 ✓ 正确答案
D 首次改造无需考虑风险
#

8. intercept seam(AOP、Decorator、Proxy、动态代理)的横切关注点

A 横切关注点只能由 AOP 处理
B AOP、Decorator、Proxy、动态代理都能在运行时拦截调用处理横切关注点,并可作为测试注入接缝 ✓ 正确答案
C Decorator 会修改原代码
D 动态代理无法用于拦截
#

9. link seam(动态链接库替换)的工程应用

A link seam 在运行时替换对象
B link seam 只能修改源码实现
C link seam 在链接期通过链接不同的实现库替换依赖,常用于系统级语言测试 ✓ 正确答案
D link seam 无需链接即可生效
#

10. method seam(template method、Strategy)的运行时替换

A Template Method 通过子类覆写可变步骤、Strategy 通过注入策略对象,都提供运行时替换 ✓ 正确答案
B Template Method 用组合,Strategy 用继承
C method seam 无法在运行时替换
D Strategy 只能用于测试
#

11. object seam(依赖注入、工厂、抽象工厂)的 DI 应用

A 依赖注入、工厂、抽象工厂都让被测代码依赖抽象而非具体实现,测试时注入替身 ✓ 正确答案
B object seam 只能在编译期生效
C 构造器注入是最不推荐的方式
D 抽象工厂只能创建一个对象
#

12. 特征测试的输入覆盖设计中对行为未明的遗留代码,如何选择边界值与错误路径使特征化测试能在重构后提供可信的行为对比?

A 特征测试只需覆盖正常路径
B 输入覆盖与可信度无关
C 应覆盖边界值、错误路径与典型场景,并基于重构前实际输出固化断言,以提升行为对比可信度 ✓ 正确答案
D 特征测试无需断言
#

13. 接缝的"成本评估"中引入接缝的复杂度与收益如何权衡,哪些遗留代码不值得为其引入测试替身?

A 要权衡接缝的改造成本、维护负担与测试收益,稳定低频且封死的代码可不引入替身 ✓ 正确答案
B 所有代码都应引入接缝
C 接缝没有任何成本
D 接缝只适用于新代码
#

14. 遗留代码测试替身的选型边界中数据库、文件系统与时钟等依赖何时用真实实现、何时用替身?

A 时钟用替身保证稳定,数据库/文件系统验证逻辑用替身、验证真实行为用真实实现,按测试层级分工 ✓ 正确答案
B 所有依赖都应使用真实实现
C 所有依赖都应使用替身
D 数据库永远不能用真实实现
#

15. preprocessing seam(C 的 #ifdef)的边界

A preprocessing seam 在运行时生效
B 宏替换不会改变编译产物
C preprocessing seam 与宏无关
D `#ifdef` 在编译期通过宏替换代码,粒度较粗、易导致条件编译地狱,现代 OO 中更倾向用 object seam ✓ 正确答案
#

16. 遗留代码的测试策略中特征测试与安全网?

A 遗留代码无法测试
B 安全网与重构无关
C 特征测试只适用于新代码
D 先用特征测试固化现状行为建立安全网,再在其保护下小步重构 ✓ 正确答案
#

17. 接缝设计中依赖注入与接口提取?

A 接口提取与依赖注入会出现冲突
B 依赖注入只能用于新代码
C 先提取接口让代码依赖抽象,再通过依赖注入替换实现,共同制造可测试的接缝 ✓ 正确答案
D 接口提取后无法注入替身
#

18. 遗留代码改进的预算化中如何为高价值遗留模块设定持续改进配额,避免不敢动或大爆炸两个极端?

A 设定固定比例的小步持续改进预算,避免"不敢动"与"大爆炸"两个极端 ✓ 正确答案
B 应一次性大爆炸重构所有遗留模块
C 遗留模块应永远冻结不动
D 配额与测试无关