JAVA 自定义注解在自动化测试中的使用

来源:互联网 发布:cmd执行java class文件 编辑:程序博客网 时间:2024/06/11 17:09

转载地址:http://www.cnblogs.com/zhangfei/p/4533202.html


在UI自动化测试中,相信很多人都喜欢用所谓的PO模式,其中的P,也就是page的意思,于是乎,在脚本里,或者在其它的page里,会要new很多的page对象,这样很麻烦,前面我们也讲到了注解的使用,很方便,那么我们可不可以用注解来代替这个new的过程呢?只有想不到,没有办不到的,因为springMVC就是用了这个方式来IOC,当然我们也可以直接用springMVC,但这无异于用牛刀来切豆腐,还不如我们自已实现一下,顺便增加一下对注解的使用的认识,代码如下:

1.先定义一个LoadPage的注解:

1
2
3
4
5
6
7
8
9
10
11
12
package com.test.annotation;
 
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
 
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface LoadPage {
    String value();
}

 2.再来实现一下这个注解:

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
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
package com.test.annotation;
 
import java.io.File;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.List;
 
import org.openqa.selenium.WebDriver;
 
public class LoadAllPage {
     
    publicfinal String basePath ="com.test";
     
    privatefinal String binPath ="bin";
     
    privateList<String> allClass = newArrayList<String>();   
     
    privateWebDriver driver;  
     
    publicvoid setDriver(WebDriver driver) {
        this.driver = driver;
    }
 
    publicvoid loadAllPage(){     
        this.listAllFiles(binPath+File.separator+basePath.replace(".","/"));
        this.getPageInstance();
    }
     
    privatevoid listAllFiles(String path){
        path = path.replace("\\","/");
        File file =new File(path);
        if(file.isFile() && file.getName().endsWith(".class")){
            String filePath = file.getPath().replace("\\","/");           
            intstartIndex = 4;
            intendIndex = filePath.lastIndexOf(".class");
            allClass.add(filePath.substring(startIndex, endIndex).replace("/","."));              
        }elseif(file.isDirectory()){
            File[] files = file.listFiles();
            for(File f : files) {
                this.listAllFiles(f.getPath());
            }
        }
    }
     
    privatevoid getPageInstance(){
        for(String clazz : allClass) {
            try{              
                Class<?> c = Class.forName(clazz);               
                if(c.isAnnotationPresent(LoadPage.class)){
                    LoadPage lp = c.getAnnotation(LoadPage.class);
                    Constructor<?> cons = c.getConstructor(WebDriver.class);                 
                    InitialManger.allInstance.put(lp.value(), cons.newInstance(driver));
                }
            }catch (ClassNotFoundException e) {               
                e.printStackTrace();
            }catch (InstantiationException e) {               
                e.printStackTrace();
            }catch (IllegalAccessException e) {
                e.printStackTrace();
            }catch (SecurityException e) {
                e.printStackTrace();
            }catch (NoSuchMethodException e) {
                e.printStackTrace();
            }catch (IllegalArgumentException e) {
                e.printStackTrace();
            }catch (InvocationTargetException e) {
                e.printStackTrace();
            }
        }
    }  
 
    publicstatic void main(String[] args) {
        LoadAllPage lap =new LoadAllPage();
        lap.loadAllPage(); 
    }
}

 3.再定义一个Page注解:

1
2
3
4
5
6
7
8
9
10
11
12
package com.test.annotation;
 
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
 
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Page {
    publicString name() default"";
}

 4.同样的,需要实现下Page注解

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
package com.test.annotation;
 
import java.lang.reflect.Field;
import java.util.Iterator;
 
public class AutoPage {
     
    publicvoid setPageAnnotation(){
        Iterator<String> it = InitialManger.allInstance.keySet().iterator();
        while(it.hasNext()){
            String key = it.next();
            try{              
                Class<?> c = InitialManger.allInstance.get(key).getClass();              
                Field[] fields = c.getDeclaredFields();
                for(Field field : fields) {
                    field.setAccessible(true);
                    if(field.isAnnotationPresent(Page.class)){
                        field.set(InitialManger.allInstance.get(key), InitialManger.allInstance.get(field.getAnnotation(Page.class).name()));
                    }
                }
            }catch (IllegalAccessException e) {
                e.printStackTrace();
            }catch (SecurityException e) {
                e.printStackTrace();
            }catch (IllegalArgumentException e) {
                e.printStackTrace();
            }
        }      
    }  
     
    publicvoid setTestAnnotation(Object o) {
        try{              
            Class<?> c = o.getClass();               
            Field[] fields = c.getDeclaredFields();
            for(Field field : fields) {
                field.setAccessible(true);
                if(field.isAnnotationPresent(Page.class)){
                    field.set(o, InitialManger.allInstance.get(field.getAnnotation(Page.class).name()));
                }
            }  
        }catch (IllegalAccessException e) {
            e.printStackTrace();
        }catch (SecurityException e) {
            e.printStackTrace();
        }catch (IllegalArgumentException e) {
            e.printStackTrace();
        }
    }
     
}

 5.增加一个所有page实例化后的对象管理类:

1
2
3
4
5
6
7
8
9
10
package com.test.annotation;
 
import java.util.HashMap;
import java.util.Map;
 
public class InitialManger {
     
    publicstatic Map<String, Object> allInstance =new HashMap<String, Object>();
     
}

 6.再来初始化一下实现注解类:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
package com.test.annotation;
 
import org.openqa.selenium.WebDriver;
 
public class InitialAnnotation {
     
    privateWebDriver driver;
     
    publicInitialAnnotation(WebDriver driver) {
        this.driver = driver;
    }
 
    publicvoid initialAnnotation(){       
        LoadAllPage lap =new LoadAllPage();
        lap.setDriver(driver);
        lap.loadAllPage();
        AutoPage ap =new AutoPage();
        ap.setPageAnnotation();
    }
 
     
}

 7.接下来就是使用了:在一个Page中加上这个@LoadPage注解:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
package com.test.page;
 
import org.openqa.selenium.WebDriver;
 
import com.test.annotation.LoadPage;
import com.test.base.Page;
 
@LoadPage("firstPage")
public class FirstPage extendsPage{
 
    publicFirstPage(WebDriver driver) {
        super(driver);     
    }
     
    publicvoid linkToMobileList(){
        driver.navigate().to("http://www.baidu.com");
    }
 
}

 8.为了使@Page注解在case中能用到,所以得在TestBase的@BeforeClass中添加如下代码:

1
2
3
4
5
6
if(InitialManger.allInstance.isEmpty()){
            InitialAnnotation init =new InitialAnnotation(driver);
            init.initialAnnotation();
        }
        AutoPage ap =new AutoPage();
        ap.setTestAnnotation(this);

 9.在CASE中这样用即可:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
package com.test.testcases;
 
import java.util.Map;
 
import org.testng.annotations.Test;
 
import com.test.annotation.Page;
import com.test.base.TestBase;
import com.test.page.FirstPage;
 
public class Test2 extendsTestBase{
     
    @Page(name="firstPage")
    privateFirstPage firstPage;
     
    @Test(dataProvider="providerMethod")
    publicvoid testLogin(Map<String, String> param){
        firstPage.linkToMobileList();
    }
 
}

 整个过程就是这样的,可能有人会说这样也不方便,等等等等,总是有人能接受,有人不能接受的,如果能接受,可以找我共同讨论一下。QQ:408129370

 

点亮测试人生!QQ:408129370

0 0