我觉得TDD入手最重要的一个环节的就是对TODO的分解,每条TODO最终都能分析到一定的可测试的粒度,否则很难转化成测试代码。在TDD的几本书中,似乎TODO是轻而易举的事,但往往在具体项目中却让人不知如何下手。书上的例子大多都是一些纯逻辑的问题,而具体的项目往往都是数据库,UI,网络同逻辑混杂一起。而此也造成了大多TDD推行的流产。我是从事网络多媒体相关开发,在项目团队中推行TDD,发现几乎所有的开发人员TODO都不知道如何细化分解,因此我在这里通过一个具体的例子把我的分解列出来。
项目描述:
这是一个监控相关的项目。有多个现场,每个现场都有多个摄像头,客户端可以监控各个现场,同一个现场也可以从各个角度监控。客户端可以同时有多个视频窗口,每个现场都可以独立选择绑定的现场和绑定的摄像机位。
业务需求:
系统需求分解:
a)用户从下拉条选择要查看的视频机位,选择后在对应的窗口播放视频。 |
b)由于可能有多个窗口在看视频,本窗口选择的视频可能另一个窗口已经在播放了,因此确保同一个机位视频只订阅一次。 |
c)记得要清除原有订阅的视频。 |
d)如果视频所在的服务器不同需要建立新的连接。如果另的窗口的视频源同一个服务地址,则只用一个连接。 |
个人观点:系统需求分解就是将业务需求结合开发环境、架构、性能、对象生命期管理的进一步分解。
TODO:
1. (不测)切换下拉事件:如果没有机位没变化则不改变当前状态 |
2. (不测)切换下拉事件:如果机位发生变化,取消窗口同旧的视频流的绑定 |
3. (不测)切换下拉事件:如果机位发生变化,建立窗口同新的视频流的绑定 |
4. (要测)建立窗口同视频机位的绑定:如果该机位视频已经有其它的窗口订阅了,那么无需重新订阅,直接使用原有订阅,添加该视频订阅合约同窗口的关系。 |
5. (要测)建立窗口同视频机位的绑定:如果该机位视频还未订阅过,那么进行订阅。 |
6. (要测)订阅机位视频:创建或取得同该视频源的访问代理对象,订阅机位所在通道的视频流。 |
7. (要测)创建或取得同该视频源的访问代理对象:如果视频源所在的代理对象已经存在,直接返回 |
8. (要测)创建或取得同该视频源的访问代理对象:如果视频源所在的代理对象不存在,则创建,并取得同该服务器的连接,将该代理对象放入连接中。 |
9. (要测)取得同该服务器的连接:如果连接存在,直接返回 |
10. (要测)取得同该服务器的连接:如果连接不存在,则创建一个新的连接 |
11. (要测)取消窗口同旧的视频流的绑定:从订阅的节点中,移除本窗口 |
12. (要测)取消窗口同旧的视频流的绑定:如果订阅节点中的所有绑定窗口都清空了,则真正向视频源取消对应通道视频流的订阅。并清除视频源的访问代理。 |
13. (要测)清除视频源的访问代理:如果代理所在的连接器没有任何其它代理,则断开并清除连接 |
个人观点:由于1、2、3涉及到MFC的窗口控件调用,测试麻烦,固不进行测试。
个人观点:由于涉及的问题较复杂,因此TODO也是采用逐层挖掘的方式,如:
切换下拉事件
建立窗口同视频机位的绑定
如果该机位视频已经有其它的窗口订阅了
如果该机位视频还未订阅过
订阅机位视频
创建或取得同该视频源的访问代理对象
如果视频源所在的代理对象已经存在
如果视频源所在的代理对象不存在
取消窗口同旧的视频流的绑定
从订阅的节点中,移除本窗口
如果订阅节点中的所有绑定窗口都清空了
清除视频源的访问代理
个人观点:由于TDD是驱动设计,而不是保障接口的有效性测试,而此可以去测试一些private的函数。如何测private,不同语言不同,我是用c++,采用friend方式就可以。
以上是我的一些思路,纯粹是个人在项目中的摸索,还请大家共同指教。另外我觉得不同的软件开发,会有一些各自适用的经验,大家也可以一起贴出来交流学习。
分享到:
相关推荐
单元测试与TDD实践 **一、单元测试之测试目的** 单元测试,作为软件开发过程中的重要环节,其核心目标在于确保代码的质量、可维护性和可扩展性。它通过独立测试软件中的最小可测试单元,如函数或方法,来验证其...
《敏捷建模:极限编程和统一过程的有效实践》是一本深入探讨敏捷开发方法的...对于团队而言,理解和掌握这些敏捷建模实践,不仅能够提升开发效率,还能确保项目能够适应不断变化的市场需求,从而为客户提供更好的价值。
在这个“小案例——todo-list以及单测”中,我们将探讨如何构建一个简单的待办事项(Todo List)应用程序,并为其编写单元测试。单元测试是软件开发中的一个重要环节,它确保代码的各个部分按照预期工作,提高了代码...
在《测试驱动开发的三项修炼——走出TDD丛林》中,作者深入探讨了如何有效地实践TDD,以提高软件质量和开发效率。以下是关于TDD的三个关键修炼: 1. **理解测试金字塔**:测试金字塔是一个指导原则,它建议我们构建...
在《测试驱动开发的三项修炼——走出TDD丛林》中,作者深入探讨了TDD的核心理念、实践技巧以及常见误区,帮助开发者更好地理解和应用TDD。 一、TDD的基本原则 1. **红灯原则**:首先编写一个不能通过的测试用例...
**问题分析**:这违反了TDD的基本原则——先写测试后写代码。这样的做法无法保证代码的正确性和可测试性。 **应对策略**: - 始终遵循红绿重构的原则,即先编写失败的测试用例,再编写通过该测试的代码。 - 培养...
文件名中的“测试驱动开发TDD培训讲义.ppt”、“TDD_测试驱动开发.ppt”和“测试驱动开发—1.1_测试驱动开发简介.ppt”很可能包含了关于TDD的详细讲解,涵盖了TDD的概念、原则、实践技巧以及如何在实际项目中应用...
TDD Todo工作流程片集(约1小时) 编写将使用您的应用程序的测试。 首先使用TDD编写逻辑。 稍后执行UI。 当前,Todo.test.ts中有一个失败的测试,您可以通过编写生产代码开始。 提示:我们需要在./src/api/Todo....
#### TDD——从故事开始:构建软件开发的新范式 测试驱动开发(Test-Driven Development,简称TDD),是一种敏捷软件开发方法,它强调在编写实际代码之前先编写测试用例。这种方法的核心理念在于“先写测试”,即在...
3. 更好的设计:TDD迫使开发者思考代码的结构,往往引导出更好的设计决策。 4. 明确需求:ATDD促进了与利益相关者的沟通,确保开发团队对需求有清晰的理解。 学习《Test Driven: Practical TDD and Acceptance TDD ...
TDD不仅有助于减少bug,还有助于设计更好的API和模块化代码。在Ruby中,由于其元编程特性,TDD可以帮助我们在早期发现潜在的设计问题,从而避免后期的重构困难。 在实际项目中,TDD也与其他实践相结合,如持续集成...
《简单之美——软件开发实践者的思考》一书,深入剖析了这一艺术与哲学的内涵,向我们展示了如何在纷繁复杂的IT世界中,寻找到简洁高效的软件开发之道。本书不仅为初入行业的新人提供了实用的指南,也为经验丰富的...
本手册还提供了丰富的案例分析和实践指导,旨在帮助读者更好地理解和掌握UMTS-TDD仿真技术。例如,通过具体的场景设置,展示了如何在NS2环境中配置不同的网络参数、设置仿真场景以及分析仿真结果。此外,还包括了...
总的来说,TDD是一种强大的软件开发方法论,它强调先写测试后写代码,以测试来驱动开发流程。在PHP中,通过使用像PHPUnit这样的工具,开发者可以轻松地实践TDD,提高代码质量,减少后期维护的成本。随着PHP&More提供...
测试驱动开发(TDD)是...迭代开发是敏捷开发的核心实践之一,它要求开发团队不断地在一系列短周期内完成产品增量的开发,每个迭代周期都包括需求分析、设计、编码、测试和回顾等步骤,TDD很好地符合了迭代开发的节奏。
测试驱动开发(TDD)是一种敏捷...王晓毅的《测试驱动开发的3项修炼:走出TDD丛林》为读者提供了在实际开发中运用TDD的深入见解和实用技巧,帮助开发者在敏捷开发的道路上更好地实践TDD,提高软件开发的效率和质量。
为了能够顺利地使用TDD进行开发,首先需要搭建好必要的开发环境。以下是对开发环境的要求: - **PHP版本**:至少需要PHP 5.6及以上版本。 - **Composer**:用于管理项目的依赖关系。 - **Xdebug扩展**:为PHP提供...
通过对这些案例的研究,读者可以更好地理解如何将理论知识转化为实践操作。 6. **工具和技术**:为了方便开发者实施TDD,书中还列举并评价了几种常用的工具和技术,如模拟器、断言库等,这些工具能够显著提高测试...