자동화 테스트 키워드 구동의 원리 및 실현

9131 단어
자동화 테스트는 현재 점점 플랫폼화되고 있다. 플랫폼화는 협동 작업에 주력하고 효율을 높이며 더 많은 사람들이 자동화에 참여하게 하는 과정이다. 내가 보기에 플랫폼화에서 더욱 관건적인 점은 바로 키워드 구동이다. 자동화 테스트의 코드를 모두가 쉽게 이해할 수 있는 자연 언어로 전환해야 코드를 모르는 사람들이 더 많이 가입할 수 있고 플랫폼화의 목적을 달성할 수 있다.오늘 우리는 자동화 테스트에서 관건적인 구동의 원리와 실현 방식을 이야기할 것이다.
먼저 하나의 예를 보자, 선생님은 학생들에게 다음과 같이 말했다. 책상을 A지점에서 B지점으로 옮겨라.선생님이 이 명령을 내린 후에 아무도 움직이지 않았다. 명확한 대상이 없기 때문에 이 명령이 누구에게 내렸는지 몰랐다. 그래서 선생님은 다시 한 번 말했다. 장삼아, 책상을 A지점에서 B지점으로 옮겨라.이때 명확한 대상인 장삼이 생겼고 명령의 주체인 책상을 A에서 B로 옮겼다.그래서 이'장삼아, 책상을 A지점에서 B지점으로 옮겨라'는 두 가지 키워드가 있다. 장삼아, 책상을 A지점에서 B지점으로 옮겨라.이 두 키워드 중 하나가 부족하면 이 일은 완성할 수 없다.그래서 우리는 이 장면을 키워드 구동으로 이해할 수 있다. 만약에 우리가 위의 이 말을 코드로 변환한다면:
public class MoveDesk {
	
	private Person zhangsan;

	public void setZhangsan(Person zhangsan) {
		this.zhangsan = zhangsan;
	}

	public void moveDeskFromA2B(){
		zhangsan.getTheCommandFromTeacher();
		zhangsan.findTheDeskAtA();
		zhangsan.moveDeskToB();
		zhangsan.notifyTeacherHadFinished();
	}

	public static void main(String[] args) {
		MoveDesk md = new MoveDesk();
		md.setZhangsan("  ");
		md.moveDeskFromA2B();
	}

}

 
위의 코드는 당연히 위조 코드이지만 이를 통해 알 수 있듯이 하나의 목적을 달성하기 위해 절차가 똑같다. 그 두 가지 키워드는main 방법에서 장삼대응md.setZhangsan('장삼'), 테이블을 A지점에서 B지점으로 옮기는 대응md.moveDeskFromA2B()로 나타난다.이로부터 우리는 이렇게 이해할 수 있다. 모든 키워드는 구체적인 방법에 대응한다.따라서 키워드 구동의 실현 특징을 총괄해 보자.
1. 모든 키워드에 대응하는 방법(이하 관건적인 방법이라고 부른다)은 수시로 호출될 수 있어야 한다. 이것은 선생님이 장삼에게 내린 명령인 장삼에게 반드시 집행해야 하는 것과 같다.JAVA에서 이 관건적인 방법을 달성하기 위해 언제든지 호출될 수 있다. 그 유형의 대상은 반드시 사전에 new가 좋아야 하기 때문에 하나의 대상 탱크가 있어야 한다. 이 대상 탱크는 한 반과 같아서 많은 학생들이 선생님이 명령을 내리고 집행할 수 있다.
2. 키워드는 반드시 관건적인 방법과 관련되어야 한다. 예를 들어 선생님께서 장삼에게 책상을 옮기라고 하셨는데 장삼은 담배 한 갑을 사러 갔다. 이것은 옳지 않다. 그러므로 반드시 키워드와 관건적인 방법의 시사표가 있어야 한다.
3. 키워드의 해석 방식이 있어야 한다. 예를 들어 위의 명령에서 우리는 장삼을 얻어야 한다. 책상을 A지점에서 B지점으로 옮기는 두 가지 키워드를 얻어야 한다. 만약에 키워드를 얻어내지 못하면 관건적인 방법은 적게 집행된다. 위의 위조 코드에서md.setZhangsan('장삼')이라는 문장을 없애면 분명히 빈 바늘이 이상할 것이다.
4.위의 세 가지가 갖추어지면 바로 집행된다. 선생님이 내린 명령은 장삼이 집행할 수 있어야 한다. 물론 장삼이 가시라면 따로 말한다.JAVA 코드는 JVM에 맡길 수 있지만 키워드로 바뀌면 JVM은 이 키워드를 알지 못한다. 그래서 우리도 튼튼한 실행 엔진이 있어야 한다.'장삼아, 책상을 A지점에서 B지점으로 옮겨라'는 말이 성공적으로 실행될 수 있다.
위에서 말한 바와 같이 우리가 위의 네 가지를 코드를 통해 실현하기만 하면 간단한 키워드 구조의 모형이 나온다. 다음에 우리는 하나하나 실현한다.
1. 개체 풀:
public class RegisterCenter {
	
