一般测试框架类,如JUnit,TestNG都可以通过设置指定具有某些名称的方法为测试方法,如以test开头的方法为测试方法,这样做的缺点包括:
1.如果方法名称拼写错误,不会有任何提示。如误拼为tsetHello(),测试时此方法不会被执行,但是也不会有任何错误提示
2.可能误执行其他方法,如testSafety()可能是业务方法,但因为符合测试方法的命名模式(以test开头的方法),所以在测试时会被调用
3.不能传递输入参数值给测试方法
使用Annotation可以避免以上问题,如以下使用方式:
//使用@Test标记测试方法
@Test
public void sayHello(){}
//通过设置@Test的dataProvider指定测试数据提供者
@Test(dataProvider="dataProvider1")
public void sayOK(String key,String value){}
以下简单介绍Annotation的使用。Annotation使用@interface声明,在某些情况下Annotation可视为接口(代替接口的功能),以下为自定义Annotation类:
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface MyAnnotation {
String value() default "OK";
}
@Documented指定在生成javadoc时,需要同时生成Annotation的帮助文档说明。如果Annotation与业务相关,一般需要生成说明文档
@Retention指定Annotation信息的保持策略,目前包含三种策略:SOURCE/CLASS/RUNTIME,分别对应把Annotation信息保持在源码里/编译后的class文件里/运行时加载到JVM里
@Target指定Annotation的应用目标,如上例设置为ElementType.METHOD,那么MyAnnotation仅能用于方法(method)上
Annotation的方法,如上例的value(),用于指定Annotation的参数值。方法的返回值仅能使用基本数据类型,String,Enum,Class,Annotation类型(包括对应的数组)。如果Annotation仅有一个参数,那么
建议方法名称为“value”。建议使用default指定方法的默认返回值
使用反射可获取目标所使用的Annotation,如下:
@Test
@MyAnnotation("OK")
public void testAnnotation() throws Exception{
Method method=AnnoTest.class.getDeclaredMethod("testAnnotation");
MyAnnotation myAnnotation=method.getAnnotation(MyAnnotation.class);
Assert.assertEquals(myAnnotation.value(), "OK");
}