学习笔记之junit总结

 

JUnit中的assert方法全部放在Assert类中,现在总结一下经常用到的junit类中assert方法。
1.assertTrue/False([String message],boolean condition) 判断一个条件是true还是false。
2.fail([String message,]); 失败,可以有消息,也可以没有消息。
3.assertEquals([String message],Object expected,Object actual); 判断是否相等,可以指定输出错误信息。
4.assertNotNull/Null([String message],Object obj); 判读一个对象是否非空(非空)。
5.assertSame/NotSame([String message],Object expected,Object actual); 判断两个对象是否指向同一个对象。看内存地址。
JUnit4是较历史版本有了很大的改进,我以前自己用的是JUnit3。JUnit4的主要方便是利用Java5的Annotation特性简化测试用例的编写。
记得以前在JUnit 3中我是这样写一个单元测试的:
public class AddOperation {

public int add(int x,int y){

return x+y;

}

}
复制代码
要测试add这个方法,写单元测试得这么写,一定要注意的是以下两点
1.单元测试类必须继承自TestCase。
2.要测试的方法必须以test开头。
public class AddOperationTest extends TestCase{

public void testAdd() {

System.out.println(“add”);

int x = 0;

int y = 0;

AddOperation instance = new AddOperation();

int expResult = 0;

int result = instance.add(x, y);

assertEquals(expResult, result);

}

}
复制代码
如果上面那个单元测试在JUnit 4中写就不会这么复杂。代码如下:
public class AddOperationTest extends TestCase{

@Test

public void add() {

System.out.println(“add”);

int x = 0;

int y = 0;

AddOperation instance = new AddOperation();

int expResult = 0;

int result = instance.add(x, y);

assertEquals(expResult, result);

}

}
复制代码
采用Annotation的JUnit已经不会要求必须继承自TestCase了,而且测试方法也不必以test开头了,只要以@Test元数据来描述即可。
另外还有其他的几个Annotation:
@Before:
使用了该元数据的方法在每个测试方法执行之前都要执行一次。
@After:
使用了该元数据的方法在每个测试方法执行之后要执行一次。
注意:@Before和@After标示的方法只能各有一个。这个相当于取代了JUnit以前版本中的setUp和tearDown方法。
@Test(expected=*.class)
在JUnit4.0之前,对错误的测试,我们只能通过fail来产生一个错误,并在try块里面assertTrue(true)来测试。现在,通过@Test元数据中的expected属性。expected属性的值是一个异常的类型
@Test(timeout=xxx):
该元数据传入了一个时间(毫秒)给测试方法,
如果测试方法在制定的时间之内没有运行完,则测试也失败。
@ignore:
该元数据标记的测试方法在测试中会被忽略。当测试的方法还没有实现,或者测试的方法已经过时,或者在某种条件下才能测试该方法(比如需要一个数据库联接,而在本地测试的时候,数据库并没有连接),那么使用该标签来标示这个方法。同时,你可以为该标签传递一个String的参数,来表明为什么会忽略这个测试方法。比如:@lgnore(“该方法还没有实现”),在执行的时候,仅会报告该方法没有实现,而不会运行测试方法.
以上是我按照学习计划目标在本阶段的学习内容,如有错误请指正。

 

按照自己定的学习计划,今天是该写点什么了。  在上篇文章里提到的是JUnit的学习,其中就涉及到了一些内置的annotation,如@Test、@Ignore等。现在我就结合个人的理解谈下如何自定义自己的annotation。
  annotation能被用来为某个程序元素(类、方法、成员变量等)关联任何的信息,但annotaion不能影响程序代码的执行,无论增加、删除annotation,代码都始终如一的执行。另外,尽管一些annotation通过java的反射api方法在运行时被访问,而java语言解释器在工作时忽略了这些annotation。正是由于java虚拟机忽略了annotation,导致了 annotation类型在代码中是“不起作用”的;只有通过某种配套的工具才会对annotation类型中的信息进行访问和处理,因而使用简便。
  先说下定义annotation的语法。@interface是一个关键字,在自定义自己annotations的时候必须把一个类型定义为@interface,而不能用class或interface关键字,形如“public @interface MyAnnotation{ }”,以下是定义的几个示例:
  1.无任何方法/属性Annotation
  
2,具有一个方法getValue( )的Annotation

3,  具有一个特殊方法value( )的Annotation(特殊性下面会提到)

