正常的“功能代码行”与“测试代码行”的比率是多少?


27

我对TDD方法非常陌生,我的第一个实验说编写1行功能代码意味着编写2-3行测试代码。因此,如果我要编写1000 LOC,则包括测试在内的整个代码库将达到〜3500 LOC。

这算正常吗?您编写的代码的比例是多少?


8
是的,TDD带有昂贵的标签!
EL Yusubov

6
您的2-3X数字充其量是保守的,实际上对于C#/ Java,Python / Ruby之类的数字,它实际上更接近4-5X,而诸如Erlang之类的简洁语言则更接近1:1。取决于您对TDD的教条如何,教条越多,这些比率就越大!

6
@tomwrong:在肯特的书中,他引用了沃德的话,你应该写测试,直到你的恐惧变成无聊为止。
Herby 2012年

4
@ElYusubov:我完全不同意它的“昂贵”。对于那些仍在LOC中计算工作量的人而言,情况似乎如此。但是价格不在LOC中,而是在金钱和上市时间上。而且,TDD并不比任何其他合理的开发过程都昂贵。
赫比

5
伙计们,您为什么不发表评论而是发表评论?你写的东西很有道理。
Andrey Agibalov 2012年

Answers:


18

TDD正常为1:3。

从我的经历,以及从其他引文中我都记得。


12
...什么引用?
TehShrike

……隐约记得……我已经不记得它在哪里了(也许在肯特·贝克的TDD示例中,也许在c2.com的某个地方)。不过,我记得这个意思,那就是测试代码比生产代码多三倍是可以的。
Herby 2012年

哇,我的经历也一样。(我现在正盯着
cloc的

9

存在基于不同编码风格和语言的变体。但是,无论您使用哪种语言,最大的变化就是您。

罗伯特·马丁曾经说过:

“随着测试变得更加具体,代码变得更加通用。”

这让我思考。更具体的测试意味着更多的测试代码。通用的生产代码意味着更少的代码,因此,随着代码的发展,测试/代码比率应会提高。

但是,等等,这也不是一件好事。在某些特定情况下,例如,当您定义某种算法时,您可能只有6-10行代码,其中包含几个“ if”,一段时间和2-3个递归。我可以告诉您,该代码可能会有100多行测试代码。

在一个实际的项目中,除了一些算法之外,测试/代码比率应该在1:1到2:1之间。如果它超过2:1,这是一种气味,您有应该重构或删除的测试(或者可能是难以测试的代码)。您应该始终在测试中投入与生产代码中相同的精力和重构。

无论如何,对您问题的最佳答案可能是“循环复杂性”。方法的循环复杂度越高,就必须编写更多的测试来涵盖所有情况。


3

该比率将根据方法的大小而变化。方法的大小将根据编程样式,语言和问题域的不同而不同。

如果您的方法比较短,那么3:1是合理的。如果您的方法很长,则3:1偏高。

因此,要回答您的问题,取决于情况。:-)


这取决于您所说的“方法很长”。它在我脑海中产生的印象是,方法是不必要的,需要太多时间,做太多的工作,承担太多的责任(通常有太多的参数)。在那种情况下,这种方法按比例需要更多的组合来覆盖测试,因此我认为比例不会发生太大变化……
Herby

假设您可以设置一个测试,调用要测试的方法,然后用三行代码检查结果。如果您要测试的方法是一行长(例如Scala中的情况),那么您对生产代码的测试比率为3:1。如果该方法长六行,则为1:2。六行不是很长。
乔恩·斯特雷耶

2

对于软件关键型应用程序,通常的比率是每10个功能性LoC测试一天。

这不包括与测试无关的TDD,而与规格无关。



By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.