자동화 테스트 키워드 구동의 원리 및 실현
먼저 하나의 예를 보자, 선생님은 학생들에게 다음과 같이 말했다. 책상을 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) 등이다.여러분들이 스스로 발휘할 수 있도록 최적화된 공간도 많습니다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.