如何开始单元测试或TDD?

CD.*_*D.. 41 tdd unit-testing

我读了很多帖子,说服我应该开始编写单元测试,我也开始使用依赖注入(Unity)以便更容易进行模拟,但我仍然不太确定我应该在哪个阶段开始编写单元测试和模拟,以及如何或从何处开始.

首选方法是在TDD方法中描述的方法之前编写单元测试吗?

单元测试有什么不同的方法或方式吗?

Mar*_*son 32

先测试/测试后:

应该注意的是,作为TDD的一部分,"先测试"与设计一样多(如果不是更多)与单元测试有关.它本身就是一种软件开发技术 - 编写测试结果可以不断改进设计.

另请注意:如果从单元测试的角度来看TDD有一个显着优势,那就是在进行TDD时编写一个错误的测试要困难得多(尽管不是不可能).如果您事先编写测试,它应该总是失败,因为测试通过所需的逻辑尚不存在.如果你之后编写测试,逻辑应该在那里,但如果测试被窃听或测试错误的东西,它可能会通过.

也就是说,如果你以前写过一个不好的测试,当你期望红色时你可能会得到绿灯(所以你知道测试是坏的).如果你之后写了一个不好的测试,当你期望一个绿色(没有意识到不好的测试)时,你会得到一个绿灯.

图书

实用的单元测试书非常值得一看,Roy Osherove的"单元测试艺术"也是如此.实用主义书更侧重于您可以尝试查找错误的不同类型的测试输入,而TAOUT涵盖了更广泛的主题,如测试双打,策略,可维护性等.这两本书都很好; 这取决于你想要的东西.

此外,这里还有一个关于Roy Osherove谈论单元测试的链接.这值得观看(他记录的一些测试评论视频也是如此,因为他指出了各种问题和注意事项以及原因).

怎么开始

没有比编写代码更好的了.找一个相当简单的类,但没有引用其他内容.然后,开始编写一些测试.

总是问自己"我想尝试用这个测试来证明什么?" 在你编写之前,给它一个合适的名称(通常涉及被调用的方法,场景和预期结果,例如在堆栈上:"Pop WhenStackIsEmpty ThrowsException").

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

  • 我试图阅读"单元测试的艺术",但在某些时候我意识到,我正在阅读如何为单元测试编写代码.但不是关于如何理解,测试应该是什么,如何理解测试内容以及如何测试(从"设计"角度而非代码).读书的整个印象就是我从中间开始读一本书,比如:"让我们跳进来,这里是嘲笑".不是一个单词,我该如何选择要测试的内容.我被它淹没了,我沮丧地把书放在一边.现在我觉得我需要学习TDD,但我知道我不会再打开"TAOUT"了 (3认同)

Ty.*_*Ty. 14

如果您对单元测试感到好奇,那么最好的方法是尝试它.您可能会首先开始编写集成测试,但这很好.当它们看起来难以维护或编写太多工作时,请阅读更多关于有哪些类型的测试(单元,功能,集成)并尝试了解其中的差异.

如果你有兴趣从TDD开始,鲍勃叔叔是一个很好的来源.Particalulary this.

更多关于单元测试

确保您获得一致的测试结果.重复运行相同的测试应该始终如一地返回相同的结果.

测试不应该要求配置.

测试顺序无关紧要.这意味着部分测试运行可以正常工作.此外,如果您牢记这一设计理念,它可能有助于您的测试创建.

请记住,任何测试都比没有测试好.在编写良好的清洁单元测试时可以找到困难,这些测试可以简化创建和维护.测试框架越难,使用它就越反对.测试是你的朋友.


The*_*rff 9

在C#和visual studio中,我发现以下过程非常有用:

  1. 认为!做一个小的前期设计.您需要清楚地了解您需要哪些类以及对象应如何相互关联.只关注一个类/对象(您要实现的类/对象)和一个关系.否则你最终会有一个太重量级的设计.我常常在一张备用的纸上画出多个草图(只有几个方框和箭头).

  2. 在生产代码中创建类并对其进行适当命名.

  3. 选择要实现的类的一种行为,并为其创建方法存根.使用visual studio创建空方法存根是件小事.

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

  5. 编译并让测试运行器显示红色条!

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

  7. 转到下一个行为.

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

  • 你需要一个清晰的图片你想要什么以及类/对象应该是什么样子.至少花一些时间.
  • 考虑类/对象的行为.这将使测试和生产代码以行为为中心,这是一种考虑类/对象的非常自然的方法.

