如何启动unit testing或TDD?

我读了很多让我相信我应该开始编写unit testing的文章,为了更容易的嘲讽,我也开始使用dependency injection(Unity),但是我还不太清楚在哪个阶段我应该开始写unit testing和嘲笑,以及如何或从哪里开始。

首选的方法是在TDD方法中描述的方法之前写unit testing吗?

unit testing有没有不同的方法或方法?

先testing/testing后:

应该指出的是,作为TDD的一部分,“testing第一”与unit testing一样,与devise一样多(如果不是更多)。 这本身就是一个软件开发技术 – 编写testing的结果是不断改进devise。

另外需要注意的是:如果从纯粹的unit testing的angular度来看TDD有一个明显的优势,那就是写一个TDDtesting是错误的(虽然不是不可能)。 如果您事先编写testing,则应始终失败,因为进行testing所需的逻辑尚不存在。 如果你之后编写testing,逻辑应该在那里,但是如果testing被窃听或testing错误的东西,它可能会通过。

也就是说,如果你之前写了一个不好的testing,当你期望一个红色的时候,你可能会得到一个绿灯(所以你知道testing是不好的)。 如果你之后写了一个不好的testing,当你预期一个绿色(不知道糟糕的testing)时,你会得到一个绿灯。

图书

实用的unit testing书很值得一看,Roy Osherove的“unit testing的艺术”也是如此。 实用的书更侧重于不同types的testinginput,你可以尝试发现错误,而TAOUT涵盖了更广泛的话题,如testing双打,策略,可维护性等。任何一本书都是好的; 这取决于你想要什么。

另外,这里是Roy Osherove在unit testing中所做的一个谈话的链接 。 值得一看(他logging的一些testing评论video也是如此,因为他指出了各种各样的问题以及原因)。

如何开始

没有比编写代码更好的了。 find一个相当简单的类,不参考其他的东西。 然后,开始写一些testing。

总是问自己:“我想用这个testing来certificate我想要做什么?” 在写它之前,给它一个体面的名字(通常涉及被调用的方法,场景和预期的结果,例如在堆栈上:“Pop WhenStackIsEmpty ThrowsException”)。

想想你可以投入的所有input,不同的方法组合,可能会产生有趣的结果等等。

如果你对unit testing感到好奇,那么最好的学习方法就是尝试一下。 你可能会开始编写集成testing,但这很好。 当他们看起来太难维护或写太多工作时,请详细阅读有关哪种testing(单元,function,集成)并尝试了解其差异。

如果你有兴趣从TDD开始,Bob叔叔是一个很好的来源。 Particalulary 这个 。

更多关于unit testing

确保您获得一致的testing结果。 重复运行相同的testing应始终返回相同的结果。

testing不应该要求configuration。

testing顺序应该不重要。 这意味着部分testing运行可以正常工作。 另外,如果你坚持这个devise理念,它可能会帮助你创buildtesting。

请记住,任何testing都比没有testing好。 编写好的简洁的unit testing可以发现难点,这样可以提高创build和维护的便利性。 testing框架越困难,使用它的反对越多。 testing是你的朋友。

在C#和Visual Studio中,我发现以下过程非常有帮助:

  1. 认为! 做一个小的前期devise。 你需要清楚地了解你需要什么类,以及对象应该如何相互关联。 只关注一个类/对象(你想实现的类/对象)和一个关系。 否则,你最终会过重的devise。 我经常会在备用纸上画出多幅草图(只有几个盒子和箭头)。

  2. 在生产代码中创build类并适当地命名。

  3. select要实现的类的一个行为,并为其创build一个方法存根。 用visual studio创build空方法存根是一块蛋糕。

  4. 为它写一个testing。 因此,您需要初始化该对象,调用该方法并进行断言来validation结果。 在最简单的情况下,断言需要生产代码中的另一个方法存根或属性。

  5. 编译并让testing跑步者向你展示红色的吧!

  6. 在生产代码中编写所需的行为以查看绿色条出现。

  7. 移到下一个行为。

对于这个过程,有两件事情非常重要:

  • 你需要一个清晰的图像,你想要什么样的类/对象应该看起来像。 至less花一点时间吧。
  • 考虑类/对象的行为。 这将使testing和生产代码以行为为中心,这是考虑类/对象的一种非常自然的方法。

先testing还是先不testing?

我发现通常难以将testing加装到现有的生产代码中。 在大多数情况下,这是由于被testing的对象需要被初始化时,与其他对象的依赖关系。 TDD通常避免这种情况,因为您希望尽可能less地在testing用例中初始化对象。 这将导致非常松散的耦合。

当我对testing进行改进时,必须进行繁琐的工作是初始化被测对象。 而且,由于纠结的依赖关系,断言可能是很多工作。 为此,您将需要更改生产代码和中断依赖关系。 通过正确使用dependency injection,这不应该是一个问题。

是的,进行TDD的首选方法是首先编写testing(正如名称Test-Driven Development所暗示的那样)。 当你开始使用TDD的时候,很难知道从哪里开始写testing,所以我build议你务必做到这一点。 毕竟,我们工作中最重要的部分是提供工作代码,而不是代码的制作。

所以你可以从编写现有代码的testing开始。 一旦你了解了unit testing的结构,哪些看起来做得很好,哪些看起来不是那么神,那么你会发现更多地倾向于testing优先的方法。 我发现,随着时间的推移,我会首先写更多的testing。 随着经验的增加,它变得更加自然。

Steve Sanderson在TDD最佳实践方面做了很好的写作。

http://feeds.codeville.net/~r/SteveCodeville/~3/DWmOM3O0M2s/

