好吧,我知道已经有关于开始使用TDD的问题了。但是,我想我知道一般的共识就是这样做 ,但是,我似乎有以下问题让我的头脑进入游戏:

  • 使用集合时,仍然会测试显而易见的添加/删除/插入是否成功,即使基于泛型等我们有点“知道”它会起作用吗?
  • 有些测试似乎需要永远实现..比如在使用字符串输出时,是否有一种“更好”的方法来处理这类事情? (例如,在解析之前测试对象模型,将解析分解为小操作并在那里进行测试)在我看来,你应该总是测试“最终结果”,但是这可能会变化很大并且设置起来很乏味。
  • 我没有使用测试框架(工作不会支付一个)所以我可以“练习”更多。 有没有免费商用的好产品? (目前我使用的是'ol Debug.Assert :)
  • 可能是最大的..有时候我不知道会发生什么发生..我的意思是,你得到了绿灯但是我总是担心我可能会错过一个测试..你是否深入挖掘试图打破代码,或者让它等待它以后都会掉下来(这将花费更多)..

所以基本上我在这里寻找的不是“ 只是做它 ”而是“ 我做了这个,有这个问题,通过这个解决了它们 ”.. 个人经历:)

===============>>#1 票数:50 已采纳

首先,当您第一次开始尝试在编码风格中使用TDD时,感到沮丧是正常和正常的。 只是不要气馁和退出,你需要给它一些时间。 这是我们如何考虑解决代码中的问题的主要范式转变。 我喜欢把它想象成当我们从程序化编程转向面向对象编程时。

其次,我认为测试驱动开发首先是一个设计活动,用于通过创建一个首先描述它将要公开的API以及如何使用它的功能的测试来充实组件的设计。 该测试将有助于塑造和塑造被测系统,直到您能够封装足够的功能来满足您正在进行的任何任务。

考虑到上面的段落,让我们看看你的问题:

  1. 如果我在我的系统中使用集合,那么我将设置一个期望,以确保调用代码插入项目然后断言集合的计数。 我不一定在我的内部列表上测试Add方法。 我只是确保在调用添加项的方法时调用它。 我通过在我的测试框架中添加一个模拟框架来实现这一点。
  2. 测试字符串作为输出可能很乏味。 你无法解释每一个结果。 您只能根据被测系统的功能测试您的期望。 您应该始终将测试分解为它正在测试的最小元素。 这意味着你将进行大量的测试,但测试虽然小而快,只能测试它们应该做什么,没有别的。
  3. 有很多开源测试框架可供选择。 我不打算争辩哪个是最好的。 找到你喜欢的并开始使用它。
  4. 您所能做的就是设置测试以说明您想要发生的事情。 如果出现导致您的功能出现错误的情况,至少您需要测试该方案添加到测试中的功能,然后更改您的功能直到测试通过。 找到我们可能错过测试的一种方法是使用代码覆盖

我在第一个问题的答案中向你介绍了嘲弄术语。 当你为你的TDD武器库引入模拟时,它会极大地使测试更容易抽象出不属于被测系统的部分。 以下是有关模拟框架的一些资源:

除了阅读过程之外,帮助使用TDD的一种方法是观察人们这样做。 我建议观看JP Boodhoo在DNRTV播放的屏幕。 看看这些:

好的,这些将帮助您了解我引入的术语是如何使用的。 它还将引入另一个名为Resharper的工具以及它如何促进TDD过程。 在做TDD时我不能推荐这个工具。 好像您正在学习这个过程,而您只是找到了使用其他工具已经解决的一些问题。

如果我没有通过添加Kent Beck 关于实用程序员的测试驱动开发的新系列来更新它,我想我会对社区做一个不公正的事情。

===============>>#2 票数:6

根据我自己的经验:

  1. 只测试自己的代码,而不是底层框架的代码。 因此,如果您使用通用列表,则无需测试添加,删除等。

  2. 没有2.看那边! 猴子!

  3. NUnit是要走的路。

  4. 你绝对无法测试每一个结果。 我测试了我期望发生的事情,然后测试一些我希望得到异常或无效响应的边缘情况。 如果因为你忘记测试的东西而在轨道上出现错误,那么你应该做的第一件事(在尝试修复bug之前)就是编写一个测试来证明bug存在。

===============>>#3 票数:2

我对此的看法如下:

  • +1不测试框架代码,但您可能仍需要测试从框架类派生的类。
  • 如果某些类/方法很难测试,那么可能强烈表明设计有问题。 我尝试遵循“1类-1责任,1方法 - 1动作”原则。 这样,您可以通过较小的部分更轻松地测试复杂的方法。
  • xUnit为+1。 对于Java,您也可以考虑使用TestNG
  • TDD不是单一事件,而是一个过程。 因此,不要试图从一开始就设想一切,但要确保代码中发现的每个错误一旦被发现就会被测试覆盖。

