我无法数出“单元测试是被测代码文档的重要来源”这一类读语句的次数。我不否认他们是真实的。
但就我个人而言,我从来没有发现自己将它们用作文档。对于我使用的典型框架,方法声明记录了它们的行为,而这就是我所需要的。我假设单元测试将备份该文档中所述的所有内容,并可能还会添加一些其他内部内容,因此,一方面它会复制文档,而另一方面可能会添加一些不相关的内容。
所以问题是:什么时候将单元测试用作文档?什么时候评论不能涵盖所有内容?通过开发人员扩展源代码?他们公开了哪些文档本身无法公开的有用和相关的内容?
我无法数出“单元测试是被测代码文档的重要来源”这一类读语句的次数。我不否认他们是真实的。
但就我个人而言,我从来没有发现自己将它们用作文档。对于我使用的典型框架,方法声明记录了它们的行为,而这就是我所需要的。我假设单元测试将备份该文档中所述的所有内容,并可能还会添加一些其他内部内容,因此,一方面它会复制文档,而另一方面可能会添加一些不相关的内容。
所以问题是:什么时候将单元测试用作文档?什么时候评论不能涵盖所有内容?通过开发人员扩展源代码?他们公开了哪些文档本身无法公开的有用和相关的内容?
Answers:
请注意,以下许多内容也适用于注释,因为它们可能与测试等代码不同步(尽管执行性较差)。
因此,最后,理解代码的最佳方法是拥有可读的工作代码。
如果根本不写硬连线的低级代码部分或特别棘手的条件,那么附加文档将至关重要。
但是,当对某个特定类的功能有疑问时,尤其是在冗长,晦涩且缺少注释(您知道该类...)的情况下,我会迅速尝试查找其测试类并检查:
另外,如果使用BDD风格编写,则它们可以很好地定义类的合同。打开您的IDE(或使用grep)仅查看方法名称和tada:您有一个行为列表。
同样,为回归和错误报告编写测试也是一个好习惯:修复某些问题,编写测试以重现案例。回顾它们时,例如,这是查找相关错误报告以及所有有关旧问题的详细信息的好方法。
我想说它们是对真实文档的很好的补充,至少在这方面是宝贵的资源。如果使用得当,这是一个很好的工具。如果您在项目的早期就开始进行测试并养成习惯,那么它可能是一个很好的参考文档。在已有不良代码习惯的现有项目中,代码库已经散乱了,请谨慎处理。
如果通过文档您的意思是我想了解一下代码的工作方式,那么单元测试是在预期,边缘情况和错误(即bug)情况下代码单元如何工作的完美示例。同样,可以在编写代码之前创建测试,从而从业务/需求的角度看,代码应该做什么。
他们会取代文件吗?没有。
它们是文档的有用附录吗?是。
我将再问您一个问题来回答您的问题。
使用新的API /例程时,您多久发出一次帮助来查找您要使用的事物的代码示例?如果您没有切换到Google进行代码示例在线搜索?
这正是将单元测试用作文档的时间。
我怀疑有很多原因不能使单元测试成为文档,尽管它们可以很好地补充传统文档:
TL; DR单元测试和API注释是互补的-有些事情最好用代码来描述,而另一些最好用散文来描述。
单元测试主要用于记录特殊情况和边缘条件,这些条件很难(而且麻烦)在API注释中描述。同样,API注释通常指向想要使用API的人。
如果要修改代码,通常需要了解更多信息,其中有些很难放入注释中(这些注释很快就会过时)。在这种情况下,单元测试也可以作为文档。
一个示例:您有一个方法m (a, b)
执行某种计算。由于向后兼容的要求,它必须是a=0
和的特殊情况输入a=-1
,但只有在b
为NULL 时才可以。将其添加到注释中是复杂,冗长的,并且如果以后删除要求,则可能会过时。
如果进行一些单元测试来检查的行为m(0, NULL)
,m(-1, x)
那么您将获得以下好处: