`
windflawlyq
  • 浏览: 4093 次
  • 性别: Icon_minigender_1
  • 来自: 厦门
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

实践TDD的点滴——如何写好TODO

阅读更多
    我觉得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方式就可以。

    以上是我的一些思路,纯粹是个人在项目中的摸索,还请大家共同指教。另外我觉得不同的软件开发,会有一些各自适用的经验,大家也可以一起贴出来交流学习。
分享到:
评论
8 楼 dilantaya 2010-05-05  
恩。。。如果要花大量时间思考如何写 test case的话,也很让纠结啊,如果后期需求变更,这些测试代码又会增加成本

现在客户需求总是在变的,我有个项目一个模块重写了4次、、、、、、、
7 楼 windflawlyq 2010-04-09  
todo list不是仅在task开发之前分解的一份静态list,而是在TDD过程中动态细化的工具。上面的todo不是我最开始的todo,而是开发完成后总的todo list。
TDD的原则是每写一段代码之前都先写一个失败的测试代码进而driven design。开发的过程需要不停的细化问题并最终成为可测的功能,这会体现在todo的列表上。过程中todo list是动态维护的,当一个问题包含了几个逻辑时进一步分解添加todo到list中,直到可以通过一两个测试来驱动完成功能。
6 楼 iaimstar 2010-03-26  

我觉得 测
引用

a)用户从下拉条选择要查看的视频机位,选择后在对应的窗口播放视频。
b)此确保同一个机位视频只订阅一次。
c)清除原有订阅的视频。
d)如果视频所在的服务器不同需要建立新的连接。如果另的窗口的视频源同一个服务地址,则只用一个连接。

足够了
5 楼 mercyblitz 2010-03-12  
windflawlyq 写道
之所以分解那么细,是希望能达到可测的级别,然后再开始TDD。另外我想说的是需求和实现是相对的,最高层的业务需求的实现就是系统功能分析,系统功能分析又是具体类设计的需求,上层功能类相对它是实现。上层功能类的进一步分解也是体现一种设计实现方法。以此类推,每一层次都自己要实现的功能,通过TDD去实现代码。

我只是想找从一份业务需求到进入TDD节奏的路径。如果这里有问题,也是在于通往TDD的这条路径或者理解TDD是否合理的问题,至于是否过渡设计,我想TDD有优点就是可以防止过渡设计。



个人认为测试是建立在需求上面的,TDD可以帮助发现过度设计,不认为能够防止,毕竟需求是置顶向下。
4 楼 windflawlyq 2010-03-11  
之所以分解那么细,是希望能达到可测的级别,然后再开始TDD。另外我想说的是需求和实现是相对的,最高层的业务需求的实现就是系统功能分析,系统功能分析又是具体类设计的需求,上层功能类相对它是实现。上层功能类的进一步分解也是体现一种设计实现方法。以此类推,每一层次都自己要实现的功能,通过TDD去实现代码。

我只是想找从一份业务需求到进入TDD节奏的路径。如果这里有问题,也是在于通往TDD的这条路径或者理解TDD是否合理的问题,至于是否过渡设计,我想TDD有优点就是可以防止过渡设计。
3 楼 freej 2010-03-11  
其实没必要做这么多前提工作,要先动手后完善,否则同样会掉入过度设计的泥潭中。
2 楼 mercyblitz 2010-03-10  
和你观点类似,粒度越细,代码越繁杂。

不过,根据个人的开发经验,有一些“显而易见”的需求TODO测试就没有必要。
1 楼 windflawlyq 2010-03-01  
我就是依据这个分解来开发的,不过TODO分解到这个程度,入手代码一样有些举动为艰的感觉。是否分解的粒度不够,还是分解的方向不正确。还期望前辈们指点。

相关推荐

    单元测试与TDD实践

    单元测试与TDD实践 **一、单元测试之测试目的** 单元测试,作为软件开发过程中的重要环节,其核心目标在于确保代码的质量、可维护性和可扩展性。它通过独立测试软件中的最小可测试单元,如函数或方法,来验证其...

    敏捷建模:极限编程和统一过程的有效实践———— 好东西!

    《敏捷建模:极限编程和统一过程的有效实践》是一本深入探讨敏捷开发方法的...对于团队而言,理解和掌握这些敏捷建模实践,不仅能够提升开发效率,还能确保项目能够适应不断变化的市场需求,从而为客户提供更好的价值。

    小案例——todo-list以及单测

    在这个“小案例——todo-list以及单测”中,我们将探讨如何构建一个简单的待办事项(Todo List)应用程序,并为其编写单元测试。单元测试是软件开发中的一个重要环节,它确保代码的各个部分按照预期工作,提高了代码...

    [测试驱动开发的三项修炼——走出TDD丛林]

    在《测试驱动开发的三项修炼——走出TDD丛林》中,作者深入探讨了如何有效地实践TDD,以提高软件质量和开发效率。以下是关于TDD的三个关键修炼: 1. **理解测试金字塔**:测试金字塔是一个指导原则,它建议我们构建...

    [测试驱动开发的三项修炼——走出TDD丛林].rar

    在《测试驱动开发的三项修炼——走出TDD丛林》中,作者深入探讨了TDD的核心理念、实践技巧以及常见误区,帮助开发者更好地理解和应用TDD。 一、TDD的基本原则 1. **红灯原则**:首先编写一个不能通过的测试用例...

    工程与技术实践-TDD中常见的10大反模式

    **问题分析**:这违反了TDD的基本原则——先写测试后写代码。这样的做法无法保证代码的正确性和可测试性。 **应对策略**: - 始终遵循红绿重构的原则,即先编写失败的测试用例,再编写通过该测试的代码。 - 培养...

    TDD测试驱动开发

    文件名中的“测试驱动开发TDD培训讲义.ppt”、“TDD_测试驱动开发.ppt”和“测试驱动开发—1.1_测试驱动开发简介.ppt”很可能包含了关于TDD的详细讲解,涵盖了TDD的概念、原则、实践技巧以及如何在实际项目中应用...

    tdd-todo-list:React应用程序中的TDD kata可以练习或进入您的测试工作流程

    TDD Todo工作流​​程片集(约1小时) 编写将使用您的应用程序的测试。 首先使用TDD编写逻辑。 稍后执行UI。 当前,Todo.test.ts中有一个失败的测试,您可以通过编写生产代码开始。 提示:我们需要在./src/api/Todo....

    TDD_In_Practice ThoughtWorks

    #### TDD——从故事开始:构建软件开发的新范式 测试驱动开发(Test-Driven Development,简称TDD),是一种敏捷软件开发方法,它强调在编写实际代码之前先编写测试用例。这种方法的核心理念在于“先写测试”,即在...

    Test Driven: Practical TDD and Acceptance TDD for Java Developers (PDF英文版)

    3. 更好的设计:TDD迫使开发者思考代码的结构,往往引导出更好的设计决策。 4. 明确需求:ATDD促进了与利益相关者的沟通,确保开发团队对需求有清晰的理解。 学习《Test Driven: Practical TDD and Acceptance TDD ...

    Ruby-TDD实战TestDrivenDevelopmentinAction

    TDD不仅有助于减少bug,还有助于设计更好的API和模块化代码。在Ruby中,由于其元编程特性,TDD可以帮助我们在早期发现潜在的设计问题,从而避免后期的重构困难。 在实际项目中,TDD也与其他实践相结合,如持续集成...

    简单之美——软件开发实践者的思考

    《简单之美——软件开发实践者的思考》一书,深入剖析了这一艺术与哲学的内涵,向我们展示了如何在纷繁复杂的IT世界中,寻找到简洁高效的软件开发之道。本书不仅为初入行业的新人提供了实用的指南,也为经验丰富的...

    UMTS-TDD手册

    本手册还提供了丰富的案例分析和实践指导,旨在帮助读者更好地理解和掌握UMTS-TDD仿真技术。例如,通过具体的场景设置,展示了如何在NS2环境中配置不同的网络参数、设置仿真场景以及分析仿真结果。此外,还包括了...

    TDD in PHP

    总的来说,TDD是一种强大的软件开发方法论,它强调先写测试后写代码,以测试来驱动开发流程。在PHP中,通过使用像PHPUnit这样的工具,开发者可以轻松地实践TDD,提高代码质量,减少后期维护的成本。随着PHP&More提供...

    TDD驱动测试开发培训

    测试驱动开发(TDD)是...迭代开发是敏捷开发的核心实践之一,它要求开发团队不断地在一系列短周期内完成产品增量的开发,每个迭代周期都包括需求分析、设计、编码、测试和回顾等步骤,TDD很好地符合了迭代开发的节奏。

    测试驱动开发的3项修炼:走出TDD丛林

    测试驱动开发(TDD)是一种敏捷...王晓毅的《测试驱动开发的3项修炼:走出TDD丛林》为读者提供了在实际开发中运用TDD的深入见解和实用技巧,帮助开发者在敏捷开发的道路上更好地实践TDD,提高软件开发的效率和质量。

    phpunit-TDD驱动开发

    为了能够顺利地使用TDD进行开发,首先需要搭建好必要的开发环境。以下是对开发环境的要求: - **PHP版本**:至少需要PHP 5.6及以上版本。 - **Composer**:用于管理项目的依赖关系。 - **Xdebug扩展**:为PHP提供...

    嵌入式 TDD

    通过对这些案例的研究,读者可以更好地理解如何将理论知识转化为实践操作。 6. **工具和技术**:为了方便开发者实施TDD,书中还列举并评价了几种常用的工具和技术,如模拟器、断言库等,这些工具能够显著提高测试...

Global site tag (gtag.js) - Google Analytics