JAVA 自定义注解在自动化测试中的使用
在UI自动化测试中,相信很多人都喜欢用所谓的PO模式,其中的P,也就是page的意思,于是乎,在脚本里,或者在其它的page里,会要new很多的page对象,这样很麻烦,前面我们也讲到了注解的使用,很方便,那么我们可不可以用注解来代替这个new的过程呢?只有想不到,没有办不到的,因为springMVC就是用了这个方式来IOC,当然我们也可以直接用springMVC,但这无异于用牛刀来切豆腐,还不如我们自已实现一下,顺便增加一下对注解的使用的认识,代码如下:
1.先定义一个LoadPage的注解:
- 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.再来实现一下这个注解:
- 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 {
- public final String basePath = "com.test";
- private final String binPath = "bin";
- private List<String> allClass = new ArrayList<String>();
- private WebDriver driver;
- public void setDriver(WebDriver driver) {
- this.driver = driver;
- }
- public void loadAllPage(){
- this.listAllFiles(binPath+File.separator+basePath.replace(".","/"));
- this.getPageInstance();
- }
- private void listAllFiles(String path){
- path = path.replace("\\", "/");
- File file = new File(path);
- if(file.isFile() && file.getName().endsWith(".class")){
- String filePath = file.getPath().replace("\\", "/");
- int startIndex = 4;
- int endIndex = filePath.lastIndexOf(".class");
- allClass.add(filePath.substring(startIndex, endIndex).replace("/", "."));
- }else if(file.isDirectory()){
- File[] files = file.listFiles();
- for (File f : files) {
- this.listAllFiles(f.getPath());
- }
- }
- }
- private void 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();
- }
- }
- }
- public static void main(String[] args) {
- LoadAllPage lap = new LoadAllPage();
- lap.loadAllPage();
- }
- }
3.再定义一个Page注解:
- 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 {
- public String name() default "";
- }
4.同样的,需要实现下Page注解
- package com.test.annotation;
- import java.lang.reflect.Field;
- import java.util.Iterator;
- public class AutoPage {
- public void 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();
- }
- }
- }
- public void 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实例化后的对象管理类:
- package com.test.annotation;
- import java.util.HashMap;
- import java.util.Map;
- public class InitialManger {
- public static Map<String, Object> allInstance = new HashMap<String, Object>();
- }
6.再来初始化一下实现注解类:
- package com.test.annotation;
- import org.openqa.selenium.WebDriver;
- public class InitialAnnotation {
- private WebDriver driver;
- public InitialAnnotation(WebDriver driver) {
- this.driver = driver;
- }
- public void initialAnnotation(){
- LoadAllPage lap = new LoadAllPage();
- lap.setDriver(driver);
- lap.loadAllPage();
- AutoPage ap = new AutoPage();
- ap.setPageAnnotation();
- }
- }
7.接下来就是使用了:在一个Page中加上这个@LoadPage注解:
- package com.test.page;
- import org.openqa.selenium.WebDriver;
- import com.test.annotation.LoadPage;
- import com.test.base.Page;
- @LoadPage("firstPage")
- public class FirstPage extends Page{
- public FirstPage(WebDriver driver) {
- super(driver);
- }
- public void linkToMobileList(){
- driver.navigate().to("http://www.baidu.com");
- }
- }
8.为了使@Page注解在case中能用到,所以得在TestBase的@BeforeClass中添加如下代码:
- if(InitialManger.allInstance.isEmpty()){
- InitialAnnotation init = new InitialAnnotation(driver);
- init.initialAnnotation();
- }
- AutoPage ap = new AutoPage();
- ap.setTestAnnotation(this);
9.在CASE中这样用即可:
- 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 extends TestBase{
- @Page(name="firstPage")
- private FirstPage firstPage;
- @Test(dataProvider="providerMethod")
- public void testLogin(Map<String, String> param){
- firstPage.linkToMobileList();
- }
- }
整个过程就是这样的,可能有人会说这样也不方便,等等等等,总是有人能接受,有人不能接受的,如果能接受,可以找我共同讨论一下。QQ:408129370
JAVA 自定义注解在自动化测试中的使用的更多相关文章
- java自定义注解知识实例及SSH框架下,拦截器中无法获得java注解属性值的问题
一.java自定义注解相关知识 注解这东西是java语言本身就带有的功能特点,于struts,hibernate,spring这三个框架无关.使用得当特别方便.基于注解的xml文件配置方式也受到人们的 ...
- java自定义注解类
一.前言 今天阅读帆哥代码的时候,看到了之前没有见过的新东西, 比如java自定义注解类,如何获取注解,如何反射内部类,this$0是什么意思? 于是乎,学习并整理了一下. 二.代码示例 import ...
- java自定义注解实现前后台参数校验
2016.07.26 qq:992591601,欢迎交流 首先介绍些基本概念: Annotations(also known as metadata)provide a formalized way ...
- java自定义注解注解方法、类、属性等等【转】
http://anole1982.iteye.com/blog/1450421 http://www.open-open.com/doc/view/51fe76de67214563b20b385320 ...
- Java自定义注解源码+原理解释(使用Java自定义注解校验bean传入参数合法性)
Java自定义注解源码+原理解释(使用Java自定义注解校验bean传入参数合法性) 前言:由于前段时间忙于写接口,在接口中需要做很多的参数校验,本着简洁.高效的原则,便写了这个小工具供自己使用(内容 ...
- JAVA自定义注解 ------ Annotation
日常开发工作中,合理的使用注解,可以简化代码编写以及使代码结构更加简单,下面记录下,JAVA自定义注解的开发过程. 定义注解声明类. 编写注解处理器(主要起作用部分). 使用注解. 相关知识点介绍, ...
- Java自定义注解和运行时靠反射获取注解
转载:http://blog.csdn.net/bao19901210/article/details/17201173/ java自定义注解 Java注解是附加在代码中的一些元信息,用于一些工具在编 ...
- Java自定义注解的实现
Java自定义注解的实现,总共三步(eg.@RandomlyThrowsException): 1.首先编写一个自定义注解@RandomlyThrowsException package com.gi ...
- JAVA自定义注解
在学习使用Spring和MyBatis框架的时候,使用了很多的注解来标注Bean或者数据访问层参数,那么JAVA的注解到底是个东西,作用是什么,又怎样自定义注解呢?这篇文章,即将作出简单易懂的解释. ...
随机推荐
- 【AtCoder】AGC017
在此处输入标题 标签(空格分隔): 未分类 A - Biscuits dp[i][0/1]表示当前和是偶数还是奇数,直接转移即可 #include <bits/stdc++.h> #def ...
- Codeforces 555D Case of a Top Secret
Case of a Top Secret 感觉除了两个点在那循环的部分, 其他时候绳子的长度每次变为一半一下, 就变成了Log(l)步.. 然后就暴力找就好啦, 循环的部分取个模. #include& ...
- BZOJ1103 [POI2007]大都市meg dfs序 线段树
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1103 题意概括 一棵树上,一开始所有的边权值为1,我们要支持两种操作: 1. 修改某一条边的权值为 ...
- JavaScript开发区块链只需200行代码
用JavaScript开发实现一个简单区块链.通过这一开发过程,你将理解区块链技术是什么:区块链就是一个分布式数据库,存储结构是一个不断增长的链表,链表中包含着许多有序的记录. 然而,在通常情况下,当 ...
- HDU 1358 Period (kmp求循环节)(经典)
<题目链接> 题目大意: 意思是,从第1个字母到第2字母组成的字符串可由某一周期性的字串(“a”) 的两次组成,也就是aa有两个a组成: 第三行自然就是aabaab可有两个aab组成: 第 ...
- Angular 个人深究(二)【发布与订阅】
Angular 个人深究(二)[发布与订阅] 1. 再入正题之前,首先说明下[ 发布与订阅模式](也叫观察者模式) 1) 定义:定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象.这个 ...
- supervisor管理进程工具配置
Supervisor(http://supervisord.org/)是用Python开发的一个client/server服务,是Linux/Unix系统下的一个进程管理工具,不支持Windows系统 ...
- adb monkey测试 命令
adb shell monkey -p cn.com.linktrust.als.ipad 3500 LOWED_PACKAGE [-p ALLOWED_PACKAGE] ...] [-c MAIN_ ...
- PHP函数 ------ ctype_alnum
//判断是否是字母和数字或字母数字的组合 if(!ctype_alnum($str)){ echo '只能是字母或数字的组合';exit; }整理下ctype functions: 1.ctype_a ...
- 潭州课堂25班:Ph201805201 并发 第九课 (课堂笔记)
TCP/IP 1,建立连接(三次握手) 1,客户端发起请求 2,服务器请求回应 3,请求确认,双方建立连接 2,数据传输 3,断开连接(四次挥手) 1,客户端请求断开 连接 2,服务器回应请求 3,服 ...