TDD:为什么,如何和现实世界测试驱动代码

首先,请跟我一起提出我所有的问题.我从来没有使用过TDD,但越来越多地意识到我应该.我已经阅读了很多帖子,如何引导TDD,但有些事情还不清楚.用于演示的大多数示例是数学计算或一些其他简单的操作.我也开始阅读Roy Osherove关于TDD的书.这里有一些问题:

如果您的解决方案中有一个对象,例如一个Account类,那么测试设置一个属性的好处(例如一个帐户名称)有什么好处,那么你断言无论你设置什么都是正确的.这会不会失败?

另一个例子,帐户余额,你创建一个平衡300的对象,那么你断言余额实际上是300.怎么会失败?我在这里测试什么?我可以看到测试一个减法操作与不同的输入参数会更好的测试.

我该怎么实际测试我的对象?方法或属性?有时您也可以在基础设施层中将对象作为服务.在方法的情况下,如果您有三层应用程序,并且业务层正在调用某些数据的数据层.在这种情况下被测试了什么?的参数?数据对象不为null?在服务的情况下呢?

接下来我关于现实生活中的问题,如果你有一个绿色的项目,并且想要开始使用TDD.你从头开始是什么?你把你的项目划分成一个特征,然后把它们分成几个,或者你实际上是任意选择你从那里去的.

例如,我有一个新项目,它需要一个登录功能.我开始创建用户测试或帐户测试或登录测试.我先从哪一个开始?我先在班上测试什么?

假设我决定创建一个具有用户名和密码以及一些其他属性的User类.我应该首先创建测试,修复所有构建错误,运行测试失败,然后再次修复以获得绿灯,然后重构.那么我应该在该类上创建的第一个测试是什么?例如,是吗?

> Username_Length_Greater_Than_6
> Username_Length_Less_Than_12
>密码_复制

如果你断言长度大于6,那么测试代码呢?我们测试如果小于6则抛出错误?

我很抱歉,如果我重复我的问题.我只是想开始使用TDD,而且我不能有一个心态的改变.谢谢,希望有人可以帮助我确定我在这里失踪了什么.顺便说一句,有谁知道有关TDD的任何讨论组或聊天,我可以加入?

看看低级BDD. This post by Dan North介绍很好.

不要测试属性,而是考虑您要查找的行为.例如:

Account Behavior:
    should allow a user to choose the account name
    should allow funds to be added to the account

User Registration Behavior:
    should ensure that all usernames are between 6 and 12 characters
    should ask the password checker if the password is complex enough <-- you'd use a mock here

这些将成为每个类的测试,“应该”成为测试名称.每个测试都是如何有价值地使用课程的例子.您不是测试方法和属性,而是显示别人(或未来的自我),为什么这个类是有价值的,以及如何安全地改变它.

我们也在BDD中做了一些叫做“外在”的东西.所以从GUI开始(或通常是控制器/演示者,因为我们不经常单元测试GUI).

您已经知道GUI将如何使用控制器.现在写一个例子.你可能会有不止一个方面的行为,所以写更多的例子,直到控制器工作.控制器将有一些你还没有编写的协作类,所以嘲笑这些 – 只是依赖通过一个接口注入它们.你可以稍后再写.

完成控制器后,用真实的代码替换您在实际系统中嘲笑的下一件事情,然后测试驱动.哦,不要打扰域名对象(如帐号) – 这将是一个痛苦的脖子 – 但是注入任何复杂的行为,并嘲笑它.

这样,你总是为每个课程编写你希望拥有的界面 – 一些易于使用的界面.您正在描述该类的行为,并提供一些如何使用它的示例.您正在使其安全,易于更改,并将出现适当的设计(随时可以通过图案,周到的常识和经验来指导).

BTW,通过登录,我倾向于找出用户想要登录的内容,然后再编码.稍后添加登录 – 它通常不是很危险的,一旦写入就不会改变太多,所以你可能甚至不需要对它进行单元测试.由你决定.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


什么是设计模式一套被反复使用、多数人知晓的、经过分类编目的、代码 设计经验 的总结;使用设计模式是为了 可重用 代码、让代码 更容易 被他人理解、保证代码 可靠性;设计模式使代码编制  真正工程化;设计模式使软件工程的 基石脉络, 如同大厦的结构一样;并不直接用来完成代码的编写,而是 描述 在各种不同情况下,要怎么解决问题的一种方案;能使不稳定依赖于相对稳定、具体依赖于相对抽象,避免引
单一职责原则定义(Single Responsibility Principle,SRP)一个对象应该只包含 单一的职责,并且该职责被完整地封装在一个类中。Every  Object should have  a single responsibility, and that responsibility should be entirely encapsulated by t
动态代理和CGLib代理分不清吗,看看这篇文章,写的非常好,强烈推荐。原文截图*************************************************************************************************************************原文文本************
适配器模式将一个类的接口转换成客户期望的另一个接口,使得原本接口不兼容的类可以相互合作。
策略模式定义了一系列算法族,并封装在类中,它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。
设计模式讲的是如何编写可扩展、可维护、可读的高质量代码,它是针对软件开发中经常遇到的一些设计问题,总结出来的一套通用的解决方案。
模板方法模式在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中,使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。
迭代器模式提供了一种方法,用于遍历集合对象中的元素,而又不暴露其内部的细节。
外观模式又叫门面模式,它提供了一个统一的(高层)接口,用来访问子系统中的一群接口,使得子系统更容易使用。
单例模式(Singleton Design Pattern)保证一个类只能有一个实例,并提供一个全局访问点。
组合模式可以将对象组合成树形结构来表示“整体-部分”的层次结构,使得客户可以用一致的方式处理个别对象和对象组合。
装饰者模式能够更灵活的,动态的给对象添加其它功能,而不需要修改任何现有的底层代码。
观察者模式(Observer Design Pattern)定义了对象之间的一对多依赖,当对象状态改变的时候,所有依赖者都会自动收到通知。
代理模式为对象提供一个代理,来控制对该对象的访问。代理模式在不改变原始类代码的情况下,通过引入代理类来给原始类附加功能。
工厂模式(Factory Design Pattern)可细分为三种,分别是简单工厂,工厂方法和抽象工厂,它们都是为了更好的创建对象。
状态模式允许对象在内部状态改变时,改变它的行为,对象看起来好像改变了它的类。
命令模式将请求封装为对象,能够支持请求的排队执行、记录日志、撤销等功能。
备忘录模式(Memento Pattern)保存一个对象的某个状态,以便在适当的时候恢复对象。备忘录模式属于行为型模式。 基本介绍 **意图:**在不破坏封装性的前提下,捕获一个对象的内部状态,并在该
顾名思义,责任链模式(Chain of Responsibility Pattern)为请求创建了一个接收者对象的链。这种模式给予请求的类型,对请求的发送者和接收者进行解耦。这种类型的设计模式属于行为
享元模式(Flyweight Pattern)(轻量级)(共享元素)主要用于减少创建对象的数量,以减少内存占用和提高性能。这种类型的设计模式属于结构型模式,它提供了减少对象数量从而改善应用所需的对象结