我知道TDD风格首先是编写测试,看到它失败然后去做绿色,这是好事。有时它真的适合我。
然而,特别是在我尝试某些东西时(即不确定设计,不确定它是否会起作用)或疯狂编写代码,我不想编写单元测试,它打破了我的流量。
我倾向于稍后编写单元测试,特别是在事情变得过于复杂之前。还有另外一个问题,以后写它们通常会更无聊。
我不太确定这是不是一个好方法(绝对不是最好的)。
你怎么看?您是否编写代码以后编写单元测试?或者您如何处理这个流程问题或实验设计/代码阶段。答案 0 :(得分:16)
我所学到的是没有实验代码,至少不能在生产环境和/或紧迫的期限内工作。通常会进行实验,直到某些“有效”成为生产代码。
另一方面, TDD从一开始就会带来更好的代码设计。你会更多地考虑它,重新修改它,比你在事后编写测试更频繁地重构它。
答案 1 :(得分:9)
事后我写了测试。从那时起就更好了。他们总是值得拥有。
但是,我不得不说,在编写测试代码之前我第一次写它们,这非常令人满意。不再需要手动测试。我感到很惊讶它的感觉。
此外,我倾向于在重构遗留代码之前编写单元测试 - 几乎按照定义,这意味着我正在编写测试来测试已编写的代码。提供一个安全毯,让我更容易进入其他人编写的大块代码。
答案 2 :(得分:3)
“我不太确定这是不是一个好方法(绝对不是最好的方法)。”
不好?为什么不?
您是否正在设计可测试性?在这种情况下,您的设计是测试驱动的。还有什么人可以要求的吗?
测试是首先,中间还是最后测试与设计可测试性无关。最后,对设计的更改将使测试失败,并且您可以修复问题。预期设计更改时对测试的更改也会使测试失败。两者都很好。
如果你的设计工作已经结束,并且中间有一些难以测试的东西,那么你就无法进行TDD。您必须重构您的设计才能使其可测试。
答案 3 :(得分:2)
我经常采用你所说的相同方法。看起来效果很好的是完全按照这样处理实际代码,然后根据你学到的东西开始一个合适的设计。从这里开始,您可以先编写测试。否则,你会留下许多代码,这些代码被写成临时代码或实验代码,并且可能无法为所有代码编写测试。
答案 4 :(得分:2)
我想说,对于正常开发,TDD工作得非常好。在某些情况下,您可能不需要先编写测试(甚至根本不需要),但这些测试很少发生。但是,有时您需要进行一些探索以了解哪些方法有效。我认为这是一个“尖峰”,我不一定认为在这种情况下TDD是绝对必要的。我可能不会在我的项目中使用实际的“尖峰”代码。毕竟,这只是一次探索,现在我对它应该如何工作有了更好的了解,我可以编写比我的“尖峰”代码更好的代码(和测试)。如果我决定使用我的“尖峰”代码,我可能会回去为它编写测试。
现在,如果您发现自己违反了TDD并在测试之前编写了一些生产代码 - 它就会发生 - 那么,我也会回去编写测试。事实上,在我遇到这种情况的情况下,一旦我开始编写测试,我经常会发现我忽略的东西,因为更多的测试会浮现在脑海中而不是由代码处理。最终,你回到了TDD的rythym(并发誓永远不再这样做了。)
答案 5 :(得分:2)
考虑与沉没成本相关的心理倾向。也就是说,当你到达等式的第二部分时,我们所拥有的懒惰基因使我们想要保护我们已经完成的工作。后果?
您倾向于编写适合测试的代码。这鼓励了“解决问题的最简单的事情”类型开发,并使您专注于解决不能解决元问题的问题。
您很想编写测试以适应代码。实际上,这相当于编写问题以适合您的答案,这是一种倒退,并且通常会导致测试价值较低。
虽然如果50个ALWAY中的一个程序员首先编写测试,我会感到惊讶,但我仍然认为如果你想编写好的软件,那就要努力了。
答案 6 :(得分:1)
我通常先写测试,但有时我会在尝试之后编写代码。一旦我了解了我的代码应该做什么,我就停止代码并开始测试。
答案 7 :(得分:0)
也许您拒绝使用测试优先方法,因为您不知道应该在哪里使用单元测试。我在学习TDD时遇到了同样的问题。
您建议您在TDD中使用不同的策略。随着时间的推移,你会更好地理解它。我认为这只是时间问题。我一开始很难理解它。我读过相同的文献,但当时无法理解。只是在一段时间内不断学习它。
答案 8 :(得分:0)
VS 2008有一个很好的功能,它将为一个对象生成测试类,测试需要我调整,但它为你量身定做了很多繁重的工作。对于不那么勤奋的同事来说,它非常适合进行装箱测试。
另一个好处就是它有助于防止你错过某些东西,期待当你处理不属于你的代码时。
如果您使用不同的测试框架然后使用MSUnitTest,那么将测试从MSUnit转换为Nunit等相当简单,只需要复制和过去。
答案 9 :(得分:0)
当您试图弄清楚代码的工作方式时,首先编写代码是很自然的。首先编写测试可以帮助您确定代码显示的内容(而不是它应该如何执行)。如果您首先编写代码,那么您将尝试在不完全定义问题的情况下解决问题。这不一定是“坏”,但你使用单元测试作为回归工具而不是开发工具(再次,不是“坏” - 只是不是TDD)。
答案 10 :(得分:0)
我想说我总是首先编写单元测试但当然我没有(因为众多原因,任何真正的程序员都知道:-))。我(好吧,也不是总是 ...)做的是将每个花费超过五分钟的bug转换成单元测试。甚至在我解决之前。这具有以下优点: