这里是我的高层次,一般的问题:Java的断言,在比较/对比单元测试和异常
一个为什么要使用断言,而不是单元测试和异常处理?
为了澄清我的疑惑并限定我的顾虑,我会谈一谈我对Java断言和我的背景的了解,因为它与这一问题相关。所以,要开始,在本周之前,我真的不知道Java框架的断言,也不知道它们的功能,所以我绝对承认我很可能没有得到全部图像。话虽如此,我近十年来一直是Web开发,数据和API开发方面的专家,所以我并不完全天真。
从我读过的和讨论过的内容来看,断言通常在开发过程中使用,(几乎)在生产中总是关闭,并检查后期条件和类不变值;他们可以被用于其他事情,但这两件事似乎是他们当前的主要用法。它们构建在Java异常之上,是Error
的子类型,并在违反时引发。关闭时,它们不会增加运行时间开销。但是,对我而言,它们看起来是多余的,特别是在考虑良好的异常处理技术和良好的单元测试实践时。我没有看到任何情况下,断言会提醒程序员注意异常处理或单元测试无法解决的错误或问题。
遵循这一思路,他们似乎在创造代码混乱。如果他们不打算在生产环境中运行并充当开发援助,那么他们在生产代码中的存在就有点反模式:你有单独的源文件夹用于测试和测试资源,而你编写可测试的代码,而是而不是代码严格的测试。每当我发现自己编写的代码只是为了测试,就会提醒我设计不佳,然后我退后一步,重新设计我正在做的事情,以便我的代码可以测试。在我看来,这是这种范例被侵犯的一个例子。无论存在什么断言,它都可以被try/catch块取代,如果/ then/else抛出了适当的异常,或者通过一组单元测试 - 至少,这就是我认为的方式。在生产代码中声明不会在生产过程中运行,这是令人困惑的。它也会干扰代码的目的和代码的功能。我发现一个测试可以评估相同的条件,断言会更加可读,因为它会被包含在一个测试中,该测试可以为该确切场景命名和记录。
其他人可以增加洞察这一思路?也许你同意 - 添加例子为什么或阐述我的推理。再说一遍,也许你认为我错了 - 陈述原因并提供例子来支持你的推理,或者提供反面的观点来看待我的观点。
谢谢大家!
资源我请教,供大家参考:
- http://c2.com/cgi/wiki?DoNotUseAssertions
- http://geekexplains.blogspot.com/2008/06/asserions-in-java-assertions-vs.html
- http://www.javapractices.com/topic/TopicAction.do?Id=102
- http://docs.oracle.com/javase/7/docs/technotes/guides/language/assert.html
一般来说,你可能是对的。你可以为每个“testing”assert编写一个JUnit测试,并且你可以用try-catch或者throw来代替每个“functional”assert。但是对于快速代码抽样,编写'assert'比编写完整的测试用例要容易。也许这就是Java'assert'关键字的利基...... – Turing85
“用于快速代码抽样,比编写完整的测试用例更容易编写断言” - 比另一个更为正确,或者它们是否有不同/补充用例?在我看来,从测试和生产代码明显分离的角度来看,单元测试会更加正确,并且明确地抛出一个详细且恰当命名的异常会更清晰和更具可读性。在这一点上我只是在qu?? – liltitus27
这正是我所说的*快速代码抽样*。单元测试更精细,代码更昂贵,以及'try-catch'块和propper异常处理。 – Turing85