关于编程测试中的断言.doc_第1页
关于编程测试中的断言.doc_第2页
关于编程测试中的断言.doc_第3页
关于编程测试中的断言.doc_第4页
关于编程测试中的断言.doc_第5页
已阅读5页,还剩1页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

编程断言概述编写代码时,我们总是会做出一些假设,断言就是用于在代码中捕捉这些假设可以将断言看作是异常处理的一种高级形式断言表示为一些布尔表达式,程序员相信在程序中的某个特定点该表达式值为真可以在任何时候启用和禁用断言验证,因此可以在测试时启用断言而在部署时禁用断言。同样,程序投入运行后,最终用户在遇到问题时可以重新起用断言。使用断言可以创建更稳定,品质更好且易于除错的代码当需要在一个值为FALSE时中断当前操作的话,可以使用断言单元测试必须使用断言(Junit/JunitX)除了类型检查和单元测试外,断言还提供了一种确定个种特性是否在程序中得到维护的极好的方法使用断言使我们向按契约式设计更近了一步。常见的断言特性前置条件断言:代码执行之前必须具备的特性后置条件断言:代码执行之后必须具备的特性前后不变断言:代码执行前后不能变化的特性。断言使用方式断言可以有两种形式1assertExpression12assertExpression1:Expression2其中Expression1应该总是一个布尔值,Expression2是断言失败时输出的失败消息的字符串。如果Expression1为假,则抛出一个AssertionError,这是一个错误,而不是一个异常,也就是说是一个不可控制异常(uncheckedException),AssertionError由于是错误,所以可以不捕获,但不推荐这样做,因为那样会使你的系统进入不稳定状态。启用断言断言在默认情况下是关闭的,要在编译时启用断言,需要使用source14标记既javacsource14Testjava,在运行时启用断言需要使用-ea参数。要在系统类中启用和禁用断言可以使用-esa和-dsa参数。例如:publicclassAssertExampleOnepublicAssertExampleOne()publicstaticvoidmain(Stringargs)intx=10;Systemoutprintln(TestingAssertionthatx=100);assertx=100:Outassertionfailed!;Systemoutprintln(Testpassed!);如果编译时未加-source14,则编译通不过在执行时未加-ea时输出为TestingAssertionthatx=100Testpassedjre忽略了断言的旧代码,而使用了该参数就会输出为TestingAssertionthatx=100ExceptioninthreadmainjavalangAssertionError:Outassertionfailed!atAssertExampleOnemain(AssertExampleOnejava:6)断言的副作用由于程序员的问题,断言的使用可能会带来副作用,例如:booleanisEnable=false;/assertisEnable=true;这个断言的副作用是因为它修改了程序中变量的值并且未抛出错误,这样的错误如果不细心的检查是很难发现的。但是同时我们可以根据以上的副作用得到一个有用的特性,根据它来测试断言是否打开。publicclassAssertExampleTwopublicstaticvoidmain(Stringargs)booleanisEnable=false;/assertisEnable=true;if(isEnable=false)thrownewRuntimeException(Assertionshoulebeenable!);何时需要使用断言1可以在预计正常情况下程序不会到达的地方放置断言:assertfalse2断言可以用于检查传递给私有方法的参数。(对于公有方法,因为是提供给外部的接口,所以必须在方法中有相应的参数检验才能保证代码的健壮性)3使用断言测试方法执行的前置条件和后置条件4使用断言检查类的不变状态,确保任何情况下,某个变量的状态必须满足。(如age属性应大于0小于某个合适值)什么地方不要使用断言断言语句不是永远会执行,可以屏蔽也可以启用因此:1不要使用断言作为公共方法的参数检查,公共方法的参数永远都要执行2断言语句不可以有任何边界效应,不要使用断言语句去修改变量和改变方法的返回值下边是介绍断言的用法:assert是在J2SE14中引入的新特性,assertion就是在代码中包括的布尔型状态,程序员认为这个状态是true。一般来说assert在开发的时候是检查程序的安全性的,在发布的时候通常都不使用assert。在14中添加了assert关键字和javalangAssertError类的支持。首先,我们有必要从一个例子说起assertpublicclassAssertTestpublicstaticvoidmain(Stringargs)AssertTestat=newAssertTest();atassertMe(true);atassertMe(false);privatevoidassertMe(booleanboo)assertboo?true:false;Systemoutprintln(truecondition);程序中包含了assert的话,你要用javac-source14xxxjava来编译,否则编译器会报错的。要想让assert得部分运行的话,要使用java-eaxxx来运行,否则包含assert得行会被忽略。下面我们运行javac-source14AssertTestjavajava-eaAssertTest看看结果的输出是:trueconditionExceptioninthreadmainjavalangAssertionErroratAssertTestassertMe(AssertTestjava:13)atAssertTestmain(AssertTestjava:7)当我们运行atassertMe(true)得时候,由于assertboo?true:false相当于asserttrue;因此没有任何问题,程序往下执行打印出truecondition,但是执行atassertMe(false)的时候相当于assertfalse,这个时候解释器就会抛出AssertionError了,程序就终止了。大家必须清楚AssertionError是继承自Error得,因此你可以不再程序中catch它的,当然你也可以在程序中catch它然后程序可以继续执行。例如:publicclassAssertTestpublicstaticvoidmain(Stringargs)AssertTestat=newAssertTest();tryatassertMe(true);atassertMe(false);catch(AssertionErrorae)Systemoutprintln(AsseriontErrorcatched);Systemoutprintln(goon);privatevoidassertMe(booleanboo)assertboo?true:false;Systemoutprintln(truecondition);assert还有另外一种表达的方式,就是assertexp1:exp2;其中exp1是个boolean返回值得表达式,而exp2可以是原始的数据类型或者对象都可以例如:booleanboo=true;Stringstr=null;assertboo=false:str=error;我们刚开始讲得assertexp1得形式,当exp1是false得时候,AssertionError得默认构造器会被调用,但是assertexp1:exp2这样的形式,当exp1为true的时候后面exp2被或略,如果false的话,后面的表达式的结果会被计算出来并作为AssertionError得构造器参数。看下面的例子:publicclassAssertTestpublicstaticvoidmain(Stringargs)AssertTestat=newAssertTest();atassertMe(true);atassertMe(false);privatevoidassertMe(booleanboo)Strings=null;assertboo?true:false:s=helloworld;Systemoutprintln(truecondition);运行的时候会得到这样的结果trueconditionExceptioninthreadmainjavalangAssertionError:helloworldatAssertTestassertMe(AssertTestjava:14)atAssertTestmain(AssertTestjava:7)Assert最好不要滥用,原因是assert并不一定都是enable的,下面两种情况就不应该用assert不要再public的方法里面检查参数是不是为null之类的操作例如publicintget(Strings)asserts!=null;如果需要检查也最好通过ifs=null抛出NullPointerException来检查不要用assert来检查方法操作的返回值来判断方法操作的结果例如assertlistremoveAll();这样看起来好像没有问题但是想想如果assert被disable呢,那样他就不会被执行了所以removeAll()操作就没有被执行可以这样代替booleanboo=listremoveAl();assertboo;就说这么多吧

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论