tdd - 单元测试的tdd细节级别

  显示原文与译文双语对照的内容
123 2

我想开始讨论你在单元测试中所涵盖的细节。

是否测试主要功能,包括由一个测试同时完成一个任务的几个方法?或者甚至可以测试自动属性?

因为,例如,在编写测试的过程中,我看到的值很少,只能测试以下内容:

 public Email
 {
 set
 {
 if(Regex.Match(/*....*/))
 email = value;
 }
 get
 {
 return email;
 }
 }

因为它非常清楚,而且只是浪费时间。通常当我做单元测试时,我会测试整个任务- 像这个例子- 一个完整的注册过程。

我要求这样做,因为目前我正在阅读由 Jimmy with编写的图书,他指出他在测试这个小细节。

没有这样的覆盖级别?

时间:原作者:0个回答

91 5

测试不仅仅是测试你写的东西。测试还可以测试你编写的内容仍然有效。比如,多年以后,许多开发者。你认为一个死的简单类可能会变得更加复杂。

例如假设它从没有过滤器开始。只是一个简单的获取/设置。为什么要测试?随后,其他一些开发人员添加了 正规表达式 过滤器,它的错误。突然类被破坏了,但是没有人知道。这就会显示出在调用堆栈上进行神秘的故障,现在需要更多的时间进行调试。可能比写几个测试要多。

然后,将来,某人尝试获得灵巧并优化你的代码。或者者,正格式化它的方式有一个倾向于编写的倾向,并且通常可以以。对于细微的破损来说。小型目标单元测试将捕获这里。

在上面的例子中,正规表达式 可能会过滤那些看起来像电子邮件地址的东西。这就必须检查 正规表达式 是否正常工作,否则你的电子邮件类就会停止接受邮件。或者它开始 taking 。也许你的正规表达式 没有覆盖有效的电子邮件地址,在你发现它的时候就值得。最终,有人会用一个实际的解析器替换你的正规表达式 。也许它有效,也许它不是。一个好的测试将有一个简单的有效的和无效的电子邮件地址,你可以以轻松地添加到。

测试还允许你练习接口和发现漏洞。当你放入不是电子邮件地址的东西时会发生什么?是的,没有。Email.set 悄悄地丢弃输入。垃圾,没有什么是不礼貌的。可能会引发异常。因为试图测试这个集合是否工作,因这里这是一个很快就会变得清晰的问题。

测试还可以揭示inflexibilities和不能覆盖或者定制的东西。在你的示例中,可以以直接测试 正规表达式 筛选器,而不是每次实例化对象。这是因为筛选器是最复杂的位,而且在尽可以能少的层次上测试和调试更容易。通过将它放入 Email.is_email_address,现在可以直接测试它。作为副作用,还可以在子类中重写它。因为大多数人都不喜欢 LIVING,所以这是很方便的,因为大多数人都会收到的电子邮件验证

最后,你希望对测试进行解耦。在不影响它的复杂性的情况下测试一件事情,这样你可以清楚地看到问题。你的电子邮件类是一个很好的,分离的单元测试的优秀的候选者。

原作者:
108 2

简单函数的测试是简单的。所以它们很容易写而且容易运行。它们花很少的时间创建,并且在模块以后变得更加复杂时是一个放置的地方。是的即使是简单的函数。

现在,上面键入的函数包含一个正则表达式,你可以将。正规表达式 很难预测。匹配有效电子邮件地址的正则表达式可能是非常复杂的,但很复杂。所以我想测试一下。如果正则表达式,所有的不同电子邮件地址变体,以及所有的角和负面情况,我都会在plying之后拥有。

决定是否编写测试的决定始终是关于长期和长期利益的决定。长期以来,测试总是有益的,因为它们锚定代码的行为并检测副作用和意外的结果。延迟测试的行为总是做短期增益,以便你不要"浪费时间"。问题在于,在系统中测试不是一个孔,它的中的副作用和意外结果会被无法检测到。因为简单模块的测试非常简单,易于编写,而且墨菲将确保在你为他们提供的任何漏洞中都会隐藏,这似乎是不太可能的简单测试。

原作者:
...