diff --git a/.idea/libraries/Maven__org_javassist_javassist_3_21_0_GA.xml b/.idea/libraries/Maven__org_javassist_javassist_3_21_0_GA.xml new file mode 100644 index 0000000..09c4cf0 --- /dev/null +++ b/.idea/libraries/Maven__org_javassist_javassist_3_21_0_GA.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_reflections_reflections_0_9_11.xml b/.idea/libraries/Maven__org_reflections_reflections_0_9_11.xml new file mode 100644 index 0000000..d8b2fb5 --- /dev/null +++ b/.idea/libraries/Maven__org_reflections_reflections_0_9_11.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/pom.xml b/pom.xml index fc157b3..f03e7e1 100644 --- a/pom.xml +++ b/pom.xml @@ -299,5 +299,11 @@ + + + org.reflections + reflections + 0.9.11 + diff --git a/src/main/java/luckyclient/caserun/publicdispose/ActionContext.java b/src/main/java/luckyclient/caserun/publicdispose/ActionContext.java new file mode 100644 index 0000000..dab8c66 --- /dev/null +++ b/src/main/java/luckyclient/caserun/publicdispose/ActionContext.java @@ -0,0 +1,65 @@ +package luckyclient.caserun.publicdispose; + +import luckyclient.caserun.publicdispose.actionkeyword.Action; +import luckyclient.caserun.publicdispose.actionkeyword.ActionKeyWordParser; +import luckyclient.publicclass.LogUtil; +import org.reflections.Reflections; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.Collections; +import java.util.Map; +import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; + +/** + * 步骤动作容器,根据参数生成不同的动作关键字类型,执行相应的解析 + * @author: sunshaoyan@ + * @date: Created on 2019/4/13 + */ +public class ActionContext { + + private static Logger logger = LoggerFactory.getLogger(ActionContext.class); + + private static Map allActions; + + static { + Reflections reflections = new Reflections("luckyclient.caserun.publicdispose.actionkeyword"); + Set> annotatedClasses = + reflections.getTypesAnnotatedWith(Action.class); + allActions = new ConcurrentHashMap(); + for (Class classObject : annotatedClasses) { + Action action = (Action) classObject + .getAnnotation(Action.class); + allActions.put(action.name(), classObject); + } + allActions = Collections.unmodifiableMap(allActions); + } + + private ActionKeyWordParser action; + + public ActionContext(String name){ + + if (allActions.containsKey(name)) { + logger.info("Created Action name is {}", name); + try { + action = (ActionKeyWordParser) allActions.get(name).newInstance(); + } catch (InstantiationException | IllegalAccessException ex) { + logger.error("Instantiate Action failed", ex); + } + } else { + logger.error("Specified Action name {} does not exist", name); + } + } + + public String parse(String actionKeyWord,String testResult) { + if(null != action){ + testResult = action.parse(actionKeyWord, testResult); + }else { + testResult="未检索到对应动作关键字,直接跳过此动作,请检查关键字:"+actionKeyWord; + LogUtil.APP.error("未检索到对应动作关键字,直接跳过此动作,请检查关键字:"+actionKeyWord); + } + return testResult; + } + +} diff --git a/src/main/java/luckyclient/caserun/publicdispose/ActionManageForSteps.java b/src/main/java/luckyclient/caserun/publicdispose/ActionManageForSteps.java index 0556a38..040539b 100644 --- a/src/main/java/luckyclient/caserun/publicdispose/ActionManageForSteps.java +++ b/src/main/java/luckyclient/caserun/publicdispose/ActionManageForSteps.java @@ -1,6 +1,5 @@ package luckyclient.caserun.publicdispose; -import luckyclient.driven.SubString; import luckyclient.publicclass.LogUtil; /** @@ -13,12 +12,11 @@ import luckyclient.publicclass.LogUtil; * @date 2019年1月15日 */ public class ActionManageForSteps { + /** * 解析用例步骤 - * @param projectcase - * @param step - * @param taskid - * @param caselog + * @param stepsaction + * @param testresult * @return */ public static String actionManage(String stepsaction,String testresult){ @@ -28,7 +26,7 @@ public class ActionManageForSteps { LogUtil.APP.info("Action(动作)无需处理......"); return testresult; } - stepsaction=stepsaction.toLowerCase().trim(); + stepsaction=stepsaction.trim(); String[] temp=stepsaction.split("\\|",-1); for(String actionorder:temp){ if(null!=actionorder&&!"".equals(actionorder.trim())){ @@ -37,93 +35,29 @@ public class ActionManageForSteps { } return testresult; } - + /** * 动作关键字执行 - * @param actionorder - * @param testresult + * @param actionKeyWord + * @param testResult * @return */ - private static String actionExecute(String actionorder,String testresult){ + private static String actionExecute(String actionKeyWord,String testResult){ try{ - // 处理动作事件 - if(actionorder.endsWith("#wait")){ - if(ChangString.isInteger(actionorder.substring(0, actionorder.lastIndexOf("#wait")))){ - try { - // 获取步骤间等待时间 - int time=Integer.parseInt(actionorder.substring(0, actionorder.lastIndexOf("#wait"))); - if (time > 0) { - LogUtil.APP.info("Action(Wait):线程等待"+time+"秒..."); - Thread.sleep(time * 1000); - } - } catch (InterruptedException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - }else{ - LogUtil.APP.warn("使用等待关键字的参数不是整数,直接跳过此动作,请检查!"); - } - }else if(actionorder.endsWith("#getjv")){ - String actionparams=actionorder.substring(0, actionorder.lastIndexOf("#getjv")); - String key=""; - String index="1"; - if(actionparams.endsWith("]")&&actionparams.contains("[")){ - key=actionparams.substring(0,actionparams.lastIndexOf("[")); - index=actionparams.substring(actionparams.lastIndexOf("[")+1, actionparams.lastIndexOf("]")); - testresult=SubString.getJsonValue(testresult, key, index); - }else{ - key=actionparams; - testresult=SubString.getJsonValue(testresult, key, index); - } - LogUtil.APP.info("Action(getJV):获取JSON字符串指定Key的值是:"+testresult); - }else if(actionorder.endsWith("#subcentrestr")){ - String actionparams=actionorder.substring(0, actionorder.lastIndexOf("#subcentrestr")); - String startstr=""; - String endstr=""; - if(actionparams.startsWith("[")&&actionparams.endsWith("]")){ - startstr=actionparams.substring(actionparams.indexOf("[")+1, actionparams.indexOf("]")); - endstr=actionparams.substring(actionparams.lastIndexOf("[")+1, actionparams.lastIndexOf("]")); - testresult=SubString.subCentreStr(testresult, startstr, endstr); - LogUtil.APP.info("Action(subCentreStr):截取测试结果指定开始及结束位置字符串:"+testresult); - }else{ - testresult="步骤动作:subCentreStr 必须是[\"开始字符\"][\"结束字符\"]#subCentreStr 格式,请检查您的步骤动作关键字:"+actionorder; - LogUtil.APP.warn("步骤动作:subCentreStr 必须是[\"开始字符\"][\"结束字符\"]#subCentreStr 格式,请检查您的步骤动作关键字:"+actionorder); - } - }else if(actionorder.endsWith("#subcentrenum")){ - String actionparams=actionorder.substring(0, actionorder.lastIndexOf("#subcentrenum")); - String startnum=""; - String endnum=""; - if(actionparams.startsWith("[")&&actionparams.endsWith("]")){ - startnum=actionparams.substring(actionparams.indexOf("[")+1, actionparams.indexOf("]")); - endnum=actionparams.substring(actionparams.lastIndexOf("[")+1, actionparams.lastIndexOf("]")); - testresult=SubString.subCentreNum(testresult, startnum, endnum); - LogUtil.APP.info("Action(subCentreNum):截取测试结果指定开始及结束位置字符串:"+testresult); - }else{ - testresult="步骤动作:subCentreNum 必须是[\"开始字符\"][\"结束字符\"]#subCentreNum 格式,请检查您的步骤动作关键字:"+actionorder; - LogUtil.APP.warn("步骤动作:subCentreNum 必须是[\"开始位置(整数)\"][\"结束位置(整数)\"]#subCentreNum 格式,请检查您的步骤动作关键字:"+actionorder); - } - }else if(actionorder.endsWith("#substrrgex")){ - String actionparams=actionorder.substring(0, actionorder.lastIndexOf("#substrrgex")); - String key=""; - String index="1"; - if(actionparams.endsWith("]")&&actionparams.contains("[")){ - key=actionparams.substring(0,actionparams.lastIndexOf("[")); - index=actionparams.substring(actionparams.lastIndexOf("[")+1, actionparams.lastIndexOf("]")); - testresult=SubString.subStrRgex(testresult, key, index); - }else{ - key=actionparams; - testresult=SubString.subStrRgex(testresult, key, index); - } - LogUtil.APP.info("Action(subStrRgex):获取JSON字符串指定Key的值是:"+testresult); - }else{ - testresult="未检索到对应动作关键字,直接跳过此动作,请检查关键字:"+actionorder; - LogUtil.APP.warn("未检索到对应动作关键字,直接跳过此动作,请检查关键字:"+actionorder); + + String[] actionArr = actionKeyWord.split("#"); + if(actionArr.length == 2){ + ActionContext actionContext = new ActionContext(actionArr[1]); + testResult = actionContext.parse(actionKeyWord, testResult); + }else { + testResult="关键字语法书写有误,请检查关键字:"+actionKeyWord; + LogUtil.APP.error("关键字语法书写有误,请检查关键字:"+actionKeyWord); } - return testresult; + return testResult; }catch(Exception e){ - testresult="处理步骤动作事件过程中出现异常,直接返回测试结果:"+actionorder; - LogUtil.APP.error("处理步骤动作事件过程中出现异常,直接返回测试结果:"+actionorder); - return testresult; + testResult="处理步骤动作事件过程中出现异常,直接返回测试结果:"+actionKeyWord; + LogUtil.APP.error("处理步骤动作事件过程中出现异常,直接返回测试结果:" ,e); + return testResult; } } diff --git a/src/main/java/luckyclient/caserun/publicdispose/actionkeyword/Action.java b/src/main/java/luckyclient/caserun/publicdispose/actionkeyword/Action.java new file mode 100644 index 0000000..f8bce99 --- /dev/null +++ b/src/main/java/luckyclient/caserun/publicdispose/actionkeyword/Action.java @@ -0,0 +1,17 @@ +package luckyclient.caserun.publicdispose.actionkeyword; + +/** + * 动作关键字注解定义 + * @author: sunshaoyan + * @date: Created on 2019/4/13 + */ + +import java.lang.annotation.*; + +@Target(ElementType.TYPE) +@Retention(RetentionPolicy.RUNTIME) +@Documented +@Inherited +public @interface Action { + String name() default ""; +} diff --git a/src/main/java/luckyclient/caserun/publicdispose/actionkeyword/ActionKeyWordParser.java b/src/main/java/luckyclient/caserun/publicdispose/actionkeyword/ActionKeyWordParser.java new file mode 100644 index 0000000..ec24a5c --- /dev/null +++ b/src/main/java/luckyclient/caserun/publicdispose/actionkeyword/ActionKeyWordParser.java @@ -0,0 +1,11 @@ +package luckyclient.caserun.publicdispose.actionkeyword; + +/** + * 动作关键字的处理接口 + * @author: sunshaoyan + * @date: Created on 2019/4/13 + */ +public interface ActionKeyWordParser { + + String parse(String actionKeyWord, String testResult); +} diff --git a/src/main/java/luckyclient/caserun/publicdispose/actionkeyword/GetJsonActionParser.java b/src/main/java/luckyclient/caserun/publicdispose/actionkeyword/GetJsonActionParser.java new file mode 100644 index 0000000..ca94f49 --- /dev/null +++ b/src/main/java/luckyclient/caserun/publicdispose/actionkeyword/GetJsonActionParser.java @@ -0,0 +1,36 @@ +package luckyclient.caserun.publicdispose.actionkeyword; + +import luckyclient.driven.SubString; +import luckyclient.publicclass.LogUtil; + +/** + * 动作关键字的处理接口的实现类:获取JSON字符串指定Key的值的 + * @author: sunshaoyan + * @date: Created on 2019/4/13 + */ +@Action(name="getJV") +public class GetJsonActionParser implements ActionKeyWordParser { + + + /** + * 获取JSON字符串指定Key的值是 + * @param actionKeyWord 动作关键字 + * @param testResult 测试结果 + */ + @Override + public String parse(String actionKeyWord, String testResult) { + String actionparams=actionKeyWord.substring(0, actionKeyWord.lastIndexOf("#getJV")); + String key=""; + String index="1"; + if(actionparams.endsWith("]")&&actionparams.contains("[")){ + key=actionparams.substring(0,actionparams.lastIndexOf("[")); + index=actionparams.substring(actionparams.lastIndexOf("[")+1, actionparams.lastIndexOf("]")); + testResult= SubString.getJsonValue(testResult, key, index); + }else{ + key=actionparams; + testResult=SubString.getJsonValue(testResult, key, index); + } + LogUtil.APP.info("Action(getJV):获取JSON字符串指定Key的值是:"+testResult); + return testResult; + } +} diff --git a/src/main/java/luckyclient/caserun/publicdispose/actionkeyword/HeaderParser.java b/src/main/java/luckyclient/caserun/publicdispose/actionkeyword/HeaderParser.java new file mode 100644 index 0000000..d1a2ae2 --- /dev/null +++ b/src/main/java/luckyclient/caserun/publicdispose/actionkeyword/HeaderParser.java @@ -0,0 +1,29 @@ +package luckyclient.caserun.publicdispose.actionkeyword; + + +import com.alibaba.fastjson.JSONObject; + +/** + * 动作关键字的处理接口的实现类:从响应header中取出某个header值 + * @author: sunshaoyan + * @date: Created on 2019/4/13 + */ +@Action(name="Header") +public class HeaderParser implements ActionKeyWordParser { + + + /** + * @param actionorder 动作关键字 + */ + @Override + public String parse(String actionorder, String testResult) { + + + // 获取步骤间等待时间 + String headerParam=actionorder.substring(0, actionorder.lastIndexOf("#Header")); + String pre = "RESPONSE_HEAD:【"; + String headerStr = testResult.substring(testResult.indexOf(pre) + pre.length(), testResult.indexOf("】 RESPONSE_CODE")); + return JSONObject.parseObject(headerStr).getJSONArray(headerParam).getString(0); + + } +} diff --git a/src/main/java/luckyclient/caserun/publicdispose/actionkeyword/SubCentreNumActionParser.java b/src/main/java/luckyclient/caserun/publicdispose/actionkeyword/SubCentreNumActionParser.java new file mode 100644 index 0000000..49d3bbd --- /dev/null +++ b/src/main/java/luckyclient/caserun/publicdispose/actionkeyword/SubCentreNumActionParser.java @@ -0,0 +1,36 @@ +package luckyclient.caserun.publicdispose.actionkeyword; + + +import luckyclient.driven.SubString; +import luckyclient.publicclass.LogUtil; + +/** + * 动作关键字的处理接口的实现类:截取测试结果指定开始及结束位置字符串 + * @author: sunshaoyan + * @date: Created on 2019/4/13 + */ +@Action(name="subCentreNum") +public class SubCentreNumActionParser implements ActionKeyWordParser { + + + /** + * 截取测试结果指定开始及结束位置字符串 + * @param actionKeyWord 动作关键字 + * @param testResult 测试结果 + */ + @Override + public String parse(String actionKeyWord, String testResult) { + String actionParams=actionKeyWord.substring(0, actionKeyWord.lastIndexOf("#subCentreNum")); + + if(actionParams.startsWith("[")&&actionParams.endsWith("]")){ + String startnum=actionParams.substring(actionParams.indexOf("[")+1, actionParams.indexOf("]")); + String endnum=actionParams.substring(actionParams.lastIndexOf("[")+1, actionParams.lastIndexOf("]")); + testResult= SubString.subCentreNum(testResult, startnum, endnum); + LogUtil.APP.info("Action(subCentreNum):截取测试结果指定开始及结束位置字符串:"+testResult); + }else{ + testResult="步骤动作:subCentreNum 必须是[\"开始字符\"][\"结束字符\"]#subCentreNum 格式,请检查您的步骤动作关键字:"+actionKeyWord; + LogUtil.APP.error("步骤动作:subCentreNum 必须是[\"开始位置(整数)\"][\"结束位置(整数)\"]#subCentreNum 格式,请检查您的步骤动作关键字:"+actionKeyWord); + } + return testResult; + } +} diff --git a/src/main/java/luckyclient/caserun/publicdispose/actionkeyword/SubCentresStrActionParser.java b/src/main/java/luckyclient/caserun/publicdispose/actionkeyword/SubCentresStrActionParser.java new file mode 100644 index 0000000..28f5669 --- /dev/null +++ b/src/main/java/luckyclient/caserun/publicdispose/actionkeyword/SubCentresStrActionParser.java @@ -0,0 +1,36 @@ +package luckyclient.caserun.publicdispose.actionkeyword; + +import luckyclient.driven.SubString; +import luckyclient.publicclass.LogUtil; + +/** + * 动作关键字的处理接口的实现类:截取测试结果指定开始及结束位置字符串 + * @author: sunshaoyan + * @date: Created on 2019/4/13 + */ +@Action(name="subCentreStr") +public class SubCentresStrActionParser implements ActionKeyWordParser { + + + /** + * 截取测试结果指定开始及结束位置字符串 + * @param actionKeyWord 动作关键字 + * @param testResult 测试结果 + */ + @Override + public String parse(String actionKeyWord, String testResult) { + String actionparams=actionKeyWord.substring(0, actionKeyWord.lastIndexOf("#subCentreStr")); + String startstr=""; + String endstr=""; + if(actionparams.startsWith("[")&&actionparams.endsWith("]")){ + startstr=actionparams.substring(actionparams.indexOf("[")+1, actionparams.indexOf("]")); + endstr=actionparams.substring(actionparams.lastIndexOf("[")+1, actionparams.lastIndexOf("]")); + testResult= SubString.subCentreStr(testResult, startstr, endstr); + LogUtil.APP.info("Action(subCentreStr):截取测试结果指定开始及结束位置字符串:"+testResult); + }else{ + testResult="步骤动作:subCentreStr 必须是[\"开始字符\"][\"结束字符\"]#subCentreStr 格式,请检查您的步骤动作关键字:"+actionKeyWord; + LogUtil.APP.error("步骤动作:subCentreStr 必须是[\"开始字符\"][\"结束字符\"]#subCentreStr 格式,请检查您的步骤动作关键字:"+actionKeyWord); + } + return testResult; + } +} diff --git a/src/main/java/luckyclient/caserun/publicdispose/actionkeyword/SubStrRegxActionParser.java b/src/main/java/luckyclient/caserun/publicdispose/actionkeyword/SubStrRegxActionParser.java new file mode 100644 index 0000000..60c1939 --- /dev/null +++ b/src/main/java/luckyclient/caserun/publicdispose/actionkeyword/SubStrRegxActionParser.java @@ -0,0 +1,36 @@ +package luckyclient.caserun.publicdispose.actionkeyword; + +import luckyclient.driven.SubString; +import luckyclient.publicclass.LogUtil; + +/** + * 动作关键字的处理接口的实现类:获取JSON字符串指定Key的值,采用正则匹配 + * @author: sunshaoyan + * @date: Created on 2019/4/13 + */ +@Action(name="subStrRgex") +public class SubStrRegxActionParser implements ActionKeyWordParser { + + + /** + * 获取JSON字符串指定Key的值,采用正则匹配 + * @param actionKeyWord 动作关键字 + * @param testResult 测试结果 + */ + @Override + public String parse(String actionKeyWord, String testResult) { + String actionparams=actionKeyWord.substring(0, actionKeyWord.lastIndexOf("#subStrRgex")); + String key=""; + String index="1"; + if(actionparams.endsWith("]")&&actionparams.contains("[")){ + key=actionparams.substring(0,actionparams.lastIndexOf("[")); + index=actionparams.substring(actionparams.lastIndexOf("[")+1, actionparams.lastIndexOf("]")); + testResult= SubString.subStrRgex(testResult, key, index); + }else{ + key=actionparams; + testResult= SubString.subStrRgex(testResult, key, index); + } + LogUtil.APP.info("Action(subStrRgex):获取JSON字符串指定Key的值是:"+testResult); + return testResult; + } +} diff --git a/src/main/java/luckyclient/caserun/publicdispose/actionkeyword/ThreadWaitAction.java b/src/main/java/luckyclient/caserun/publicdispose/actionkeyword/ThreadWaitAction.java new file mode 100644 index 0000000..bf56f27 --- /dev/null +++ b/src/main/java/luckyclient/caserun/publicdispose/actionkeyword/ThreadWaitAction.java @@ -0,0 +1,38 @@ +package luckyclient.caserun.publicdispose.actionkeyword; + + +import luckyclient.caserun.publicdispose.ChangString; +import luckyclient.publicclass.LogUtil; + +/** + * 动作关键字的处理接口的实现类:线程等待时间 + * @author: sunshaoyan + * @date: Created on 2019/4/13 + */ +@Action(name="Wait") +public class ThreadWaitAction implements ActionKeyWordParser { + + + /** + * @param actionorder 动作关键字 + */ + @Override + public String parse(String actionorder, String testResult) { + if(ChangString.isInteger(actionorder.substring(0, actionorder.lastIndexOf("#Wait")))){ + try { + // 获取步骤间等待时间 + int time=Integer.parseInt(actionorder.substring(0, actionorder.lastIndexOf("#Wait"))); + if (time > 0) { + LogUtil.APP.info("Action(Wait):线程等待"+time+"秒..."); + Thread.sleep(time * 1000); + } + } catch (InterruptedException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + }else{ + LogUtil.APP.error("使用等待关键字的参数不是整数,直接跳过此动作,请检查!"); + } + return testResult; + } +}