	public static Map OBJ_POOLS = new HashMap();
	
	static{
		OBJ_POOLS.put(MoveDesk.class.getName(), new MoveDesk());
	}
}

 
주요 메소드가 포함된 모든 클래스를 초기화한 다음 OBJPOOLS라는 대상에서 방면 뒤에 관건적인 방법을 직접 사용한다.(주해로 이루어보세요. 더 자랑스러울 거예요)
2. 매핑 테이블:
public class KeywordReflect {
	
	public static Map> KEYWORD_POOLS = new HashMap>();
	
	static{
		KEYWORD_POOLS.put("  ", KeywordReflect.methodInfo(MoveDesk.class.getName(), "setZhangsan"));
		KEYWORD_POOLS.put("    A    B  ", KeywordReflect.methodInfo(MoveDesk.class.getName(), "moveDeskFromA2B"));
	}
	
	public static Map methodInfo(String className, String methodName){
		Map methodInfo = new HashMap();
		methodInfo.put("class", className);
		methodInfo.put("method", methodName);
		return methodInfo;
	}
	
}

 
설명: 위의 KEYWORDPOOLS 대상의 데이터 구조는 MAP 안에 하나의 MAP를 씌운 것이다. 이것은 클래스 대상을 명확하게 해야 하기 때문이다. 클래스에 따라 같은 명칭의 방법이 있을 수 있기 때문에 혼란을 피하기 위해 방법의 클래스와 방법명을 표시해야 일일이 대응하는 맵을 만들 수 있다.(마찬가지로 주석으로 실현할 수 있다)
3. 키워드 확인
키워드를 해석할 수 있도록 우리는'장삼, 책상을 A지점에서 B지점으로 옮겨라'는 말의 키워드를 표시해야 한다.'${장삼}, ${책상을 A지점에서 B지점으로 옮겨라'로 바꾸면 키워드를 명확하게 표시한다. 직관적인 느낌에서 조금 다르지만 키워드 구동의 중요한 부분이다.다음 문제는 문자열의 ${}에 대한 해석으로 바뀌었습니다.
정규 클래스:
public class RegExp {
	
	public boolean match(String reg, String str) {
        return Pattern.matches(reg, str);
    }
 
    public List find(String reg, String str) {
        Matcher matcher = Pattern.compile(reg).matcher(str);
        List list = new ArrayList();
        while (matcher.find()) {
            list.add(matcher.group());
        }
        return list;
    }
     
}

키워드 클래스를 가져오려면 다음과 같이 하십시오.
public class ParseKeyword {
	
	public List getKeywords(String p){
	    String reg = "(?<=(? list = re.find(reg, p);
	    return list;
	}
	
	public static void main(String[] args) {
		ParseKeyword p = new ParseKeyword();
		System.out.println(p.getKeywords("a${a}a"));
		System.out.println(p.getKeywords("a\\${a}a"));
		System.out.println(p.getKeywords("a${a\\}a"));
		System.out.println(p.getKeywords("a${a\\}a}a"));
		System.out.println(p.getKeywords("a${a}a${"));
		System.out.println(p.getKeywords("a${ab}a${a}"));
	}
}

 
설명: 안에 정규예찰모드를 사용했는데 정규예찰모드는 정규 중의 상대적으로 높은 용법이다. 이것을 파악하면 당신의 정규가 한 단계 올라갈 것이다.
4. 실행 엔진:
실행 엔진은 먼저 실행해야 할 문장을 찾아야 하기 때문에 먼저 선생님이 보낸 명령을 읽어야 한다. 이 명령은 어떤 형식의 파일에 저장할 수 있고 읽을 수만 있다면 된다. 여기에command에 저장한다.txt:
이 명령을 읽으려면 다음과 같이 하십시오.
public class Executor {
	