===============>>#4 票数:2

我认为最重要的事情(实际上是以某种递归方式的一个很好的结果)TDD是对依赖关系的成功管理。 您必须确保模块经过单独测试,无需进行复杂的设置。 例如,如果您正在测试最终发送电子邮件的组件,请使电子邮件发件人成为依赖关系,以便您可以在测试中模拟它。 这导致第二点 - 嘲笑是你的朋友。 熟悉模拟框架和他们推广的测试风格(行为,而不是基于经典状态),以及他们鼓励的设计选择( “告诉,不要问”原则)。

===============>>#5 票数:2

我发现三张索引卡中所示的原则很容易记住TDD的本质是一个很好的指南。

无论如何,回答你的问题

  1. 除非你编写它,否则你不必测试你“知道”会起作用的东西。 你没有写泛型,微软做了;)
  2. 如果你需要为测试做很多事情,也许你的对象/方法做得太多了。
  3. 下载TestDriven.NET以立即在Visual Studio上开始单元测试(除非是Express版本)
  4. 只测试将要发生正确事情 不需要测试可能出错的所有内容:您必须等待测试失败。

说真的,就这么做,老兄。 :)

===============>>#6 票数:0

作为对此的补充,我想我会说我已经在博客上发布了关于开始测试的想法(在此讨论和我自己的研究之后),因为它可能对查看此线程的人有用。

TDD - 测试驱动开发入门 ” - 到目前为止我收到了一些很好的反馈,我们真的很感激你们所提供的。

我希望这有帮助! :)

===============>>#7 票数:0

无论如何,我不是TDD的专家,但这是我的看法:

  • 如果它是完全无关紧要的(getter / setters等)不测试它,除非你由于某种原因对代码没有信心。
  • 如果它是一个非常简单但非平凡的方法,请测试它。 无论如何,测试可能很容易编写。
  • 当谈到预期不会发生什么时,我会说如果某个潜在问题是您正在测试的类的责任,则需要测试它是否正确处理它。 如果不是当前班级的责任,请不要对其进行测试。

xUnit测试框架通常是免费使用的,所以如果你是.Net的人,请查看NUnit,如果你的Java是你的东西,请查看JUnit。

===============>>#8 票数:0

上面的建议是好的,如果你想要一个免费框架列表,你必须看起来不比维基百科上的xUnit框架列表更远。 希望这可以帮助 :)

===============>>#9 票数:0

在我看来(你的里程可能会有所不同):

1-如果你没有写它,不要测试它。 如果你写了它而你没有测试它就不存在了。

3-正如大家所说的那样,xUnit的自由和伟大。

2&4-确定要测试什么是你可以永远与自己争论的事情之一。 我尝试使用合同设计原则绘制这条线。 查看“面向对象的软件构建”或“实用程序员”以获取详细信息。

===============>>#10 票数:0

保持测试简短,“原子”。 测试每个测试中最小的假设。 使每个TestMethod独立,对于集成测试,我甚至为每个方法创建一个新的数据库。 如果需要为每个测试构建一些数据,请使用“Init”方法。 使用模拟将测试类与其依赖关系隔离开来。

我总是认为“为了证明这适用于所有情况,我需要编写的最少代码量是多少?”

===============>>#11 票数:0

在过去的一年里,我越来越相信TDD的好处。 我一路上学到的东西:1)依赖注入是你的朋友。 我不是在讨论控制容器和框架的反转来组装插件体系结构,只是将依赖项传递给被测试对象的构造函数。 这为您的代码的可测试性带来了巨大的回报。 2)我带着皈依者的激情/热情开始,抓住了一个嘲弄的框架,开始尽我所能地使用模拟。 这导致了脆弱的测试,需要大量的痛苦设置,并且一旦我开始任何重构就会崩溃。 使用正确类型的测试双。 假装你需要尊重界面,存根以将数据反馈给被测对象,只在你关心交互的地方进行模拟。 3)测试应该很小。 目标是在每个测试中测试一个断言或交互。 我试着这样做,大多数时候我都在那里。 这是关于测试代码的稳健性以及稍后需要重新访问测试时的复杂程度。

