`
jyslb
  • 浏览: 7665 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

讨论一下:java断言没有实用价值

阅读更多
java从1.4开始引入了断言,但是默认断言的功能是不开启的,java断言的开启不同于c语言,c语言是在编译的时候加入断言的,而java断言的启用是在运行时期指定的。
由于1.4以后系统类中也有断言的使用,所以如果要开启系统类的断言需要使用java -esa,如果需要开启用户类的断言则需要java -ea。

在实际使用中,对于边界值和函数入参、返回值的校验我们一般是通过if..else来进行,除了向控制台报错之外,有可能还要使用一些应用定义的exception或者向数据库中记录一个日志,可以发出告警等等,总体来说这样做的可控性是非常强的。

java这个assert功能是个鸡肋,很难想象有谁会在系统上线的时候会在系统运行的时候加入一个-ea来开启断言,一定要这样做的后果是,如果参数越界的的话程序会抛出一个不应捕获的严重级别的Error错误,不可控也不可靠。
在开发阶段,唯一有用的地方有可能就是和testng结合使用了,可是我貌似更喜欢junit4一点,一样有annotation的强力支持,所以总结一下,java assert的出现和使用都是没有必要的。
分享到:
评论
18 楼 抛出异常的爱 2011-03-22  
error......
谁允许你们在正式环境下开启断言了?
C语言老师教的么?

断言是为了在开发过程中定位开发错误问题
在没有ide 的 debug之前想要定位错误
log是没有办法的办法
assert是先进的生产动力.
现在这个assert感念用在了测试上
从源码中剥离出来了.
还可以不用停止在第一个错误之上
17 楼 hatedance 2011-03-21  
assert既然是抛出error,那么我们如果要用就得顺着这个思路用。
error一般认为是无法恢复的错误。
比如save(Object aobject){ assert aobject !=null: "null object";...}
这关乎设计策略。到底保存一个空对象是允许的,还是禁止的。


也许我们大多数实际情况下,根本不区分excepion和error,就像南方人不区分后鼻音和前鼻音,所以,我们只用到exception就满足了。
或者我们不敢抛出error,一味抛出可捕获的excepion,怕error就把程序结束了。
16 楼 jyslb 2011-03-20  
可能说的太长没人愿意看,换句话问问,你们项目中,除了testng,你们在什么地方会用到java的assert,是什么理由让你选择抛出一个Error,而不是一个应用级别的错误?
15 楼 jyslb 2011-03-20  
freish 写道
在涉及客户端到服务端通信中关于服务端的测试时,junit表示压力很大


不是在讨论如何用junit测试webservice,我是在说java assert的真正意义何在。
java断言的意义在于进行函数入参,返回值,或者一些条件值的判断,但是java assert的做法太过粗暴,直接就抛出一个Error,runtime的不能捕捉也不可控,考虑以下场景

1. 函数入参,返回值判断
   采用if-else可以有效进行日志记录,数据库日志记录,可以选择抛出应用基本的异常,对于调用方来说可捕获,可控。

2. 接口调用,包括webservice
   一般一个定义良好的系统,在接口规范中还定义了诸多错误返回(API的话有可能是应用级别的exception),我们可以通过if-else来控制返回什么错误,而不是像java assert一般搞出一个Error出来,完了啥事都没法干。

所以我感觉在程序代码中使用java assert没必要。

完了再讨论单元测试代码,没错,testng用到了java assert,不过现在junit4也有annotation,在单元测试的范畴里面我干嘛还用testng呢?
看了楼上诸位的留言我澄清一下,junit4的断言不是jdk assert,而testng使用的是jdk定义的assert。
14 楼 evanzzy 2011-03-20  
非常有同感,除了用junit做测试的时候,其他地方还真没用过断言。
13 楼 jackra 2011-03-20  
断言如此设计本身是在运行时免除部分计算,增强效率.
在不考虑代码执行效率的情况下,是没有意义的.
12 楼 aoliwen521 2011-03-19  
我至今觉得是鸡肋。。鸡肋。。
11 楼 ZHH2009 2011-03-19  
<p>assert 其实你可以认为它就是个语法糖,用来简化你的代码量的,</p>
<p> </p>
<p>比如,像下面这个代码:</p>
<p>
</p>
<pre name="code" class="java">public class Test {
public void method(int i) {
assert i &gt; 0 : "i 必需大于 0";
}
}</pre>

<p> </p>
<p>编译器在编译期间动了手脚了,它会帮你转成类似下面的代码:</p>
<p> </p>
<p>
</p>
<pre name="code" class="java">public class Test {
static boolean $assertionsDisabled = !Test.class.desiredAssertionStatus();

public void method(int i) {
if (!$assertionsDisabled &amp;&amp; !(i &gt; 0)) throw new AssertionError("i 必需大于 0");
}
}</pre>
 
10 楼 keating 2011-03-19  
我有问题,除了Junit单元测试,你还在什么地方使用断言了?
9 楼 helin 2011-03-19  
基本没用上..
8 楼 凤凰山 2011-03-19  
看来兄弟你项目经验不足啊,并且平时编码过程中很少考虑测试什么的,软件测试不单单就是if else的事
7 楼 flashing 2011-03-19  
freish 写道
一个发到Websphere里的一个项目,譬如web services,要传输一些特殊的数据结构,要测试客户端传到服务端的对象是否完整,JUNIT能做到么?这还是断言好使


mock
6 楼 wdz567 2011-03-19  
我想这个问题可能测试人员会比较清楚一点。。。。
不过我平时是没有使用这个
5 楼 huzhenyu 2011-03-19  
说的是神马啊!
4 楼 i_am_birdman 2011-03-18  
freish 写道
在涉及客户端到服务端通信中关于服务端的测试时,junit表示压力很大

新手求解释??
3 楼 freish 2011-03-18  
在涉及客户端到服务端通信中关于服务端的测试时,junit表示压力很大
2 楼 freish 2011-03-18  
一个发到Websphere里的一个项目,譬如web services,要传输一些特殊的数据结构,要测试客户端传到服务端的对象是否完整,JUNIT能做到么?这还是断言好使
1 楼 ouchxp 2011-03-18  
沙发.个人认为LZ会遭到批斗 新手 隐藏........=_=

相关推荐

    JavaJava%BEE软件工程师就业求职手册.doc

    ### JavaJava%BEE软件工程师就业求职手册知识点梳理 #### 第一部分:求职过程篇 ##### 第1章 写在前面的话 - **1.1 程序员这个职业** - **1.1.1 职业感受**:讨论了程序员这一职业的特点,包括其工作性质、挑战...

    java学习笔记4

    "良葛格"作为编著者,可能以易懂且实用的方式阐述了这些概念。以下是根据标题和描述可能包含的知识点: 1. **多线程编程**:Java以其强大的并发处理能力闻名,这部分可能会讲解线程的创建(通过`Thread`类或实现`...

    Java核心技术 第八版 卷Ⅰ(基础篇)电子版

    9. **异常、日志、断言和调试**:介绍Java异常处理机制、日志记录的最佳实践、断言的使用方法以及调试技巧。 10. **泛型程序设计**:讨论泛型的基本概念及其在集合框架中的应用,提高代码的复用性和类型安全性。 11....

    以下是一些软件测试的教程、案例和相关项目.docx

    - **实用性强**:课程内容紧密结合实际工作场景,强调自动化测试的实际应用。 - **持续更新**:定期更新课程内容,确保学习者能够掌握最新的自动化测试技术和工具。 #### 二、自动化测试 **2.1 Selenium 官方...

    Junit in action

    《JUnit in Action》是一本专为Java开发者设计的单元测试指南,它深入介绍了JUnit这个流行的测试框架,并提供了大量实用的示例和最佳实践。这本书旨在帮助程序员构建更可靠、更易于维护的代码,通过单元测试确保软件...

    TestComplete Made Easy

    综上所述,《TestComplete7 Made Easy》是一本非常有价值的参考资料,它不仅介绍了这款自动化测试工具的基础知识和核心功能,还提供了大量实用案例和技巧指导,对于初学者来说是非常友好且具有指导意义的读物。...

    正则表达式小工具

    3. **学习正则语法**:工具可能包含对正则表达式基础和高级特性的解释,例如字符类、量词、分组、断言等,这对于初学者来说非常有价值。 4. **功能扩展**:可能还支持其他高级功能,如捕获组、非捕获组、后向引用、...

    2014 Year in Review

    这个模块可能包含了断言、测试用例管理、模拟对象等功能,对于理解和学习测试框架的内部工作原理非常有价值。 基于以上信息,我们可以推测这篇2014年的博文可能详细讨论了以下几个方面的知识点: 1. **开源源码...

    selenium books

    它支持多种编程语言,如Java、Python、C#等,并且能够跨浏览器和操作系统工作,包括Chrome、Firefox、IE以及Windows、Mac和Linux。"Selenium书籍"的提及,指的是两本与Selenium相关的专业读物,即《Selenium Testing...

    Manning - JUnit in Action.pdf

    总的来说,《JUnit in Action》是一本全面且实用的JUnit指南,无论你是初学者还是经验丰富的开发者,都能从中获取到有价值的信息,提升你的测试技能和软件开发实践。通过学习这本书,你将能够更好地理解和运用JUnit...

Global site tag (gtag.js) - Google Analytics