很多朋友会认为企业架构是空中楼阁,因为摸不到。它是一巨庞大的方法体系,是的,它就如重力一般,你看不到,但它无时无刻不在影响着你。研究重力本身对大多数人来说不切实际,那就成了物理学家,你要研究的应该是如何在重力规律下更好的工作。这也好比一个企业里的EA凤毛菱角,只有一个,他就是那个物理学家,而大多数人要考虑如何参照他得出的物理学定律来完成工作。
那么,对大多数人来说,企业架构工作有哪些重要抓手呢?跟日常工作有哪些结合点呢?今天我们就来聊聊“TDD:测试驱动开发”,这个企业架构的好伙伴。
你看TDD这个图跟企业架构那个图是不是很像?
其业务循环逻辑是高度一致的。
TDD 与企业架构契合的关键在于通过规范化、自动化的测试流程来支持企业系统的质量、灵活性和可扩展性。
通过编写测试代码来验证代码。确保在开发初期即发现问题,并为企业架构的连续集成和持续交付提供坚实支撑。
一、那什么是TDD呢?
基于敏捷和极限编程原则,TDD 将单元测试与迭代开发和代码重构结合。其本质是通过先写测试再开发,确保每次改动都直接响应测试结果,实现自动化验证并推动代码质量提升。
也即它要解决的是先稳后快的问题,而不是现在很多企业盲目上线敏捷开发,却导致了先快后乱的问题。
它的哲学起源要追溯于1976年,Clenford Myers在《Software Reliability》中提出“黑盒测试”方法,强调从外部观察系统行为(用户视角),不依赖内部实现(工程视角)。
这是TDD的哲学起源,它帮助开发者或测试人员从用户视角审视软件:只关心系统的功能是否满足需求,不纠结于内部代码如何实现。
因此,测试人员可以通过模拟用户的实际使用场景和需求来编写测试用例,更好地检测代码中的功能性缺陷。
另外,Myers指出不应由开发人员自己负责测试自己的代码。因为开发人员在编写代码时可能会对实现方式产生循环偏见,也可能导致测试时容易忽视一些潜在的错误。黑盒测试提倡“外部视角”减少这种偏见,提供更客观的测试结果,为后续的自动化测试、单元测试和测试驱动开发等方法奠定了基础。
初步发展 (1990年):Kent Beck首次在文章《Extreme Programming》中提出TDD概念,将其引入极限编程,主张先编写测试代码,再开发功能代码,以提高代码的准确性和稳定性。
框架支持 (1991年后):Taligent等公司开发早期测试框架和“replay”工具,为TDD的实施提供了技术支持,加速了TDD的推广。
SUnit测试框架 (1994年后):SUnit框架在Smalltalk环境下的应用,与TDD的理念高度契合,提供了TDD推广的工具基础。
Mock Objects引入 (1998-2002年):Mock Objects作为模拟对象的替代工具,隔离了测试环境,推动TDD在复杂测试场景中的应用。
普及与成熟 (2000年后):Kent Beck在《Test-Driven Development: By Example》中深入阐述了TDD的核心原理及实践,为TDD的普及提供了全面的理论支持。
社区推广 (2000年后):C2.com等Wiki平台的兴起使得TDD的理念在社区中广泛传播和讨论,进一步推动了其发展与应用。
二、TDD的最佳实践:
明确需求:在编写测试前充分理解需求。
编写原子测试:单一测试聚焦特定功能,简明扼要。
从简单场景入手:优先编写简单测试用例,逐步增加复杂性。
覆盖极端情况:设计时考虑边界和极端情境,揭示潜在问题。
保持快速反馈循环:测试运行应快速,以便即时反馈。
自动化测试:使用自动化工具,确保测试结果的稳定性和一致性。
遵循“红-绿-重构”循环:通过失败(红)、通过(绿)和重构的循环来保证代码质量。
三、TDD与传统测试的区别:
方法:TDD先编写测试再开发代码,而传统测试则在代码完成后进行。
测试范围:TDD专注于小代码单元的测试,传统测试则涵盖系统的各个方面,包括集成、功能和验收测试。
迭代:TDD通过不断测试和改进小块代码来实现功能,而传统测试通常只在代码编写后进行一次性测试。
调试:TDD通过及时发现和解决错误简化调试过程;相较而言,传统测试可能在开发的后期才发现问题,增加了调试的难度。
文档:TDD文档主要关注测试用例和结果,而传统测试文档则详细记录测试流程、环境以及系统信息。
四、为什么TDD是企业架构的重要抓手?
1. 确保架构一致性和质量
在 TDD 中,开发人员在实现功能之前首先要编写测试代码,其自动化测试可以有效验证各个模块的行为是否符合架构设计和业务规范,从而帮助企业架构在不断演变和扩展时维持一致的标准和高质量。
而不是很多企业在讲的重构,重构意味着最开始就没有构建...重构因此大概率只是补漏、延缓其衰败而已、最后只能重建。
很多企业的系统集成业务为什么做不下去了?原因也在这里,其所支持的业务是衰败属性的,当其架构走向终点,也就不必再补漏了...所以系统集成本身不能当做产品业务来做,它是一种服务。
2. 支持敏捷架构和快速迭代
通过 TDD,开发团队可以更快速地进行小规模的增量式开发,验证每次改动是否符合既定的业务逻辑和架构规则,从而减少集成过程中出现的错误。这一特性特别适合需要频繁更新或扩展的企业架构,让系统能更灵活地应对业务需求变化。
也即击鼓传花,你接的时候要接的稳、放给下一个人的时候要放的稳,每个环节要控制好,在稳中求快,具备高度而顺畅的协作性。而不是大家着急忙慌的一顿乱传,单位速度是很快,但是花传掉地上了,一顿混乱着急、又开始再传、再乱...
3. 提供可靠的回归测试基础
企业架构需要确保核心系统的稳定性,即使在频繁的迭代和改进过程中。TDD 所编写的测试代码可以用作回归测试的基础,为企业架构的核心功能提供持续的验证。
这不仅简化了质量控制流程,还确保每次改动都不会破坏现有功能,这对企业系统的稳定性和可靠性至关重要。开发是迭代的、测试也是迭代的,而且测试的设计在开发前。
4. 提高代码维护性和可扩展性
TDD 也天然强调模块化和可测试性,这意味着代码更易于维护和扩展,其实这不是某一种方法的理念问题,而是这个行业的规律,一定是走向模块化的,不过不同实践以不同的角度总结出了一个基本事实而已。
对于企业架构而言,TDD 强制开发人员编写清晰、易读的代码,并保持良好的模块边界,使得不同团队之间的协作更加顺畅。
良好的测试覆盖率使得架构在未来变更时无需完全重构,从而大大降低了开发和维护成本。
5. 促进跨部门协作与流程标准化
TDD 提供了业务、开发和测试人员共同参与的标准化流程,使质量标准和开发流程一致化。
这种标准化确保业务需求得到更好的理解,并通过可重复的测试提升交付质量,有助于在企业架构层面夯实统一的开发规范,促进跨部门协作和信息共享。
领取专属 10元无门槛券
私享最新 技术干货