4,具有一个方法和属性的Annotation

5,具有多个方法的Annotation

在上面的例子中可以看到,其实申明一个annotation和interface、class不同的是关键字@interface,而且它还可以对方法设置默认的返回值,如上图的“  public int getSingleNumber() default 0 ;     ”,设置默认返回0。还有个显著的不同就是在申明每个Annotation的上面有几个标签@Target、@Retention。
  annotation的target是一个被标注的程序元素。target说明了annotation所修饰的对象范围:annotation可被用于 packages、types(类、接口、枚举、annotation类型)、类型成员(方法、构造方法、成员变量、枚举值)、方法参数和本地变量(如循环变量、catch参数)。在annotation类型的声明中使用了target可更加明晰其修饰的目标。annotation的retention定义了该annotation被保留的时间长短:某些annotation仅出现在源代码中,而被编译器丢弃;而另一些却被编译在class文件中;编译在class文件中的annotation可能会被虚拟机忽略,而另一些在class被装载时将被读取(请注意并不影响class的执行,因为annotation与class在使用上是被分离的)。使用这个meta-annotation可以对 annotation的“生命周期”限制。RetentionPolicy是一个enum类型,共有三个值,分别是SOURCE,CLASS 和 RUNTIME。SOURCE代表的是这个Annotation类型的信息只会保留在程序源码里,源码如果经过了编译之后,Annotation的数据就会消失,并不会保留在编译好的.class文件里面。ClASS的意思是这个Annotation类型的信息保留在程序源码里,同时也会保留在编译好的.class文件里面,在执行的时候,并不会把这一些信息加载到虚拟机(JVM)中去.注意一下,当你没有设定一个Annotation类型的Retention值时,系统默认值是CLASS. 第三个,是RUNTIME,表示在源码、编译好的.class文件中保留信息,在执行的时候会把这一些信息加载到JVM中去的。
  下面是如何使用自己定义的annotation:

从上面的测试代码可以看出:使用一个annotation的语法是 由“@+annotation类型名称+(..逗号分割的name-value对…)”组成。其中成员可以按照任何的顺序。如果annotation 类型定义了某个成员的默认值,则这个成员可以被省略。成员值必须为编译时常量、内嵌的annotation或者数组。
上面提到了一个特殊性,大家可以对比下上面的testMethod2和testMethod3上的annotation,会发现@OneMethodSpecialInAnnotation的值”Hello,world!”是没有匹配的name,那么这个值到底传给谁了?其实这里有一个约定。如果没有写属性名的值,而这个注释又有value属性,就将这个值赋给value属性,相当于是(value=”Hello,world!”)。
main方法是一个对上面进行测试的,其输出是:
the method testMethod1 is not wired!!
the method testMethod2 is not wired!!
the method testMethod3 is not wired!!
the method testMethod4 is not wired!!
the method testMethod5 is wired!!
为什么输出“testMethod5 is wired”呢?因为执行了这句代码:if (method.isAnnotationPresent(MultiMethodsInAnnotation.class))。@MultiMethodsInAnnotation是在testMethod5 上的,如果换成其他的annotation,也会得到相应的提示。isAnnotationPresent()方法对于检查marker annotation是十分有用的,因为marker annotation没有成员变量,所以我们只要知道class的方法是否使用了annotation修饰就可以了。而当处理具有成员的 annotation时,我们通过使用getAnnotation()方法来获得annotation的成员信息(成员名称、成员值)。这里我们看到了一套优美的java annotation系统:如果annotation存在,那么实现了相应的annotation类型接口的对象将被getAnnotation()方法返回,接着调用定义在annotation类型中的成员方法可以方便地获得任何成员值。
  现在我们再来个High点的,如何访问一个annotation里的各个方法,如下:

至此,感觉自己学到的也就这么多了,也不知道是不是太肤浅。相信Annotation技术在不久的将来将得到更好的发展!至于在实际测试中用到的DBunit中的@DataSet macker是如何将场景数据自动插入到数据库的源码学习,将在以后的总结中给出。
最后,谢谢各位能抽出时间看完这篇文章,文中如有不当,请指正,谢谢!
O(∩_∩)O
 - 本文出自天天软件测试社区,原文地址:http://www.365testing.com/bbs/thread-33757-1-1.html


 - 本文出自天天软件测试社区,原文地址:http://www.365testing.com/bbs/thread-33758-1-1.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值