2026西湖龙井茶官网DTC发售:茶农直供,政府溯源防伪到农户家
当代码难以测试时,这通常是一个设计问题,而非测试问题。代码变得难以测试的原因,与其变得难以维护的原因相同。本文探讨了八种使代码更难测试的常见反模式,以及如何改进它们。虽然还存在其他反模式,但根据我编写和审查代码的经验,这些是最常见的。
请注意,这些反模式主要损害单元测试,因为单元测试的目标是隔离地测试业务逻辑片段。其他类型的测试,如集成测试和端到端测试,受到的影响可能较小,因为它们共同测试系统的较大部分。
本指南中的建议针对的是需要长期维护的生产环境代码库。将其应用于一次性脚本或临时原型则显得过于复杂且没有必要。
目录
- 前提条件:本指南中使用的术语
- 1. 硬编码依赖
- 2. 隐藏的时间和随机性
- 3. 全局可变状态
- 4. 对产生副作用的代码进行静态调用
- 5. 将业务逻辑与输入/输出(I/O)混合
- 6. 捕获并吞没异常
- 7. 被困在框架代码中的业务逻辑
- 8. 隐藏在大型工作流中的业务逻辑
- 何时无需注入依赖
- 何时使用接口,何时不使用
- 集成测试的定位
- 可测试性检查清单
- 结论
前提条件:本指南中使用的术语
- 业务逻辑:业务逻辑或领域逻辑是指定义应用程序数据如何创建、存储、更改和使用的现实世界规则,独立于基础设施或用户界面细节。
- 基础设施:与外部世界交互的代码,例如数据库、文件存储、外部应用程序编程接口(API)、消息队列和缓存。
- 依赖:类或方法为了完成其工作所需要的东西。
-
硬编码依赖:直接在代码内部创建的依赖,例如使用
new关键字。 - 依赖注入:将依赖传递给类或方法,而不是在代码中硬编码。
- 模拟对象(Mock):一种测试对象,可以替换真实的依赖,返回预设的值,并验证是否发生了预期的调用。
- 伪对象(Fake):一种简单的可用实现,用于在测试中替代真实的依赖,例如内存中的仓储实现。
- 副作用:方法除了返回值之外所做的任何事情,例如保存数据、发送电子邮件、更改状态或发出超文本传输协议(HTTP)请求。
- 确定性/非确定性代码:确定性代码对于相同的输入给出相同的输出;非确定性代码对于相同的输入可能给出不同的结果。
现在让我们来看看使代码更难测试的常见反模式,以及如何修复它们。
1. 硬编码依赖
class 订单服务 {
public void 下单(订单 订单) {
订单仓储 订单仓储实例 = new 订单仓储();
支付网关 支付网关实例 = new 支付网
免责声明:本文内容来自互联网,该文观点不代表本站观点。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,请到页面底部单击反馈,一经查实,本站将立刻删除。