Java反射reflection与注解annotation的应用(自动测试机)(一)

2014-11-23 19:21:30 · 作者: · 浏览: 38
一.关于自动测试机
1.什么是自动测试机?
对类中的指定方法进行批量测试的工具
2.自动测试机又什么用?
a.避免了冗长的测试代码
当类中的成员方法很多时,对应的测试代码可能会很长,使用测试能够让测试代码非常简洁
b.降低了类与测试代码之间的耦合性
以防万一,测试时应该对类中所有方法进行测试。当我们对类中的一个方法做改动时,很可能我们的测试代码也要做相应改动(如改变了方法名,返回值类型等等),使用测试机能降低类与测试代码之间的耦合性,大大降低不必要的工作量。
c.增加了测试的灵活性
测试类与待测试类往往是分开的,设置测试参数时可能往往需要查看具体的方法体(寻找边界参数),这样很不方便。使用测试机的话,测试参数就在对应方法声明的位置(给方法添加相应注解),易于灵活修改参数。
3.测试机的原理
利用注解与反射就可以实现测试机了,原理非常简单,之前以为注解就是一种类型,没想过往这方面来应用...具体原理是:
根据待测试方法参数类型声明自定义注解 --> 为方法添加相应的注解 --> 利用反射机制编写测试机代码
二.参考资料
这么犀利的东西当然不是由我提出的,前辈在很久之前就提出了,链接:http://blog.csdn.net/rj042/article/details/6399965
P.S.建议把链接博文与本文一起看,原文介绍了很多相关的基础知识,本文是在其基础上展开的实践
三.实践
1.原文提出了自动测试机的问题:
-------
要求:
(1)定义一个单值注解TestCase,使其可以注解方法,并且可以被保留到程序运行时
注解的属性类型为String,要求可以使用简写方式为属性赋值
(2)定义一个类MyClass,要求有三个方法Method1、2、3
方法的参数、返回值类型均为String类型,返回值为传入的参数
使用(1)中的注解来注释Method1、3,并对属性参数赋值
(3)定义一个测试类TestMyClass,要求使用反射来测试MyClass中所有的被TestCase注解的方法
并将注解的属性值作为参数,调用相应方法来返回测试结果
-------以上内容摘自原文(直接把题目要求粘过来了...)
2.原文给出的代码几乎没有注释,而且拿来跑完了也不知道程序到底干了什么,可能前辈只是想演示一下过程吧
小菜鸟表示没有看懂,就对其 源码进行了详细的注释,以求彻底弄明白其原理
3.上代码(注释已经非常详细了)
[待测试类 Methods.java]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
//定义一个类Methods,要求有三个方法Method1、2、3
//方法的参数、返回值类型均为String类型,返回值为传入的参数
//使用自定义的注解来注释Method1、3,并对属性参数赋值
public class Methods {
/**
* @param args
*/
@Annotation("Param_1")//对Method1进行注解,表示自动测试机会对Method1感兴趣
public String Method1 (String s) {
//do something...like
s += "_X";
return s;
}
//不对Method2进行注解,自动测试机将滤去Method2
public String Method2 (String s) {
//do something...like
s += "_XX";
return s;
}
@Annotation("Param3")//同Method1
public String Method3 (String s) {
//do something...like
s += "_XXX";
return s;
}
}
[自定义注解类 Annotation.java]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
import java.lang.annotation.*;
//定义一个单值注解Annotation,使其可以注解方法,并且可以被保留到程序运行时
//注解的属性类型为String,要求可以使用简写方式为属性赋值
@Target ({ElementType.METHOD})//声明该注解的作用对象,可以是多个Type值
@Retention (RetentionPolicy.RUNTIME)//声明该注解可以被保留到程序运行时
public @interface Annotation {
//此处定义的value既是属性也是方法,相当于"value", value这样的键值对
String value();
//没有成员的注解叫标记注解
//只有一个成员的注解叫单值注解
//有多个成员的注解叫多值注解
}
[测试类(自动测试机) TestAnnotation.java]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
import java.lang.reflect.*;
//定义一个测试类TestAnnotation,要求使用反射来测试Methods中所有的被Annotation注解的方法
//并将注解的属性值作为参数,调用相应方法来返回测试结果
public class TestAnnotation {
/*
* 这就是所谓的自动测试机
* 即用注解给定的值作为待测试方法的参数,对指定类中的所有方法进行批量测试
* 避免了冗长的测试代码
*
* *