我读过(并重新阅读)Martin Fowler的Mocks Are not Stubs.在其中,他定义了两种不同的TDD方法:"古典"和"模仿者".他试图回答" 我应该成为一个古典主义者还是一个嘲笑者? "这个问题,但他承认他从来没有尝试过模仿者TDD,而不仅仅是"玩具".所以我想我会问这个问题.好的答案可能会重复福勒的论点(但希望更清楚)或添加他没有想到的论点,或者其他人提出的论点,因为福勒上次在2007年1月更新了这篇论文.
我最近在谷歌测试博客中偶然发现了关于编写更多可测试代码的指南.在此之前,我与作者达成了一致意见:
优先于条件的多态性:如果你看到一个switch语句,你应该考虑多态性.如果您在班级的许多地方看到相同的if条件,您应该再次考虑多态性.多态性会将您的复杂类分解为几个较小的简单类,这些类可以清楚地定义代码的哪些部分相关并一起执行.这有助于测试,因为更简单/更小的类更容易测试.
我根本无法绕过那个.我可以理解使用多态而不是RTTI(或DIY-RTTI,视情况而定),但这看起来像是一个广泛的陈述,我无法想象它实际上在生产代码中被有效使用.在我看来,更容易为具有switch语句的方法添加其他测试用例,而不是将代码分解为几十个单独的类.
此外,我的印象是多态可能导致各种其他微妙的错误和设计问题,所以我很想知道这里的权衡是否值得.有人可以向我解释这个测试指南的确切含义吗?
我正在开发一个Spring MVC项目,我对源代码树中的所有各种组件进行了单元测试.
例如,如果我有一个HomeController需要LoginService注入的控制器,那么在我的单元测试中,HomeControllerTest我只是将对象实例化为正常(在Spring之外)并注入属性:
protected void setUp() throws Exception {
super.setUp();
//...
controller = new HomeController();
controller.setLoginService( new SimpleLoginService() );
//...
}
Run Code Online (Sandbox Code Playgroud)
这对于将每个组件作为一个独立的单元进行测试非常有用 - 除了我在项目中有几十个类,在编写一个类并为它编写成功的单元测试后,我一直忘记更新我的Spring MVC上下文文件部署的应用程序中的实际布线.我发现当我将项目部署到Tomcat并从非有线bean中找到一堆NullPointers时,我忘了更新上下文文件.
所以,这是我的问题:
这是我的第一个Spring项目 - 正如我所做的那样,为单个bean创建单元测试是正常的,然后创建第二套测试(集成测试)来测试一切是否与实际应用程序上下文一致?这是否有既定的最佳实践?
另外,如何将单元测试与集成测试分开?我有所有的源代码src,单元测试test- 应该有第二个测试文件夹(如test-integration)用于集成测试用例?
由于这是我的第一个春季项目,我很好奇其他人通常会做这类事情 - 而不是重新发明轮子我宁愿问社区其他人.
我已经阅读了很多关于TDD可以为项目带来的好处的文章,但我之前从未在自己的项目中练习过TDD.
现在我正在用Django开始一个实验项目,我想也许我可以尝试一下TDD.
但我现在发现的是,我甚至不知道如何回答"我应该在测试用例中加入什么?"的问题.
请告诉我如何在项目中规划TDD,在这种情况下,是基于Django的Web项目.
谢谢.
我试图决定是否应该使用Cuke4Nuke或SpecFlow.每个人的利弊是什么?关于哪个更好的观点和原因.
谢谢!
我正在使用phpunit和Laravel 4框架.为什么在测试期间出现PHP错误时,没有显示错误消息(例如:缺少方法)?
我们怎样才能让phpunit显示所有错误?

我们怎样才能在这个阶段引入TDD?
嘲弄似乎是要走的路.但是我们在这里需要做的嘲弄似乎太多了.听起来需要为现有的东西(BO,数据库等)工作的模拟系统开发精心设计的基础设施.
这是否意味着TDD只有从头开始才是合适的方法?我很想知道在已经成熟的产品中引入TDD的可行策略.
你可能会觉得这个问题是像这样的问题在计算器上问早.但我试图以不同的方式看待事物.
在TDD中,我们编写包含不同条件,标准,验证码的测试.如果一个班级通过了所有这些测试,我们很高兴.这是一种确保班级实际上做了它应该做的事情而不是别的事情的方法.
如果你按照Bertrand Meyers的书中逐字逐句地介绍面向对象的软件构建,那么这个类本身就有内部和外部的契约,所以它只能做它应该做的事情,而不是别的.不需要进行外部测试,因为确保合同的代码是类的一部分.
快速举例说明事情
TDD
创建测试以确保在所有情况下的值范围为(0-100)
创建一个包含传递测试的方法的类.
DBC
- 创建一个类,为该成员创建一个合同
var范围从(0-100),设置合同违约合同,定义一个方法.
我个人喜欢DBC方法.
有没有理由说纯DBC不那么受欢迎?它是语言或工具还是敏捷,还是我喜欢让代码对自己负责?
如果你认为我思考不对,我会更愿意学习.
我一直试图加入TDD的潮流已经有一段时间了,除了一件至关重要的事情之外,它一直很顺利,通常我最终做的是开发后测试.
我需要心理转变,我想知道你是如何强迫自己先写测试的?
我不是新手测试,但是对于在Django中测试不同层的一堆建议感到非常困惑.
一些人建议(并且他们是对的)避免模型中的Doctests因为它们不可维护...
其他人说不使用灯具,因为它们比辅助功能灵活性差,例如..
还有两组人在争取使用Mock对象.第一组相信使用Mock并隔离系统的其余部分,而另一组则更喜欢停止模拟 并开始测试 ..
我上面提到的,主要是关于测试模型.功能测试是另一个故事(使用test.Client()VS webTest VS等)
是否有任何可维护,可行且适当的方法来测试不同的层?
UPDATE
我知道Carl Meyer在PyCon 2012上的演讲.