	public List readTxtFile(String filePath) {
		List list = new ArrayList();
        try {
            String encoding = "UTF8";
            File file = new File(filePath);
            if (file.isFile() && file.exists()) {
                InputStreamReader read = new InputStreamReader(new FileInputStream(file), encoding);
                BufferedReader bufferedReader = new BufferedReader(read);
                String lineTxt = null;
                while ((lineTxt = bufferedReader.readLine()) != null) {
                	list.add(lineTxt);
                }
                read.close();
                bufferedReader.close();
            } else {
                System.out.println("        ");
            }
        } catch (Exception e) {
            System.out.println("        ");
            e.printStackTrace();
        }
        return list;
    }
	
	public static void main(String[] args) {
		Executor e = new Executor();
		System.out.println(e.readTxtFile("src/command.txt"));
	}
	
}

 
읽기 후 프로세스는 키워드 가져오기->키워드 가져오기->키워드 가져오기->실행 키워드입니다.
public class Executor {
	
	private ParseKeyword pk = new ParseKeyword();
	
	public List readTxtFile(String filePath) {
		List list = new ArrayList();
        try {
            String encoding = "UTF8";
            File file = new File(filePath);
            if (file.isFile() && file.exists()) {
                InputStreamReader read = new InputStreamReader(new FileInputStream(file), encoding);
                BufferedReader bufferedReader = new BufferedReader(read);
                String lineTxt = null;
                while ((lineTxt = bufferedReader.readLine()) != null) {
                	list.add(lineTxt);
                }
                read.close();
                bufferedReader.close();
            } else {
                System.out.println("        ");
            }
        } catch (Exception e) {
            System.out.println("        ");
            e.printStackTrace();
        }
        return list;
    }
	
	public void executor(){
		List commands = this.readTxtFile("src/command.txt");
		for (String command : commands) {
			List keywords = pk.getKeywords(command);
			for (String keyword : keywords) {
				this.invoke(keyword);
			}
		}
	}
	
	public void invoke(String keyword){
		Map keyMethod = KeywordReflect.KEYWORD_POOLS.get(keyword);
		String className = keyMethod.get("class");
		String methodName = keyMethod.get("method");
		Object obj = RegisterCenter.OBJ_POOLS.get(className);
		Method method = this.getMethod(methodName, obj);
		try {
			method.invoke(obj);
		} catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {
			e.printStackTrace();
		}
	}
	
	private Method getMethod(String methodName, Object obj) {
		try {
			Method[] methods = obj.getClass().getMethods();
			for (Method m : methods) {
				if (m.getName().equals(methodName)) {
					return m;
				}
			}
		} catch (SecurityException e) {
			return null;
		}
		return null;
	}
	
	public static void main(String[] args) {
		Executor e = new Executor();
		e.executor();
	}
	
}

 
실행 결과를 볼 수 있도록 MoveDesk 클래스를 수정합니다.
public class MoveDesk {
	
	public void setZhangsan() {
		System.out.println("this is zhangsan");
	}

	public void moveDeskFromA2B(){
		System.out.println("this is test!");
	}

}

 
이렇게 집행하면 이 두 가지 관건적인 방법체가 집행되는 것을 볼 수 있다!실행 엔진에서 가장 중요한 것은 JAVA의 반사를 이용하여 실행하는 방법입니다!
이상의 코드는 테스트를 거쳐 실행되었습니다!
이로부터 가장 간단한 키워드 드라이브 프레임이 구축되었고 다음과 같은 몇 가지 부분은 모두가 스스로 완성해야 한다. 관건적인 방법의 매개 변수 처리, 관건적인 방법의 반환값 처리, 이상 처리, 데이터 드라이브와 결합하고 테스트 프레임워크(TESTNG/JUNIT) 등이다.여러분들이 스스로 발휘할 수 있도록 최적화된 공간도 많습니다!

좋은 웹페이지 즐겨찾기