我在TDD中遇到的最大问题是使用标准组织的规范和该标准的第三方实现,这是事实上的标准。 我在规范的字母上编写了许多非常好的单元测试,但却发现栅栏另一侧的实现将标准视为更多的咨询文档。 他们玩得很松。 解决这个问题的唯一方法是测试实现以及单元测试,并根据需要重构测试和代码。 真正的问题是我相信,只要我有代码和单元测试都很好。 不是这样。 您需要在进行单元测试的同时构建实际输出并执行功能测试。 从整个过程到用户或利益相关者手中的小部分益处。

  ask by Rob Cooper translate from so

未解决问题?本站智能推荐:

17回复

TDD与单元测试[已结束]

我的公司对我们的代码进行单元测试是相当新的。 我已经阅读了一段时间关于TDD和单元测试的信息并且确信它们的价值。 我试图让我们的团队相信TDD值得学习和改变我们的编程思路,但这是一场斗争。 这让我想到了我的问题。 TDD社区中有很多人非常虔诚地写测试然后编写代码(我和他们一起),但对
2回复

具有多个复杂私有方法的单个公共方法的TDD流程

注意 :问题“我应该测试私有方法还是仅测试公共方法?” 是我要问的很好的参考。 我的问题是:用单一的,防弹的,可靠的公共方法与复杂的私有方法建立起来的最实用的TDD 过程是什么? 我最好通过示例来学习,所以这里是: 第1章)测试范围 假设我有一个仅做一件事的红宝
4回复

您是否遇到过TDD增加开发时间的情况?

我正在阅读TDD - 如何开始真正思考TDD? 我注意到许多答案表明测试+应用程序应该比编写应用程序花费更少的时间。 根据我的经验,这不是真的。 我的问题是,我编写的代码中有90%具有TON操作系统调用。 实际模拟这些所花费的时间比首先编写代码要花费更长的时间。 有时写入测试的时间是写
2回复

在执行TDD时,何时实现新的模拟依赖项?

关于从外部到内部的TDD,有一个我找不到答案的问题: 我实现了一个新单元(A),为此编写了一个测试,并且该单元需要一个尚不存在的依赖项(B)。 在我的测试中,很容易模拟这种依赖关系,但是在生产代码中我该怎么做? 我是否先实现(B)并同时使对(A)的测试失败,因为我还没有继续实现它以
1回复

TDD创建了一些“控制器”类-应该以什么意图编写其测试?

我最近开始练习TDD和单元测试,我的主要入门文章是出色的GOOSGBT和在SO上仔细阅读TDD标签的问题。 有时,我使用的过程会创建一个“控制器”类-通常,该类是相当复杂的子系统的立面,随着子系统中实现的功能数量的增加,职责会被不断地驱逐到助手类中,直到最初除了正确调用一小组协作者类并将返
18回复

什么是良好的单元测试? [关闭]

我相信大多数人都在编写大量的自动化测试,而且在进行单元测试时你也遇到了一些常见的陷阱。 我的问题是你是否遵循任何编写测试的行为规则以避免将来出现问题? 更具体一点: 良好单元测试的属性是什么,或者您如何编写测试? 鼓励语言不可知的建议。
4回复

是否有跨语言的TDD解决方案?

我想在C#,Java和AS3中编写一个简单的颜色管理框架。 我只想编写一次单元测试,而不是在JUnit,FlexUnit和NUnit中重新创建单元测试。 我想到了一个xml文件的想法,该文件通过setup,teardown和set tests来定义基于“实例”状态的“实例”和断言的操作。
6回复

避免TDD使大型重构变得更难[关闭]

我仍然是TDD的初学者,我常常陷入陷阱,在尝试添加新功能时,我已经将自己设计成了一个角落。 大多数情况下,这意味着在增加下一个要求时,从前10个要求中产生的API不会扩展,我意识到我必须对现有功能(包括结构)进行大量重新设计以添加内容新东西以一种很好的方式。 这很好,除非在这种情况下
2回复

是否一次编写尽可能多的测试TDD的良好实践? [关闭]

我是TDD的初学者; 我刚刚通过示例阅读了TDD,现在我似乎无法停止以TDD方式编写代码。 我注意到很多时候我正在编写测试,看到它失败,纠正它并重构。 然后经过一些测试后我发现实际上有更好的方法来编写接口,这使我想要改变以前的一些测试。 它显然使我编写的代码浪费了很多时间,所以我想知
5回复

开发到TDD的接口

我是TDD的忠实粉丝,并且最近将它用于我的大部分开发。 然而,我经常碰到的一种情况,从未发现我认为是“好”的答案,就像下面的(人为的)例子。 假设我有一个接口,就像这样(用Java编写,但实际上,这适用于任何OO语言): 现在,假设我想创建此接口的三个实现。 我们称它们为Dij