随笔-124  评论-194  文章-0  trackbacks-0

ASSERT是在调试与测试环境,让程序员和测试者及时发现运行时错误的极简极佳之方法。

其语法如下:

在语法上,为了支持assertion,Java增加了一个关键字assert。它包括两种表达式,分别如下:

  1. assert expression1;
  2. assert expression1: expression2;

在两种表达式中,expression1表示一个boolean表达式,expression2表示一个基本类型或者是一个对象(Object) ,基本类型包括boolean,char,double,float,int和long。由于所有类都为Object的子类,因此这个参数可以用于所有对象。

在运行时,如果关闭了assertion功能,这些语句将不起任何作用。如果打开了assertion功能,那么expression1的值将被计算,如果它的值为false,该语句强抛出一个AssertionError对象。如果assertion语句包括expression2参数,程序将计算出 expression2的结果,然后将这个结果作为AssertionError的构造函数的参数,来创建AssertionError对象,并抛出该对象;如果expression1值为true,expression2将不被计算。

详尽说明(点这里)。

它的语法因为简单所以美丽。

注意它绝对不应用于发布和用户使用环境,ASSERT就像盖房子时的绿罩子、绞手架,在施工期间,防止石块跌落,同时也有协助施工的作用。

JAVA源自C++,后者中被大力推广的ASSERT,在JAVA里应该有十分的存在理由。ASSERT更象是一种编程方法和习惯,而不应该受到语言的局限。

做为JAVA程序员,应该非常庆幸:C++的ASSERT几乎就真是一句“断言”,单凭它,你只能知道错了,而不知错在何处。要在实际项目中使用它,几乎都要用宏去重新定义,让它带有更多的调试信息,甚至是堆栈信息,做到这点还是需要些技巧的。而JAVA的ASSERT天生语法就可带有可读信息,并且自动抛出异常,我们可以方便看到堆栈。

有的文章攻击ASSERT(点这里),是混淆了其使用目的的结果。

现在的IDE及WEB调试环境都可以方便的控制VM参数,虽然JAVA可以选择在发布版本也使用ASSERT,但JAVA本身也和C++一样遵循默认不开启它。你只需要在调试和测试的时候加上-ea(enable assertion)即可。

UNIT TEST并不能替代ASSERT。ASSERT是在真真正正实在的运行中产生作用,不同于单元测试中的MOCK框架或者函数级别的“验证”测试。它着重于在整个系统运行时就将错误揪出来,试问单元测试能做到模拟整套系统运行吗?

总之,ASSERT是前人多年编程过程中积累的工具和经验,我们应该多用它。以几条摘自《高质量C/C++编程指南》使用规则结束本文:

【规则6-5-1】使用断言捕捉不应该发生的非法情况。不要混淆非法情况与错误情况之间的区别,后者是必然存在的并且是一定要作出处理的。
【规则6-5-2】在函数的入口处,使用断言检查参数的有效性(合法性)。
【建议6-5-1】在编写函数时,要进行反复的考查,并且自问:“我打算做哪些假定?”一旦确定了的假定,就要使用断言对假定进行检查。
【建议6-5-2】一般教科书都鼓励程序员们进行防错设计,但要记住这种编程风格可能会隐瞒错误。当进行防错设计时,如果“不可能发生”的事情的确发生了,则要使用断言进行报警。

posted on 2008-05-30 11:54 我爱佳娃 阅读(2054) 评论(3)  编辑  收藏 所属分类: JAVA基础

评论:
# re: 被程序员和测试员遗忘的好朋友--ASSERT 2008-05-30 14:42 | Edward's
我觉得测试和代码还是应该分开  回复  更多评论
  
# re: 被程序员和测试员遗忘的好朋友--ASSERT 2008-05-30 15:57 | 我爱佳娃
ASSERT只是一种断言不可能的情况,应该不算是真正的测试,只是能够在运行时及时提供信息给程序员和测试员的工具。它和UT并不冲突,适用场合不同。  回复  更多评论
  
# re: 被程序员和测试员遗忘的好朋友--ASSERT 2008-05-30 18:44 | python
assert语句在代码中主要用于代码调试吧?Java中测试可以用Junit等工具  回复  更多评论
  

只有注册用户登录后才能发表评论。


网站导航: