想知道TDD /自动化单元测试的优缺点,并寻找社区对于专业开发人员是否可以在不支持单元测试的情况下编写应用程序是否可接受的观点?作为一名专业开发人员而不是编写单元测试是否可以接受?
回答
它是由你。这个问题更具哲理性。
单元测试只是为了帮助你的工具。你可以选择忽略它们。但是,如果你打算做一个不重要的项目,我会建议你使用单元测试。
是的,他们需要时间,也写了。但最终如果有任何重构或代码的某些部分需要更改,则会节省很多。
一如往常:这要看。
一般来说,单元测试是一件好事:它们捕获整个类的错误,它们验证代码中的特定部分在给定的情况下如预期的那样工作,并且它们使得在发生某些事情时更容易追踪错误错误。所以除非你有充分的理由不这样做,否则你应该编写单元测试。
好理由不写单元测试包括:
- 制作相对小的变化是不好,几乎没有结构,因为这可测试的代码库(通常情况下,原因是存在的顾虑少分离,并且可测试单元不能隔离进行测试,而不会对代码库本身造成干扰)。
- 问题域的本质使得代码本身不可测试。这种情况很少见,但会发生 - 例如,很难为绘制GUI的例程提供有意义的单元测试:您必须将其渲染到模拟表面,然后检查单个像素,但是您还必须嘲笑影响布局决策的所有参数等。虽然这在理论上是可行的,但通常不值得付出努力,并且在这种情况下应该选择手动或半自动测试。
- 该项目是与这样一个小范围,这样短的生命周期,所述益处由单元测试获得的(增加的可维护性,减少复杂性)一个微小的不重磨程序是微不足道的。但请记住,软件的寿命比设计的要长,而且您的一次性使用一次性脚本可能最终成为公司流程中关键任务的一部分。
有时候我希望从疯狂的TDD家伙那里得到统计数据,实际上有多少次测试对他们意外失败(在实现不计算之前),以及这些错误有多复杂。我个人的经验是,如果我不写一个困难的,由领域驱动的商业逻辑,测试什么都不会显示,你可以编写数千行代码,然后重构它们,而不必通过它们发现一个错误。 (请注意:我通常没有错误,至少只要我遵循我的项目) – Aadaam 2012-08-05 12:59:19
@Aadaam:我当然不是TDD疯子,但自动化测试已经救了我好几次,特别是在没有动态语言的情况下一个编译器因为做愚蠢的事情或做出愚蠢的错误而大吼大叫。此外,查找错误仅仅是你编写单元测试的一个原因 - 正式定义和记录单元行为(在TDD中,甚至在实现之前),构建一系列回归测试,并以可缩回的方式组织您的想法是其他。您甚至可以使用它们主动跟踪重构时需要注意的地方,这非常有用。 – tdammers 2012-08-05 13:03:49
用于组织我的想法,并在实现之前记录文档,我有UML,很容易可以是我是他们的最后一个用户,但它为我服务了十多年。我尝试了这些单独的TDD/BDD方法(我不得不),但我总是发现它们很麻烦,而且不如绘制一系列模型和检查一切是否正常。也就是说,当涉及到像OCL一样的东西时,单元测试当然是要走的路。 – Aadaam 2012-08-05 13:06:50
我相信,我会得到-1 -ed这一点,但我还是要说:如果你有其他措施,以确保质量,包括避免回归,程序验证,程序验证,然后没有。
唯一的问题通常是人们没有任何其他工具比单元测试来实现这一目标。
如果您有正式测试过的模型(有一个工具,实际测试它,或者它是以确保其有效的方式构建的),并且已经正式测试确保实际运行的软件符合那个模型,那很好。
例如:如果您确定,您在ruby中编写的代码将按照您的预期行事(因为您或其他人测试了ruby解释器并且没有错误,或者您只使用子集的功能已知是安全的),那么它很好。通常,我们以这种方式信任C编译器和CPU。
另外,如果一个程序只能使用一次,就没有回归问题!如果我用bash编写一行代码,它会为我计算一些东西,我可能会首先手动对假数据进行测试,然后在真实数据上运行 - 无需编写自动测试。
如果你承担责任,你也可以随同假设:我通常认为,日食在创建setters和getters方面非常好,而且我不对这些假设进行测试。另外,我假设,如果Java 7中的Java Collection类存在任何问题,它现在已经结束了。但如果遇到麻烦,这是您的个人问题。不要责怪任何人。
就我个人而言,我很少在某些代码上使用单元测试,因为我正在测试它们,而它们仍然是一张纸上的流程图,并且我确保我只使用已知在其中工作的语言/库的子集这种情况。另外,如果没有同行评审,我绝不会让代码出来。不过,如果有人对他们进行验收测试,有时候会更好......
没有人说你应该单独依靠单元测试*。这很愚蠢 - 就像仅仅依靠正式证明或手动测试一样愚蠢。 – tdammers 2012-08-05 12:59:09
- 1. 是否可以在单个开发人员工作站上测试SQL AlwaysOn可用性组?
- 2. 是否可以编写一个可以测试AuthorizationPolicy对象的测试?
- 3. 单元测试是否保护您的代码免受其他开发人员的错误?
- 4. 对于专业的.NET开发人员来说,OS X是否适合Mono?
- 5. 在测试驱动开发中,你是否先编写每一个可能的测试,然后编写代码?
- 6. 是否可以将错误链接到单元测试?
- 7. 为单一方法编写classist和mockist单元测试是否有优势?
- 8. 在TDD中,谁写测试 - 开发人员或QA /测试人员?
- 9. 谁在写自动UI测试?开发人员或测试人员?
- 10. 是否可以检查TCP连接是否断开而不写入它?
- 11. Android包是否存储开发人员/公司/作者姓名?
- 12. 如果编译时间高于可接受的水平,是否可以创建失败的单元测试?
- 13. Trac中的门票的多名受理人(开发人员,审核人员,测试人员)
- 14. 是否可以超级演员名单?
- 15. Whate是否可以在线发布iPhone开发人员的工作请求?
- 16. 秒表基准测试是否可以接受?
- 17. 测试T-SQL FLOAT列值是否可以接受YYY.QQ格式
- 18. 开发iphone应用程序而不是苹果开发人员
- 19. 使用痣覆盖到System.Configuration,而不是作为单元测试
- 20. 是否可以用C++而不是C编写OpenCL内核?
- 21. 是否存在Apple不接受我为应用程序iPhone开发人员(带付费会员)的风险?
- 22. 单元测试(是或否)
- 23. 开发人员是否可以不可逆转地破坏git repo?
- 24. 是否可以强制WCF测试客户端接受自签名证书?
- 25. 是否可以在Ruby on Rails中调试单元测试?
- 26. 是否可以隐藏第三方开发人员的SQL连接?
- 27. 如何编写单元测试,测试并发不变
- 28. 开发人员可以验证测试计划文档吗?
- 29. 是否可以模拟GPU以进行CUDA/OpenCL单元测试?
- 30. SBT插件:是否可以为单个测试运行脚本,而不是运行所有测试?
属于[程序员.se]。 – eggyal 2012-08-05 12:43:56
如果你不测试你的东西,你怎么知道它是正确的。对我来说看起来并不专业。 – Steven 2012-08-05 12:56:26