另外,还有一套很好的ASP.net mvc项目教程,讨论了很多TDD原理(如果你不介意学习ASP.net MVC) http://www.asp.net/learn/ mvc-videos /查看页面底部的“店面”系列。

MOQ似乎是最近的嘲笑框架,你也可以考虑一下

总之,尝试编写一个testing来validation你想要存档的东西,然后实现代码来使其工作。

该模式被称为红 – 绿 – 重构。 同时尽量减less依赖关系,以便testing可以集中在一个组件上。

就个人而言,我使用Visual Studiounit testing。 我不是TDD的硬派开发者,但是我喜欢做的是:

  1. 创build一个新的项目,并根据系统devise定义一些基础类(这样我至less可以得到一些智能感知)
  2. 创build一个unit testing项目,并开始编写unit testing,以满足我试图实现的function。
  3. 使他们失败
  4. 让他们通过(执行)
  5. 重构
  6. 重复,尝试使testing更严格,或创造更多的testing,直到我感觉它的坚实。

我也觉得它是非常有用的function添加到现有的代码库。 如果你想添加一些新function,首先创build你想添加的unit testing,单步执行代码,看看你有什么改变,然后通过TDD过程。

select一个小的非关键应用程序,并使用TDD来实现它。 起初,新的思维方式会感到不可思议,但也许在一两个星期的练习之后,感觉就会变得自然。

这是一个教程应用程序 (在分支“教程”),显示什么样的testing写。 在该教程中,您将编写代码来传递预定义的testing用例,以便进入节奏,然后再编写自己的testing。 自述文件包含说明。 它是用Java编写的,但是你可以很容易地将它调整到C#。

在模拟和dependency injection之前 ,我会采用TDD,testing优先开发。 可以肯定的是,嘲笑可以帮助你更好地隔离你的单元 – 从而做更好的单元testing – 但在我看来,嘲讽和DI是更先进的概念,可能会干扰首先写testing的清晰度。

嘲笑和DI有它们的位置; 他们是你的工具箱中的好工具。 但是他们比一般的初学者有更复杂的,更高级的理解。 然而,首先编写你的testing就像听起来一样简单。 所以它更容易承担,它本身是强大的(没有嘲笑和DI)。 通过首先编写无模拟testing,您将获得更早,更轻松的胜利,而不是一次尝试从模拟,TDD DI开始。

从testing第一开始; 当你对它很满意时,当你的代码告诉你你需要嘲笑, 然后采取嘲笑。

我曾经为那些unit testing/集成testing过度的公司工作,而那些做得太less的公司,我喜欢认为我在这两者之间有一个很好的平衡。

我会推荐TDD – testing驱动开发。 这确保你有良好的覆盖面,但它也一直把重点放在正确的地方和问题。

所以,对于每一个新的开发来说,首先要做的就是编写一个unit testing – 即使你没有一个类来testing。

想想你正在testing什么。 现在运行testing。 为什么不编译? 因为你需要classA。 创build类并运行testing。 为什么不编译? 因为它没有methodA。 再写一个方法并运行unit testing。 为什么testing失败? 因为methodA没有实现。 实现methodA并运行testing。 为什么会失败? 因为methodA没有返回正确的期望值…等

你继续像这样编写unit testing,然后最终testing将通过,function将完成。

史蒂夫·弗里曼的答案延伸:戴夫·阿斯特尔的书被称为“testing驱动的发展 – 实用指南”。 如果你正在编写的应用程序是一个GUI应用程序,那么这应该是有帮助的。 我读了Kent Becks的书,但我不知道如何开始TDD项目。 Astel的书籍testing – 从头到尾使用故事驱动一个完整的非平凡的GUI应用程序。 它帮助我在TDD上做了很多事情,它向我展示了在哪里以及如何开始。

testing驱动的开发可能会让初学者感到困惑,在我学习TDD的时候,我阅读的很多书都会教你如何为计算器类编写unit testing,但是构build真实世界应用程序的帮助似乎更less以数据为中心,如果我敢说。 对我来说,突破是当我了解什么是行为驱动开发或BDD,以及如何开始从外部进行testing。现在我可以build议你关注你的应用程序行为并编写unit testing来validation它。 TDD和BDD之间有很多争论,但我认为在每个级别编写完善的自动化testing增加了价值,并且写下它们,我们需要关注行为。

哈迪哈里里在这里有一个很好的职位http://hadihariri.com/2012/04/11/what-bdd-has-taughtme/

我也写了一些关于这个话题的文章,我觉得这些文章有助于理解这里所有与TDD有关的概念

http://codecooked.com/introduction-to-unit-testing-and-test-driven-development/

http://codecooked.com/different-types-of-tests-and-which-ones-to-use/

使用NUnit在C#中阅读实用unit testing 。 它具有关于开始写testing和构build代码的全面信息,使其更加适合unit testing。

如果你之前没有写过unit testing,那么只需select一些类并开始编写unit testing,并继续开发更多的unit testing。

当你获得经验的时候,你可以开始嘲笑数据库,例如,通过使用Unity框架,但是,我会build议在开始这个飞跃之前简单地开始并获得经验。

一旦你对如何编写unit testing感到满意,那么你可以尝试做TDD。

我更喜欢KentBeck的方法,在“Test by Driven Development by Example-Kent Beck”一书中很好地解释了这个方法。

从你的问题我可以推断你不确定与testing框架的工作 – select正确的testing框架的工作是非常重要的TDD或编写unit testing(一般)。

只有TDD的实际问题是“重构”(我们需要重构testing代码)也需要很多时间。

我认为Dave Astels的书仍然是最好的介绍之一。 这是为Java,但你应该能够翻译。