首先测试还是先测试?

我发现将测试改装到现有的生产代码通常更难.在大多数情况下,当需要初始化被测对象时,这是由于与其他对象的纠缠不清.TDD通常会避免这种情况,因为您希望尽可能少地在测试用例中初始化对象.这将导致非常松散的耦合.

当我改进测试时,必须繁琐的工作是初始化测试对象的任务.由于纠结的依赖性,断言也可能是很多工作.为此,您需要更改生产代码并破坏依赖关系.通过正确使用依赖注入,这应该不是问题.


Fre*_*örk 7

是的,执行TDD 的首选方法是首先编写测试(正如名称Test-Driven Development所暗示的那样).当你开始使用TDD时,很难知道从哪里开始编写测试,所以我建议对它采取务实态度.毕竟,我们工作中最重要的部分是提供工作代码,而不是如何制作代码.

因此,您可以从为现有代码编写测试开始.一旦你了解了单元测试的结构,哪些看起来做得不错,哪些看起来不那么神,那么你会发现更容易深入了解测试优先的方法.我发现随着时间的推移,我首先在更大程度上编写测试.随着经验的增加,它变得更加自然.

  • 实际上,如果你想学习TDD,我建议不要先开始编写现有代码的测试.编写现有代码(没有测试)的测试通常比编写全新代码的测试要困难得多(因为它没有考虑可测试性).一旦你掌握了新代码的TDD,你就已经准备好接受没有测试的旧代码了. (13认同)
  • @Cellfish:我同意为现有代码编写好的测试可能会更难,但它可能会为您提供一个明确的起点,并且您将获得有关如何构建未来代码和单元测试的大量知识.这就像当人们(在数字时代之前)建议为初学摄影师拍摄的相机时:有人会建议"获得完全机械的并了解所有关于快门速度和光圈值的信息;然后你将完全控制",而其他人说"获得全自动的并专注于图像".这两个建议都有效,但适用于不同的人. (2认同)

TJB*_*TJB 5

史蒂夫桑德森有一篇关于TDD最佳实践的精彩文章.

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

此外,还有很多关于做ASP.net mvc项目的教程,讨论了很多TDD原则(如果你不介意沿途学习ASP.net MVC) http://www.asp.net/learn/ mvc-videos /在页面底部查找"店面"系列.

最近MOQ似乎是热门的模拟框架,你可能也想研究它

总之,尝试编写一个测试来验证您试图存档的内容,然后实现代码以使其工作.

这种模式被称为Red - Green - Refactor.还要尽力减少依赖关系,以便测试可以专注于一个组件.

就个人而言,我使用Visual Studio单元测试.我不是铁杆TDD开发者,但我喜欢做的是:

  1. 创建一个新项目并根据系统设计定义一些基本类(这样我至少可以获得一些智能感知)
  2. 创建一个单元测试项目并开始编写单元测试以满足我试图实现的功能.
  3. 让他们失败
  4. 让他们通过(实施)
  5. 重构
  6. 重复,尝试使测试更严格或创建更多测试,直到我感觉它坚实.

我也觉得在现有代码库中添加功能非常有用.如果要添加一些新功能,首先要为要添加的内容创建单元测试,逐步执行代码以查看必须更改的内容,然后再进行TDD过程.


Esk*_*ola 5

选择一个小的非关键应用程序并使用TDD实现它.起初,新的思维方式会让人觉得奇怪,但也许经过一两个星期的练习后,感觉很自然.

这是一个教程应用程序(在分支"教程"中),它显示了要编写的测试类型.在该教程中,您编写代码以传递预定义的测试用例,以便您进入节奏,然后再编写自己的测试.README文件包含说明.它是用Java编写的,但您可以轻松地将其应用于C#.