diff --git a/src/main/java/yi/master/annotation/CustomConditionSetting.java b/src/main/java/yi/master/annotation/CustomConditionSetting.java index 60688049cc5918ff68232971a0f63bc939dad239..acd3145862aaee62fd3e72b55aa810cdfa673157 100644 --- a/src/main/java/yi/master/annotation/CustomConditionSetting.java +++ b/src/main/java/yi/master/annotation/CustomConditionSetting.java @@ -6,12 +6,20 @@ import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; +/** + * 自定义查询(高级查询)通过此注解表明各个查询字段的查询设置 + * @author xuwangcheng + * @date 20191027 + */ @Documented @Target(ElementType.FIELD) @Retention(RetentionPolicy.RUNTIME) public @interface CustomConditionSetting { public static final String DATETIME_TYPE = "datetime"; public static final String STRING_TYPE = "string"; - String conditionType() default STRING_TYPE;//条件类型,目前支持string、datetime - String operator() default "like"; //运算符,目前仅支持 ‘like’ 和 ‘=’ '>' '<' + + //条件类型,目前支持string、datetime + String conditionType() default STRING_TYPE; + //运算符,目前仅支持 ‘like’ 和 ‘=’ '>' '<' + String operator() default "like"; } diff --git a/src/main/java/yi/master/annotation/FieldNameMapper.java b/src/main/java/yi/master/annotation/FieldNameMapper.java index b44f4ae0b2d61726817b52837ecd0e6e4dfe5b5b..cd98de792d1cf3cd600f0886a882678e2a27c24d 100644 --- a/src/main/java/yi/master/annotation/FieldNameMapper.java +++ b/src/main/java/yi/master/annotation/FieldNameMapper.java @@ -6,11 +6,19 @@ import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; +/** + * 实体类字段对应数据库查询字段名,包含关联字段或者使用HQL函数的字段 + * @date 20191027 + * @author xuwangcheng + */ @Documented @Target(ElementType.FIELD) @Retention(RetentionPolicy.RUNTIME) public @interface FieldNameMapper { - String fieldPath() default ""; //对应的HQL中的查询名 - boolean ifSearch() default true; //该字段是否需要被全局模糊查询 - boolean ifOrder() default true;//是否可以被排序 + //对应的HQL中的查询名 + String fieldPath() default ""; + //该字段是否需要被全局模糊查询 + boolean ifSearch() default true; + //是否可以被排序 + boolean ifOrder() default true; } diff --git a/src/main/java/yi/master/annotation/util/AnnotationUtil.java b/src/main/java/yi/master/annotation/util/AnnotationUtil.java index ea16aeb5fc9841c15f8709c413b713d8cde44ea7..42a0b588685049653c16aa64b77428a8f0eb4123 100644 --- a/src/main/java/yi/master/annotation/util/AnnotationUtil.java +++ b/src/main/java/yi/master/annotation/util/AnnotationUtil.java @@ -52,10 +52,6 @@ public class AnnotationUtil { if ((field.getType().getCanonicalName().equals("java.sql.Timestamp") || field.getType().getCanonicalName().equals("java.sql.Date") || field.getType().getCanonicalName().equals("java.util.Timestamp")) && getType == 0) { - /*if (StringUtils.isNotBlank(searchValue)) { - //判断是否为yyyy-MM-dd HH:mm:ss的日期格式 - - }*/ return null; } String columPath = fieldName; diff --git a/src/main/java/yi/master/business/api/service/user/ApiUserService.java b/src/main/java/yi/master/business/api/service/user/ApiUserService.java index 495077666ff62e4e327d8660ca0b322488bbf81a..bd228494e6317084cf51e562f3906971cd8501ca 100644 --- a/src/main/java/yi/master/business/api/service/user/ApiUserService.java +++ b/src/main/java/yi/master/business/api/service/user/ApiUserService.java @@ -49,7 +49,11 @@ public class ApiUserService { userService.edit(user); return new ApiReturnInfo(ApiReturnInfo.SUCCESS_CODE, "添加用户信息成功!", null); } - return new ApiReturnInfo(ApiReturnInfo.ERROR_CODE, "添加失败:userid已存在!", "{\"userid\":\"" + user.getIfNew() + "\",\"username\":\"" + user.getRealName() + "\"}"); + //如果存在就更新 + user.setPassword(passwd); + user.setUsername(username); + userService.edit(user); + return new ApiReturnInfo(ApiReturnInfo.SUCCESS_CODE, "更新成功!", null); } public ApiReturnInfo syncDel(String userid) { diff --git a/src/main/java/yi/master/business/base/dao/BaseDao.java b/src/main/java/yi/master/business/base/dao/BaseDao.java index 2d07135f4def51f42f52c23915ef078cbf6ec037..2c2fc221a752b82f14538ffa2fcb3a93cb1045b9 100644 --- a/src/main/java/yi/master/business/base/dao/BaseDao.java +++ b/src/main/java/yi/master/business/base/dao/BaseDao.java @@ -3,6 +3,7 @@ package yi.master.business.base.dao; import java.util.Date; import java.util.List; +import org.hibernate.Session; import yi.master.business.base.bean.PageModel; /** * 通用DAO接口 @@ -101,4 +102,6 @@ public interface BaseDao { * @return */ int getHqlCount(String hql); + + Session getSession(); } diff --git a/src/main/java/yi/master/business/base/dao/impl/BaseDaoImpl.java b/src/main/java/yi/master/business/base/dao/impl/BaseDaoImpl.java index 89595bdf4dbe7f6324465f6db21de828e32bf6cc..1745e7730a504a73a4ceb0969d9fc5b50afe7101 100644 --- a/src/main/java/yi/master/business/base/dao/impl/BaseDaoImpl.java +++ b/src/main/java/yi/master/business/base/dao/impl/BaseDaoImpl.java @@ -34,7 +34,8 @@ public class BaseDaoImpl implements BaseDao { public void setSessionFactory(SessionFactory sessionFactory) { this.sessionFactory = sessionFactory; } - + + @Override public Session getSession() { return this.sessionFactory.getCurrentSession(); } diff --git a/src/main/java/yi/master/business/message/action/MessageAction.java b/src/main/java/yi/master/business/message/action/MessageAction.java index 260a3a0fecc0e917c47f3d5b2348ddfb4aeeb089..8f542d062628ba493d294733b5c3e8d0032e77c1 100644 --- a/src/main/java/yi/master/business/message/action/MessageAction.java +++ b/src/main/java/yi/master/business/message/action/MessageAction.java @@ -15,11 +15,9 @@ import org.springframework.stereotype.Controller; import yi.master.business.base.action.BaseAction; import yi.master.business.message.bean.InterfaceInfo; import yi.master.business.message.bean.Message; +import yi.master.business.message.bean.MessageScene; import yi.master.business.message.bean.Parameter; -import yi.master.business.message.service.ComplexParameterService; -import yi.master.business.message.service.InterfaceInfoService; -import yi.master.business.message.service.MessageService; -import yi.master.business.message.service.ParameterService; +import yi.master.business.message.service.*; import yi.master.business.user.bean.User; import yi.master.constant.ReturnCodeConsts; import yi.master.constant.SystemConsts; @@ -48,8 +46,16 @@ public class MessageAction extends BaseAction{ private String path; private String nodes; + + /** + * 是否在创建报文时创建一个默认的场景,只在新增时有效 + */ + private Boolean createDefaultScene; private MessageService messageService; + + @Autowired + private MessageSceneService messageSceneService; @Autowired public void setMessageService(MessageService messageService) { @@ -157,22 +163,29 @@ public class MessageAction extends BaseAction{ } User user = FrameworkUtil.getLoginUser(); + model.setLastModifyUser(user.getRealName()); + model.setParameterJson(parseUtil.messageFormatBeautify(model.getParameterJson())); if (model.getMessageId() == null) { //增加 model.setCreateTime(new Timestamp(System.currentTimeMillis())); - model.setUser(user); + model.setUser(user); + model.setComplexParameter(parseUtil.parseMessageToObject(model.getParameterJson(), new ArrayList(params))); + + //新增 + messageService.save(model, createDefaultScene); } else { //删除之前的复杂参数 Message msg = messageService.get(model.getMessageId()); - Integer delId = msg.getComplexParameter().getId(); - msg.setComplexParameter(null); - - complexParameterService.delete(delId); + if (msg != null && msg.getComplexParameter() != null) { + Integer delId = msg.getComplexParameter().getId(); + msg.setComplexParameter(null); + complexParameterService.delete(delId); + } + model.setComplexParameter(parseUtil.parseMessageToObject(model.getParameterJson(), new ArrayList(params))); + //更新 + messageService.edit(model); } - model.setLastModifyUser(user.getRealName()); - model.setParameterJson(parseUtil.messageFormatBeautify(model.getParameterJson())); - model.setComplexParameter(parseUtil.parseMessageToObject(model.getParameterJson(), new ArrayList(params))); - messageService.edit(model); + return SUCCESS; } @@ -211,4 +224,8 @@ public class MessageAction extends BaseAction{ public void setNodes(String nodes) { this.nodes = nodes; } + + public void setCreateDefaultScene(Boolean createDefaultScene) { + this.createDefaultScene = createDefaultScene; + } } diff --git a/src/main/java/yi/master/business/message/action/MessageSceneAction.java b/src/main/java/yi/master/business/message/action/MessageSceneAction.java index 6283e500ad04b0f4f9803dd60d3cc5ceea08296c..61f70b85079a1fb1f574b4790131e59e6e682874 100644 --- a/src/main/java/yi/master/business/message/action/MessageSceneAction.java +++ b/src/main/java/yi/master/business/message/action/MessageSceneAction.java @@ -179,25 +179,10 @@ public class MessageSceneAction extends BaseAction{ @Override public String edit() { - if (model.getMessageSceneId() == null) { //新增 - model.setCreateTime(new Timestamp(System.currentTimeMillis())); - model.setMessageSceneId(messageSceneService.save(model)); - //新增时默认该该场景添加一条默认数据 - TestData defaultData = new TestData(); - defaultData.setDataDiscr("默认数据"); - defaultData.setStatus(TestDataStatus.AVAILABLE.getStatus()); - defaultData.setMessageScene(model); - defaultData.setParamsData(""); - defaultData.setDefaultData(CommonStatus.ENABLED.getStatus()); - testDataService.edit(defaultData); - - //是否配置关联验证模板 - if (variableId != null) { - GlobalVariable v = globalVariableService.get(variableId); - SceneValidateRule rule = (SceneValidateRule) v.createSettingValue(); - rule.setMessageScene(model); - sceneValidateRuleService.save(rule); - } + //新增 + if (model.getMessageSceneId() == null) { + messageSceneService.save(model, true, variableId); + //编辑 } else { messageSceneService.edit(model); } diff --git a/src/main/java/yi/master/business/message/bean/InterfaceInfo.hbm.xml b/src/main/java/yi/master/business/message/bean/InterfaceInfo.hbm.xml index 6d82db3cf411e1711d3baf8246af671d2ec66d72..d440cbbb64f73408a982427264c2ef3fa621b486 100644 --- a/src/main/java/yi/master/business/message/bean/InterfaceInfo.hbm.xml +++ b/src/main/java/yi/master/business/message/bean/InterfaceInfo.hbm.xml @@ -14,7 +14,7 @@ - + diff --git a/src/main/java/yi/master/business/message/bean/Message.hbm.xml b/src/main/java/yi/master/business/message/bean/Message.hbm.xml index 74e3a8974826c4c774a7069161fc43d9e11228e5..3a6db697dc4a3145df5cecbb9efe8bad6cad7807 100644 --- a/src/main/java/yi/master/business/message/bean/Message.hbm.xml +++ b/src/main/java/yi/master/business/message/bean/Message.hbm.xml @@ -10,7 +10,7 @@ - + diff --git a/src/main/java/yi/master/business/message/service/MessageSceneService.java b/src/main/java/yi/master/business/message/service/MessageSceneService.java index a88da213a93f59c30b0f94ac7458386f92c55c07..cce4d404092a1e4172df250c587c7b37a776afcf 100644 --- a/src/main/java/yi/master/business/message/service/MessageSceneService.java +++ b/src/main/java/yi/master/business/message/service/MessageSceneService.java @@ -49,4 +49,15 @@ public interface MessageSceneService extends BaseService{ * @param response */ void updateResponseExample (Integer messageSceneId, String response); + + /** + * 保存测试场景 + * @author xuwangcheng + * @date 2019/11/15 17:05 + * @param messageScene messageScene + * @param createDefaultData createDefaultData 是否创建默认的数据 + * @param variableId variableId 是否根据模板创建默认的验证 + * @return {@link Integer} id + */ + Integer save(MessageScene messageScene, Boolean createDefaultData, Integer variableId); } diff --git a/src/main/java/yi/master/business/message/service/MessageService.java b/src/main/java/yi/master/business/message/service/MessageService.java index 9a693a4f24ed4b03855117f2188a411377f654cf..17df637e3946ba55f59a44279d405eb8d1fb65a8 100644 --- a/src/main/java/yi/master/business/message/service/MessageService.java +++ b/src/main/java/yi/master/business/message/service/MessageService.java @@ -10,5 +10,14 @@ import yi.master.business.message.bean.Message; * @version 1.0.0.0,2017.2.17 */ -public interface MessageService extends BaseService { +public interface MessageService extends BaseService { + /** + * 保存报文 + * @author xuwangcheng + * @date 2019/11/15 17:06 + * @param message message + * @param createDefaultScene createDefaultScene 是否创建默认的测试场景 + * @return {@link Integer} + */ + Integer save(Message message, Boolean createDefaultScene); } diff --git a/src/main/java/yi/master/business/message/service/impl/MessageSceneServiceImpl.java b/src/main/java/yi/master/business/message/service/impl/MessageSceneServiceImpl.java index 684f3fccb7bb6e41caac86e8bd1ecc954265f678..1a79d87277abf393a538d4e4d1e8464b4a24e3f7 100644 --- a/src/main/java/yi/master/business/message/service/impl/MessageSceneServiceImpl.java +++ b/src/main/java/yi/master/business/message/service/impl/MessageSceneServiceImpl.java @@ -1,16 +1,21 @@ package yi.master.business.message.service.impl; +import java.sql.Timestamp; import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import yi.master.business.base.service.impl.BaseServiceImpl; -import yi.master.business.message.bean.InterfaceInfo; -import yi.master.business.message.bean.Message; -import yi.master.business.message.bean.MessageScene; +import yi.master.business.message.bean.*; import yi.master.business.message.dao.MessageSceneDao; +import yi.master.business.message.dao.SceneValidateRuleDao; +import yi.master.business.message.dao.TestDataDao; +import yi.master.business.message.enums.CommonStatus; +import yi.master.business.message.enums.TestDataStatus; import yi.master.business.message.service.MessageSceneService; +import yi.master.business.testconfig.bean.GlobalVariable; +import yi.master.business.testconfig.dao.GlobalVariableDao; /** * 报文场景service实现 @@ -21,6 +26,15 @@ import yi.master.business.message.service.MessageSceneService; public class MessageSceneServiceImpl extends BaseServiceImpl implements MessageSceneService{ private MessageSceneDao messageSceneDao; + + @Autowired + private TestDataDao testDataDao; + + @Autowired + private GlobalVariableDao globalVariableDao; + + @Autowired + private SceneValidateRuleDao sceneValidateRuleDao; @Autowired public void setMessageSceneDao(MessageSceneDao messageSceneDao) { @@ -58,4 +72,36 @@ public class MessageSceneServiceImpl extends BaseServiceImpl imple messageSceneDao.updateResponseExample(messageSceneId, response); } + @Override + public Integer save(MessageScene messageScene, Boolean createDefaultData, Integer variableId) { + if (messageScene.getMessageSceneId() != null) { + messageScene.setMessageSceneId(null); + } + + messageScene.setCreateTime(new Timestamp(System.currentTimeMillis())); + + messageSceneDao.getSession().clear(); + messageScene.setMessageSceneId(messageSceneDao.save(messageScene)); + + if (createDefaultData) { + //新增时默认该该场景添加一条默认数据 + TestData defaultData = new TestData(); + defaultData.setDataDiscr("默认数据"); + defaultData.setStatus(TestDataStatus.AVAILABLE.getStatus()); + defaultData.setMessageScene(messageScene); + defaultData.setParamsData(""); + defaultData.setDefaultData(CommonStatus.ENABLED.getStatus()); + testDataDao.save(defaultData); + } + + //是否配置关联验证模板 + if (variableId != null) { + GlobalVariable v = globalVariableDao.get(variableId); + SceneValidateRule rule = (SceneValidateRule) v.createSettingValue(); + rule.setMessageScene(messageScene); + sceneValidateRuleDao.save(rule); + } + return messageScene.getMessageSceneId(); + } + } diff --git a/src/main/java/yi/master/business/message/service/impl/MessageServiceImpl.java b/src/main/java/yi/master/business/message/service/impl/MessageServiceImpl.java index d007ec03e59247d2e168172bb99de61c64e0bc7b..0fd4f7018afbc63930747cffd228293200aeda60 100644 --- a/src/main/java/yi/master/business/message/service/impl/MessageServiceImpl.java +++ b/src/main/java/yi/master/business/message/service/impl/MessageServiceImpl.java @@ -5,7 +5,9 @@ import org.springframework.stereotype.Service; import yi.master.business.base.service.impl.BaseServiceImpl; import yi.master.business.message.bean.Message; +import yi.master.business.message.bean.MessageScene; import yi.master.business.message.dao.MessageDao; +import yi.master.business.message.service.MessageSceneService; import yi.master.business.message.service.MessageService; /** @@ -19,12 +21,36 @@ import yi.master.business.message.service.MessageService; public class MessageServiceImpl extends BaseServiceImpl implements MessageService{ private MessageDao messageDao; + + @Autowired + private MessageSceneService messageSceneService; @Autowired public void setMessageDao(MessageDao messageDao) { super.setBaseDao(messageDao); this.messageDao = messageDao; } - + + @Override + public Integer save(Message message, Boolean createDefaultScene) { + if (message.getMessageId() != null) { + message.setMessageId(null); + } + + messageDao.getSession().clear(); + message.setMessageId(messageDao.save(message)); + + if (createDefaultScene == true) { + MessageScene messageScene = new MessageScene(); + messageScene.setMessage(message); + messageScene.setSceneName("默认场景"); + messageScene.setSystems(message.getSystems()); + messageScene.setMark("这是自动创建的测试场景"); + + messageSceneService.save(messageScene, true, null); + } + + return message.getMessageId(); + } } diff --git a/src/main/java/yi/master/business/testconfig/bean/GlobalVariable.java b/src/main/java/yi/master/business/testconfig/bean/GlobalVariable.java index 0c71410e37b0c9650746c4f2f586ffaac2e37614..18a1000e2a3779beef86254b1948e908d7933834 100644 --- a/src/main/java/yi/master/business/testconfig/bean/GlobalVariable.java +++ b/src/main/java/yi/master/business/testconfig/bean/GlobalVariable.java @@ -301,7 +301,7 @@ public class GlobalVariable implements Serializable { rule.setParameterName(JSONObject.fromObject(maps).toString()); rule.setValidateMethodFlag("0"); rule.setStatus("0"); - rule.setMark("模板创建的关联验证"); + rule.setMark(StringUtils.isNotBlank(this.mark) ? this.mark : "模板创建的关联验证"); return rule; } diff --git a/src/main/java/yi/master/business/user/action/RoleAction.java b/src/main/java/yi/master/business/user/action/RoleAction.java index cbb85abdcf4f592907c796152d04d81d86a5b418..e16ee335a4f4e90e67dde620f9ef5a6ba8ed05c3 100644 --- a/src/main/java/yi/master/business/user/action/RoleAction.java +++ b/src/main/java/yi/master/business/user/action/RoleAction.java @@ -97,11 +97,7 @@ public class RoleAction extends BaseAction { * 根据传入的id判断是否为新增或者更新 */ @Override - public String edit() { - if (model.getRoleId() == SystemConsts.DefaultObjectId.ADMIN_ROLE.getId() - || model.getRoleId() == SystemConsts.DefaultObjectId.DEFAULT_ROLE.getId()) { - throw new YiException(AppErrorCode.ILLEGAL_HANDLE.getCode(), "不能删除预置管理员或者默认角色信息"); - } + public String edit() { checkObjectName(); if (!checkNameFlag.equals("true")) { @@ -109,6 +105,10 @@ public class RoleAction extends BaseAction { } if (model.getRoleId() != null) { + if (SystemConsts.DefaultObjectId.ADMIN_ROLE.getId() == model.getRoleId() + || SystemConsts.DefaultObjectId.DEFAULT_ROLE.getId() == model.getRoleId()) { + throw new YiException(AppErrorCode.ILLEGAL_HANDLE.getCode(), "不能编辑预置管理员或者默认角色信息"); + } //修改 model.setOis(roleService.get(model.getRoleId()).getOis()); } diff --git a/src/main/java/yi/master/coretest/message/parse/FixedMessageParse.java b/src/main/java/yi/master/coretest/message/parse/FixedMessageParse.java index 099e72fecce871646cd9b76d951a71a0c44be787..e26fb52502ddfb5e8b2855c0ef8c229ed31d0b86 100644 --- a/src/main/java/yi/master/coretest/message/parse/FixedMessageParse.java +++ b/src/main/java/yi/master/coretest/message/parse/FixedMessageParse.java @@ -1,6 +1,7 @@ package yi.master.coretest.message.parse; import net.sf.json.JSONObject; +import org.apache.commons.lang.StringUtils; import yi.master.business.message.bean.ComplexParameter; import yi.master.business.message.bean.Parameter; import yi.master.constant.MessageKeys; @@ -40,7 +41,9 @@ public class FixedMessageParse extends MessageParse { @Override public Set importMessageToParameter(String message, Set existParams) { - + if (StringUtils.isBlank(message)) { + return null; + } Set params = new HashSet(); Parameter param = new Parameter(message, "name", "defaultValue", "path", "String"); if (validateRepeatabilityParameter(existParams, param)) { @@ -59,15 +62,15 @@ public class FixedMessageParse extends MessageParse { @Override public String depacketizeMessageToString(ComplexParameter complexParameter, String paramsData) { - + if (complexParameter == null) { + return ""; + } Parameter param = complexParameter.getSelfParameter(); return messageFormatBeautify(param.getParameterIdentify()); } @Override public String checkParameterValidity(List params, String message) { - - for (Parameter p:params) { if (message.equals(p.getParameterIdentify())) { return SystemConsts.DefaultBooleanIdentify.TRUE.getString(); diff --git a/src/main/java/yi/master/coretest/message/parse/JSONMessageParse.java b/src/main/java/yi/master/coretest/message/parse/JSONMessageParse.java index b0cdc8ef654cf3ebc3daa860e8a55ab1321c745f..46d3e13b7a313bd108e2eb3e21c253a69341998b 100644 --- a/src/main/java/yi/master/coretest/message/parse/JSONMessageParse.java +++ b/src/main/java/yi/master/coretest/message/parse/JSONMessageParse.java @@ -74,15 +74,15 @@ public class JSONMessageParse extends MessageParse { @Override public String depacketizeMessageToString(ComplexParameter complexParameter, String paramsData) { - + if (complexParameter == null) { + return ""; + } return messageFormatBeautify(paraseJsonMessage(complexParameter, new StringBuilder(""), PracticalUtils.jsonToMap(paramsData)).toString()); } @SuppressWarnings("unchecked") @Override public String checkParameterValidity(List params, String message) { - - Object[] o = null; try { o = (Object[]) JsonUtil.getJsonList(message, 3); diff --git a/src/main/java/yi/master/coretest/message/parse/OPTMessageParse.java b/src/main/java/yi/master/coretest/message/parse/OPTMessageParse.java index 7eeb6dce450cbfa0ef3b61fe347752bc2de61392..a84e9b0af34301d3d7108e557fcf27301155b99a 100644 --- a/src/main/java/yi/master/coretest/message/parse/OPTMessageParse.java +++ b/src/main/java/yi/master/coretest/message/parse/OPTMessageParse.java @@ -51,7 +51,10 @@ public class OPTMessageParse extends FixedMessageParse { @Override public String depacketizeMessageToString(ComplexParameter complexParameter, String paramsData) { - + if (complexParameter == null) { + return ""; + } + if (StringUtils.isNotEmpty(paramsData)) { Map params = PracticalUtils.jsonToMap(paramsData); for (Object o:params.values()) { diff --git a/src/main/java/yi/master/coretest/message/parse/URLMessageParse.java b/src/main/java/yi/master/coretest/message/parse/URLMessageParse.java index e740e39bc99fbb421aaf53a44e48d599f37fd46f..2634347378bbce279a72e3322965060bbb3993e6 100644 --- a/src/main/java/yi/master/coretest/message/parse/URLMessageParse.java +++ b/src/main/java/yi/master/coretest/message/parse/URLMessageParse.java @@ -1,5 +1,6 @@ package yi.master.coretest.message.parse; +import com.mysql.fabric.xmlrpc.base.Params; import net.sf.json.JSONObject; import org.apache.commons.lang3.StringUtils; import yi.master.business.message.bean.ComplexParameter; @@ -55,13 +56,14 @@ public class URLMessageParse extends MessageParse { @Override public String depacketizeMessageToString(ComplexParameter complexParameter, String paramsData) { - + if (complexParameter == null) { + return ""; + } return messageFormatBeautify(paraseUrlMessage(complexParameter, new StringBuilder(""), PracticalUtils.jsonToMap(paramsData)).toString().substring(1)); } @Override public String checkParameterValidity(List params, String message) { - if (!messageFormatValidation(message)) { return "不是合法的url入参格式,请检查!"; } @@ -117,11 +119,14 @@ public class URLMessageParse extends MessageParse { @Override public boolean messageFormatValidation(String message) { - String[] params = parseMessageToSingleRow(message).split("&"); for (String s:params) { - String[] parameter = StringUtils.split(s, "=", 2); - if (parameter.length != 2) { + if (!s.contains("=")) { + return false; + } + + String[] ss = s.split("="); + if (ss == null || ss.length < 1) { return false; } } @@ -130,7 +135,6 @@ public class URLMessageParse extends MessageParse { @Override public Set importMessageToParameter(String message, Set existParams) { - if (!messageFormatValidation(message)) { return null; } @@ -174,6 +178,10 @@ public class URLMessageParse extends MessageParse { loop: for (String s:urlParams) { String[] parameter = StringUtils.split(s, "=", 2); + if (parameter.length < 1) { + continue; + } + if (excludeAttributeNames != null) { for (String name:excludeAttributeNames) { if (name.equals(parameter[0])) { @@ -181,9 +189,7 @@ public class URLMessageParse extends MessageParse { } } } - if (parameter.length > 1) { - params.put(parameter[0], parameter[1]); - } + params.put(parameter[0], parameter.length > 1 ? parameter[1] : ""); } return params; @@ -194,7 +200,9 @@ public class URLMessageParse extends MessageParse { StringBuilder message = new StringBuilder(); for (Object key:nodes.keySet()) { - if ("rootId".equals(key.toString())) continue; + if ("rootId".equals(key.toString())) { + continue; + } JSONObject node = nodes.getJSONObject(key.toString()); if (MessageKeys.MessageParameterType.isStringOrNumberType(node.getString("type"))) { if (message.length() > 0) { diff --git a/src/main/java/yi/master/coretest/message/parse/XMLMessageParse.java b/src/main/java/yi/master/coretest/message/parse/XMLMessageParse.java index c36e1f66497ad7506b233c8e385cc43b6f551781..a268df0373780fb29a19fd769d8bed26ee736af5 100644 --- a/src/main/java/yi/master/coretest/message/parse/XMLMessageParse.java +++ b/src/main/java/yi/master/coretest/message/parse/XMLMessageParse.java @@ -75,6 +75,10 @@ public class XMLMessageParse extends MessageParse { @Override public String depacketizeMessageToString(ComplexParameter complexParameter, String paramsData) { + if (complexParameter == null) { + return ""; + } + return messageFormatBeautify(parseXmlMessage(complexParameter, new StringBuilder(""), PracticalUtils.jsonToMap(paramsData)).toString()); } @@ -125,8 +129,8 @@ public class XMLMessageParse extends MessageParse { } @SuppressWarnings("unchecked") - private StringBuilder parseXmlMessage(ComplexParameter parameter, StringBuilder message, Map messageData) { - + private StringBuilder parseXmlMessage(ComplexParameter parameter, StringBuilder message, Map messageData) { + if (parameter.getSelfParameter() == null) { return null; } diff --git a/src/main/java/yi/master/coretest/message/protocol/DubboTestClient.java b/src/main/java/yi/master/coretest/message/protocol/DubboTestClient.java index 359ea15e0c65c3601b537bc6b23d1670cb019f68..8c8093dd37d7f7364f6f779c82d8d1372e72baf5 100644 --- a/src/main/java/yi/master/coretest/message/protocol/DubboTestClient.java +++ b/src/main/java/yi/master/coretest/message/protocol/DubboTestClient.java @@ -61,7 +61,7 @@ public class DubboTestClient extends TestClient { } String[] urls = requestUrl.split(":"); if (3 != urls.length) { - responseObject.setMark("配置出错,请检查!"); + responseObject.addMark("配置出错,请检查!"); return responseObject; } @@ -76,7 +76,7 @@ public class DubboTestClient extends TestClient { try { telnetClient = createClient(host, port,connectTimeOut, readTimeOut); } catch (IOException e) { - responseObject.setMark("无法连接到:" + host + ":" + port); + responseObject.addMark("Telnet无法连接到:" + host + ":" + port); } if (telnetClient != null && telnetClient.isConnected()) { @@ -85,22 +85,24 @@ public class DubboTestClient extends TestClient { try { long start = System.currentTimeMillis(); + responseObject.addMark(StrUtil.format("Telent成功连接到{}:{}", host, port)); + responseObject.addMark(StrUtil.format("执行命令: invoke {}({})", method, requestMessage)); String responseMsg = sendMsg("invoke " + method + "(" + requestMessage + ")", out, in); long end = System.currentTimeMillis(); - if (responseMsg != null) { logger.info(StrUtil.format("[{}:{}]Dubbo请求方法{},返回内容:\n{}", host, port, method, responseMsg)); + responseObject.addMark(StrUtil.format("返回内容:\n{}", responseMsg)); if (responseMsg.indexOf("syntax error") > -1) { - responseObject.setMark("请求参数格式错误(注意单个字符串请用双引号括起来)"); + responseObject.addMark("请求参数格式错误(注意单个字符串请用双引号括起来)"); return responseObject; } if (responseMsg.indexOf("Invalid parameters") > -1) { - responseObject.setMark("缺少方法参数"); + responseObject.addMark("缺少方法参数"); return responseObject; } if (responseMsg.indexOf("No such service") > -1 || responseMsg.indexOf("No such method") > -1) { - responseObject.setMark("无此方法:" + method); + responseObject.addMark("无此方法:" + method); return responseObject; } @@ -117,7 +119,7 @@ public class DubboTestClient extends TestClient { responseObject.setUseTime(end - start); responseObject.setResponseMessage(responseMsg); } catch (IOException e) { - responseObject.setMark("调用方法 " + method + " 失败:\n" + PracticalUtils.getExceptionAllinformation(e)); + responseObject.addMark("调用方法 " + method + " 失败:\n" + PracticalUtils.getExceptionAllinformation(e)); } finally { if (telnetClient != null && telnetClient.isConnected()) { try { diff --git a/src/main/java/yi/master/coretest/message/protocol/HTTPTestClient.java b/src/main/java/yi/master/coretest/message/protocol/HTTPTestClient.java index e34fb1985dd5c92d784f6590cc01b1e05a10dec9..b5652299509ef4406ebe1add70939b605505101a 100644 --- a/src/main/java/yi/master/coretest/message/protocol/HTTPTestClient.java +++ b/src/main/java/yi/master/coretest/message/protocol/HTTPTestClient.java @@ -211,6 +211,7 @@ public class HTTPTestClient extends TestClient { } } catch (Exception e) { + returnMap.addMark("报文附加参数获取出错:" + e.getMessage()); LOGGER.info("报文附加参数获取出错:" + callParameter.toString(), e); } } @@ -223,7 +224,6 @@ public class HTTPTestClient extends TestClient { long useTime = 0; HttpRequestBase request = null; Object[] returnInfo = null; - String errorMsg = ""; //失败重试 boolean requestSuccessFlag = false; @@ -237,15 +237,16 @@ public class HTTPTestClient extends TestClient { } requestSuccessFlag = true; } catch (Exception e) { - LOGGER.info("发送请求出错...重试次数..." + retryCount, e); - errorMsg = e.getMessage(); + LOGGER.info("发送请求出错...重试次数..." + (retryCount + 1), e); + returnMap.addMark("发送请求出错...重试次数..." + (retryCount + 1)); + returnMap.addMark(e.getMessage()); } finally { retryCount++; } } if (!requestSuccessFlag) { - returnMap.setMark("发送请求出错:\n" + errorMsg); + returnMap.addMark("超过最大请求重试次数:" + config.getRetryCount() + ", 测试终止。"); } if (returnInfo != null) { @@ -271,7 +272,7 @@ public class HTTPTestClient extends TestClient { } } catch (Exception e) { LOGGER.info("解析返回出错", e); - returnMap.setMark("解析返回内容出错:" + e.getMessage()); + returnMap.addMark("解析返回内容出错:" + e.getMessage()); } returnMap.setResponseMessage(returnMsg.toString()); returnMap.setStatusCode(String.valueOf(response.getStatusLine().getStatusCode())); @@ -320,7 +321,9 @@ public class HTTPTestClient extends TestClient { for (Header h:headers) { if (json.get(h.getName()) != null) { String newValue = json.getString(h.getName()); - if (!newValue.endsWith(";")) newValue += ";"; + if (!newValue.endsWith(";")) { + newValue += ";"; + } json.put(h.getName(), newValue + h.getValue()); } else { json.put(h.getName(), h.getValue()); @@ -339,7 +342,9 @@ public class HTTPTestClient extends TestClient { */ public Object[] doGet(String host, Map headers, Map querys, String requestMessage, DefaultHttpClient client) throws Exception { - if (querys == null) querys = new HashMap(); + if (querys == null) { + querys = new HashMap(); + } if (StringUtils.isNotEmpty(requestMessage) && MessageKeys.MessageType.URL.getParseUtil().messageFormatValidation(requestMessage)) { querys.putAll(URLMessageParse.parseUrlToMap(requestMessage, null)); @@ -422,8 +427,8 @@ public class HTTPTestClient extends TestClient { } if (!StringUtils.isBlank(query.getKey())) { sbQuery.append(query.getKey()); + sbQuery.append("="); if (!StringUtils.isBlank(query.getValue())) { - sbQuery.append("="); sbQuery.append(URLEncoder.encode(PracticalUtils.replaceGlobalVariable(query.getValue(), null), ENC_CHARSET)); } } diff --git a/src/main/java/yi/master/coretest/message/protocol/WebSocketTestClient.java b/src/main/java/yi/master/coretest/message/protocol/WebSocketTestClient.java index f12f399c6019d2f855f92552767515ea6f4fd79d..8736abfb419dd5721adc984561fd2d89cd1e463d 100644 --- a/src/main/java/yi/master/coretest/message/protocol/WebSocketTestClient.java +++ b/src/main/java/yi/master/coretest/message/protocol/WebSocketTestClient.java @@ -69,7 +69,7 @@ public class WebSocketTestClient extends TestClient { } if (StringUtils.isBlank(responseObject.getStatusCode())) { - responseObject.setMark("请求超时"); + responseObject.addMark("请求超时"); responseObject.setStatusCode("false"); } @@ -81,7 +81,7 @@ public class WebSocketTestClient extends TestClient { } catch (Exception e) { logger.info(requestUrl + ",websocket error!", e); responseObject.setStatusCode("false"); - responseObject.setMark(PracticalUtils.getExceptionAllinformation(e)); + responseObject.addMark(PracticalUtils.getExceptionAllinformation(e)); } finally { if (webSocketClient != null && webSocketClient.isOpen()) { webSocketClient.close(); @@ -129,7 +129,7 @@ public class WebSocketTestClient extends TestClient { public void onError(Exception e) { logger.info(StrUtil.format("[{}]WebSocket error:{}", url, PracticalUtils.getExceptionAllinformation(e))); if (StringUtils.isBlank(responseObject.getStatusCode())) { - responseObject.setMark(PracticalUtils.getExceptionAllinformation(e)); + responseObject.addMark(PracticalUtils.getExceptionAllinformation(e)); responseObject.setResponseMessage(""); responseObject.setStatusCode("false"); } diff --git a/src/main/java/yi/master/coretest/message/protocol/entity/ClientTestResponseObject.java b/src/main/java/yi/master/coretest/message/protocol/entity/ClientTestResponseObject.java index 6f9c4c477921b282017aab0228283b623c8d0644..95ec84ef97de3190bcff7cc03f5672f310dca9bc 100644 --- a/src/main/java/yi/master/coretest/message/protocol/entity/ClientTestResponseObject.java +++ b/src/main/java/yi/master/coretest/message/protocol/entity/ClientTestResponseObject.java @@ -1,5 +1,7 @@ package yi.master.coretest.message.protocol.entity; +import org.apache.commons.lang3.StringUtils; + /** * 测试结果返回 * @author xuwangcheng @@ -69,5 +71,14 @@ public class ClientTestResponseObject { public void setMark(String mark) { this.mark = mark; } + + public void addMark (String mark) { + if (this.mark == null) { + this.mark = ""; + } + if (StringUtils.isNotBlank(mark)) { + this.mark += ("\n" + mark); + } + } } diff --git a/src/main/java/yi/master/coretest/message/test/MessageAutoTest.java b/src/main/java/yi/master/coretest/message/test/MessageAutoTest.java index 29b23ef0b126d1b302b810f38166fd47bd03b731..16f62208a7fb5b12c9f45a45877a4477b640eb2f 100644 --- a/src/main/java/yi/master/coretest/message/test/MessageAutoTest.java +++ b/src/main/java/yi/master/coretest/message/test/MessageAutoTest.java @@ -83,8 +83,6 @@ public class MessageAutoTest { @Autowired private TestSetService testSetService; @Autowired - private UserService userService; - @Autowired private TestReportService testReportService; @Autowired private MessageValidateResponse validateUtil; @@ -228,7 +226,7 @@ public class MessageAutoTest { //解除数据预占 CacheUtil.removeLockedTestData(testScene.getDataId()); - result.setMark(map.get(MessageValidateResponse.VALIDATE_MAP_MSG_KEY)); + result.setMark(map.get(MessageValidateResponse.VALIDATE_MAP_MSG_KEY) + "\n" + responseMap.getMark()); return result; } @@ -243,139 +241,144 @@ public class MessageAutoTest { */ @SuppressWarnings("unchecked") public Object singleTestComplexScene (TestMessageScene testScene, TestReport report) { - //该组合场景测试上下文保存的变量 - Map saveVariables = new HashMap(); List results = new ArrayList<>(); - //组合场景测试备注 - StringBuilder complexMark = new StringBuilder(); - - MessageParse parseUtil = null; - //停止标记 - boolean stopFlag = false; - //测试最后一个的标记 - boolean lastTestFlag = false; - boolean allSuccessFlag = true; - - int lastSeqNum = 1; - //获取httpclient,其他协议的暂时也走这个,但是不影响,后期需要针对不同协议的客户端做改动 DefaultHttpClient procotolClient = null; - if (testScene.isNewClient()) { - procotolClient = (DefaultHttpClient) testScene.getTestClient().getTestClient(); - } - - for (TestMessageScene scene:testScene.getScenes()) { - if (stopFlag || scene == null || (lastTestFlag && !scene.getScene().getSequenceNum().equals(testScene.getScenes().size()))) { - complexMark.append("测试序号为[" + ++lastSeqNum + "]" + ",跳过测试该场景!\n"); - continue; + Boolean allSuccessFlag = null; + //组合场景测试备注 + StringBuilder complexMark = new StringBuilder(); + + //组合场景中的场景是否为空 + if (testScene.getScenes().size() > 0) { + allSuccessFlag = true; + //该组合场景测试上下文保存的变量 + Map saveVariables = new HashMap(); + + //停止标记 + boolean stopFlag = false; + //测试最后一个的标记 + boolean lastTestFlag = false; + + int lastSeqNum = 1; + + if (testScene.isNewClient()) { + procotolClient = (DefaultHttpClient) testScene.getTestClient().getTestClient(); } - - lastSeqNum = scene.getScene().getSequenceNum(); - parseUtil = scene.getParseUtil(); - //替换上下文变量 - for (Map.Entry entry:scene.getScene().getConfig().getUseVariables().entrySet()) { - String value = null; - if (saveVariables.containsKey(entry.getValue())) { - //如果有对应上下文替换变量的就替换掉,否则使用常量 - value = saveVariables.get(entry.getValue()); - } else { - value = entry.getValue(); - } - - if (scene.getCallParameter() == null) { - scene.setCallParameter(new HashMap()); - scene.getCallParameter().put(MessageKeys.HTTP_PARAMETER_HEADER, new HashMap()); - } - if (scene.getCallParameter().get(MessageKeys.HTTP_PARAMETER_QUERYS) == null) { - scene.getCallParameter().put(MessageKeys.HTTP_PARAMETER_QUERYS, new HashMap()); + + for (TestMessageScene scene:testScene.getScenes()) { + if (stopFlag || scene == null || (lastTestFlag && !scene.getScene().getSequenceNum().equals(testScene.getScenes().size()))) { + complexMark.append("测试序号为[" + ++lastSeqNum + "]" + ",跳过测试该场景!\n"); + continue; } - - //根据变量名来判断是替换请求头还是请求体还是query参数 - if (entry.getKey().startsWith("RequestHeader.")) { - ((Map) scene.getCallParameter().get(MessageKeys.HTTP_PARAMETER_HEADER)).put(entry.getKey().substring(entry.getKey().indexOf(".") + 1) - , value); - } else if (entry.getKey().startsWith("Querys.")) { - ((Map) scene.getCallParameter().get(MessageKeys.HTTP_PARAMETER_QUERYS)).put(entry.getKey().substring(entry.getKey().indexOf(".") + 1) - , value); - } else { - scene.setRequestMessage(scene.getRequestMessage().replace(MessageKeys.CUSTOM_PARAMETER_BOUNDARY_SYMBOL_LEFT + - entry.getValue() + MessageKeys.CUSTOM_PARAMETER_BOUNDARY_SYMBOL_RIGHT, value)); + + lastSeqNum = scene.getScene().getSequenceNum(); + //替换上下文变量 + for (Map.Entry entry:scene.getScene().getConfig().getUseVariables().entrySet()) { + String value = null; + if (saveVariables.containsKey(entry.getValue())) { + //如果有对应上下文替换变量的就替换掉,否则使用常量 + value = saveVariables.get(entry.getValue()); + } else { + value = entry.getValue(); + } + + if (scene.getCallParameter() == null) { + scene.setCallParameter(new HashMap()); + scene.getCallParameter().put(MessageKeys.HTTP_PARAMETER_HEADER, new HashMap()); + } + if (scene.getCallParameter().get(MessageKeys.HTTP_PARAMETER_QUERYS) == null) { + scene.getCallParameter().put(MessageKeys.HTTP_PARAMETER_QUERYS, new HashMap()); + } + + //根据变量名来判断是替换请求头还是请求体还是query参数 + if (entry.getKey().startsWith("RequestHeader.")) { + ((Map) scene.getCallParameter().get(MessageKeys.HTTP_PARAMETER_HEADER)).put(entry.getKey().substring(entry.getKey().indexOf(".") + 1) + , value); + } else if (entry.getKey().startsWith("Querys.")) { + ((Map) scene.getCallParameter().get(MessageKeys.HTTP_PARAMETER_QUERYS)).put(entry.getKey().substring(entry.getKey().indexOf(".") + 1) + , value); + } else { + scene.setRequestMessage(scene.getRequestMessage().replace(MessageKeys.CUSTOM_PARAMETER_BOUNDARY_SYMBOL_LEFT + + entry.getValue() + MessageKeys.CUSTOM_PARAMETER_BOUNDARY_SYMBOL_RIGHT, value)); + } + } - - } - boolean successFlag = false; - int requestCount = 0; - TestResult result = null; - int maxRetryCount = scene.getScene().getConfig().getRetryCount(); - while (!successFlag && maxRetryCount >= requestCount ++) { + boolean successFlag = false; + int requestCount = 0; + TestResult result = null; + int maxRetryCount = scene.getScene().getConfig().getRetryCount(); + while (!successFlag && maxRetryCount >= requestCount ++) { - result = singleTest(scene, procotolClient); - - //如果场景测试成功 - if (MessageKeys.TestRunStatus.SUCCESS.getCode().equals(result.getRunStatus())) { - successFlag = true; - continue; + result = singleTest(scene, procotolClient); + + //如果场景测试成功 + if (MessageKeys.TestRunStatus.SUCCESS.getCode().equals(result.getRunStatus())) { + successFlag = true; + continue; + } + try { + Thread.sleep(scene.getScene().getConfig().getIntervalTime()); + } catch (InterruptedException e) { + e.printStackTrace(); + + } } - try { - Thread.sleep(scene.getScene().getConfig().getIntervalTime()); - } catch (InterruptedException e) { - e.printStackTrace(); - + result.setMark("组合场景名 [" + testScene.getComplexScene().getComplexSceneName() + "] ,执行序号 [" + scene.getScene().getSequenceNum() + "] \n\n" + result.getMark()); + results.add(result); + //测试成功要获取保存变量并设置数据状态 + if (successFlag) { + //保存上下文变量 + for (Map.Entry entry:scene.getScene().getConfig().getSaveVariables().entrySet()) { + String str = null; + //保存响应头中的变量 + if (entry.getKey().startsWith("ResponseHeader.") && StringUtils.isNotBlank(result.getHeaders())) { + JSONObject header = JSONObject.fromObject(result.getHeaders()); + String headerKey = entry.getKey().substring(entry.getKey().indexOf(".") + 1); + if (header.getJSONObject("ResponseHeader").has(headerKey)) { + str = header.getJSONObject("ResponseHeader").getString(headerKey); + } + } else { + //保存body体中的变量 + str = MessageParse.judgeMessageType(result.getResponseMessage()).getObjectByPath(result.getResponseMessage(), entry.getKey()); + } + + if (StringUtils.isNotEmpty(str)) { + saveVariables.put(entry.getValue(), str); + } + } } - } - result.setMark("组合场景名 [" + testScene.getComplexScene().getComplexSceneName() + "] ,执行序号 [" + scene.getScene().getSequenceNum() + "] \n\n" + result.getMark()); - results.add(result); - //测试成功要获取保存变量并设置数据状态 - if (successFlag) { - //保存上下文变量 - for (Map.Entry entry:scene.getScene().getConfig().getSaveVariables().entrySet()) { - String str = null; - //保存响应头中的变量 - if (entry.getKey().startsWith("ResponseHeader.") && StringUtils.isNotBlank(result.getHeaders())) { - JSONObject header = JSONObject.fromObject(result.getHeaders()); - String headerKey = entry.getKey().substring(entry.getKey().indexOf(".") + 1); - if (header.getJSONObject("ResponseHeader").has(headerKey)) { - str = header.getJSONObject("ResponseHeader").getString(headerKey); - } - } else { - //保存body体中的变量 - str = MessageParse.judgeMessageType(result.getResponseMessage()).getObjectByPath(result.getResponseMessage(), entry.getKey()); + //测试不成功的处理 + if (!successFlag) { + allSuccessFlag = false; + switch (scene.getScene().getConfig().getErrorExecFlag()) { + //退出组合场景的测试 + case "0": + stopFlag = true; + break; + //继续执行下一个场景 + case "1": + break; + //直接执行最后一个场景 + case "2": + lastTestFlag = true; + break; + default: + break; } - - if (StringUtils.isNotEmpty(str)) { - saveVariables.put(entry.getValue(), str); + } + + //一定时间间隔后执行下一个场景 + if (!stopFlag) { + try { + Thread.sleep(scene.getScene().getConfig().getIntervalTime()); + } catch (InterruptedException e) { + LOGGER.warn("InterruptedException", e); } - } - } - //测试不成功的处理 - if (!successFlag) { - allSuccessFlag = false; - switch (scene.getScene().getConfig().getErrorExecFlag()) { - //退出组合场景的测试 - case "0": - stopFlag = true; - break; - //继续执行下一个场景 - case "1": - break; - //直接执行最后一个场景 - case "2": - lastTestFlag = true; - break; - default: - break; } } - - //一定时间间隔后执行下一个场景 - if (!stopFlag) { - try { - Thread.sleep(scene.getScene().getConfig().getIntervalTime()); - } catch (InterruptedException e) { - LOGGER.warn("InterruptedException", e); - } - } - } + } + + if(testScene.getTestClient() != null) { testScene.getTestClient().putBackTestClient(procotolClient); @@ -396,8 +399,13 @@ public class MessageAutoTest { complexResult.setMark(complexMark.toString()); complexResult.setUseTime(0); complexResult.setProtocolType("FIXED"); - complexResult.setStatusCode("000"); - complexResult.setRunStatus(allSuccessFlag ? MessageKeys.TestRunStatus.SUCCESS.getCode() : MessageKeys.TestRunStatus.FAIL.getCode()); + if (allSuccessFlag == null) { + complexResult.setStatusCode("false"); + complexResult.setRunStatus(MessageKeys.TestRunStatus.STOP.getCode()); + } else { + complexResult.setStatusCode("000"); + complexResult.setRunStatus(allSuccessFlag ? MessageKeys.TestRunStatus.SUCCESS.getCode() : MessageKeys.TestRunStatus.FAIL.getCode()); + } complexResult.setComplexSceneResults(new TreeSet(results)); complexResult.setRequestUrl(""); complexResult.setRequestMessage(""); @@ -478,12 +486,22 @@ public class MessageAutoTest { } //场景数量 分别为finishCount和totalCount final int[] count = new int[]{0, testObjects.size()}; - + + //检查场景数量,包含单场景和组合场景中的场景 + boolean noSceneFlag = testObjects.size() > 0 ? false : true; //组装组合场景中的测试场景 for (ComplexScene s:complexScenes) { TestMessageScene testScene = packageComplexRequestObject(s, config); count[1] = count[1] + testScene.getTestCount(); testObjects.add(testScene); + + if (noSceneFlag && testScene.getScenes().size() > 0) { + noSceneFlag = false; + } + } + + if (noSceneFlag) { + return null; } //筛选出置顶测试场景 @@ -501,7 +519,6 @@ public class MessageAutoTest { Collections.sort(testObjects, new Comparator() { @Override public int compare(TestMessageScene o1, TestMessageScene o2) { - return o2.getPriority() - o1.getPriority(); } }); diff --git a/src/main/java/yi/master/coretest/message/test/performance/PerformanceTestObject.java b/src/main/java/yi/master/coretest/message/test/performance/PerformanceTestObject.java index b0b53c4ab417cd4f5e393b8fd3e12cc87fcb28dd..30e568f4e3cb751e23190f1b2d06aa20589c66df 100644 --- a/src/main/java/yi/master/coretest/message/test/performance/PerformanceTestObject.java +++ b/src/main/java/yi/master/coretest/message/test/performance/PerformanceTestObject.java @@ -29,6 +29,7 @@ import org.apache.struts2.json.annotations.JSON; import yi.master.business.advanced.bean.PerformanceTestConfig; import yi.master.business.advanced.bean.PerformanceTestResult; import yi.master.business.advanced.bean.config.performancetest.PerformanceTestAnalyzeResult; +import yi.master.business.advanced.enums.PtParameterGetType; import yi.master.business.advanced.service.PerformanceTestResultService; import yi.master.business.message.bean.InterfaceInfo; import yi.master.business.message.bean.Message; @@ -731,7 +732,7 @@ public class PerformanceTestObject { } //替换入参 //按顺序还是随机 - if ("1".equals(config.getParameterPickType())) { + if (PtParameterGetType.RANDOM.getType().equals(config.getParameterPickType())) { if (threadParameters.size() == 1) { index = 0; } else { @@ -740,7 +741,7 @@ public class PerformanceTestObject { } //可重复还是不可重复 Map replaceParameter = threadParameters.get(index); - if ("0".equals(config.getParameterReuse())) { + if (SystemConsts.DefaultBooleanIdentify.FALSE.getNumber().equals(config.getParameterReuse())) { //不可复用 threadParameters.remove(index); } else { diff --git a/src/main/java/yi/master/coretest/task/time/TimeTaskJobAction.java b/src/main/java/yi/master/coretest/task/time/TimeTaskJobAction.java index b8a329aa7449d440e9905245e80b800d42f874e1..70189ac209a153711bd6676f236df800f43c9999 100644 --- a/src/main/java/yi/master/coretest/task/time/TimeTaskJobAction.java +++ b/src/main/java/yi/master/coretest/task/time/TimeTaskJobAction.java @@ -21,12 +21,7 @@ import yi.master.util.cache.CacheUtil; * */ public class TimeTaskJobAction implements Job { - -/* @Autowired - private MessageAutoTest messageAutoTest; - @Autowired - private UserService userSerivce;*/ - + private static final Logger LOGGER = Logger.getLogger(TimeTaskJobAction.class); @SuppressWarnings("rawtypes") diff --git a/src/main/java/yi/master/util/PracticalUtils.java b/src/main/java/yi/master/util/PracticalUtils.java index 3cf93a4dc43622e994f4265237125b20f84834a8..b488ed73e41b558e34634d40e24032c45143ebde 100644 --- a/src/main/java/yi/master/util/PracticalUtils.java +++ b/src/main/java/yi/master/util/PracticalUtils.java @@ -129,7 +129,9 @@ public class PracticalUtils { String OS = System.getProperty("os.name").toLowerCase(); if (OS.indexOf("win") >= 0) { return true; - } else return false; + } else { + return false; + } } /** @@ -673,7 +675,6 @@ public class PracticalUtils { * * @return */ - @SuppressWarnings("resource") public static String doGetHttpRequest(String requestUrl) { HTTPTestClient client = (HTTPTestClient) TestClient.getTestClientInstance("HTTP"); HttpRequestBase request = null; @@ -691,7 +692,6 @@ public class PracticalUtils { return returnMsg.toString(); } catch (Exception e) { - e.printStackTrace(); return e.getMessage(); } finally { if (request != null) { @@ -740,7 +740,7 @@ public class PracticalUtils { Map objs = (Map) obj.toBean(obj, Map.class); for (String key:objs.keySet()) { JSONObject o = obj.getJSONObject(key); - configs.put(key, (ComplexSceneConfig) o.getJSONObject(key).toBean(o, ComplexSceneConfig.class, classMap)); + configs.put(key, (ComplexSceneConfig) JSONObject.toBean(o, ComplexSceneConfig.class, classMap)); } return configs; diff --git a/src/main/java/yi/master/util/message/JsonUtil.java b/src/main/java/yi/master/util/message/JsonUtil.java index 06f05f87b6ab4e5f72a57fbff692ae52dba76e07..ca7ddb4bfdfc31d0f81406015a49117e4780de75 100644 --- a/src/main/java/yi/master/util/message/JsonUtil.java +++ b/src/main/java/yi/master/util/message/JsonUtil.java @@ -112,16 +112,12 @@ public class JsonUtil { try { Map mp = null; List ls = null; - if (m instanceof Map || m instanceof LinkedHashMap) { mp = (LinkedHashMap) m; for (Iterator ite = mp.entrySet().iterator(); ite.hasNext();) { - Map.Entry e = (Map.Entry) ite.next(); - if (e.getValue() instanceof String) { - jsonTreeMap.put(e.getKey().toString(), e.getValue() .toString()); jsonTreeList.add(e.getKey().toString()); @@ -155,18 +151,16 @@ public class JsonUtil { parentNameC); } else if (e.getValue() instanceof Number) { - jsonTreeList.add(e.getKey().toString()); jsonTreeMap.put(e.getKey().toString(), String.valueOf(e.getValue())); jsonTreeType.add("Number"); jsonTreePath.add(parentName); - } else if (e.getValue() == null) { - + //不确定的类型统一识别为String类型 jsonTreeList.add(e.getKey().toString()); jsonTreeMap.put(e.getKey().toString(), "null"); - jsonTreeType.add("Unsureness"); + jsonTreeType.add("String"); jsonTreePath.add(parentName); } } diff --git a/src/main/java/yi/master/util/notify/NotifyMail.java b/src/main/java/yi/master/util/notify/NotifyMail.java index c26cdee6209640d388d483343221ee0eaeb627b1..6e2cfd783afb7a77de3a9d1820feb0d4c2f8062c 100644 --- a/src/main/java/yi/master/util/notify/NotifyMail.java +++ b/src/main/java/yi/master/util/notify/NotifyMail.java @@ -19,7 +19,7 @@ import yi.master.constant.SystemConsts; import yi.master.util.cache.CacheUtil; /** - * 邮件停止工具 + * 邮件通知工具 * @author xuwangcheng14@163.com * @date 2017.2 */ diff --git a/src/main/webapp/index.html b/src/main/webapp/index.html index 160b5c630862642c32566b26fe72c033bcb44ce4..31a217c40aba90c701b36c4abad41010bb83529e 100644 --- a/src/main/webapp/index.html +++ b/src/main/webapp/index.html @@ -114,10 +114,9 @@ var templates; var htmls; var menuJson; - $(document).ready(function() { - //初始化加载菜单 - loadMenuTemplate(); - + + var loadMenuFun; + $(document).ready(function() { $('iframe').attr("src", "welcome.html"); /***********通过外部登录的方式打开首页****************/ @@ -133,7 +132,10 @@ $(".openIframeNew").on("click",function(){ Hui_admin_tab(this); - }); + }); + + //初始化加载菜单 + //loadMenuTemplate(); /*******************初始化子iFrame中的模板和远程子页面html代码***************************/ //模板id @@ -164,7 +166,7 @@ } /********************加载菜单***************************/ - function loadMenuTemplate() { + loadMenuFun = function() { $.get(REQUEST_URL.MENU.GET_USER_MENUS, function(data){ if (data.returnCode == 0) { menuJson = data.data; @@ -183,8 +185,6 @@ name && (layer.msg('已切换至系统:' + name, {time:2000})); }); }) - } else { - layer.alert('获取菜单信息失败:' + (data.msg || '未知原因'), {icon: 5}); } }); } diff --git a/src/main/webapp/js/dcits.js b/src/main/webapp/js/dcits.js index eed6febc995e17878d46eb01acccc7c30c7f4043..dcd5395e00d93519b55a6bfbc21fb0d3f75ad4cd 100644 --- a/src/main/webapp/js/dcits.js +++ b/src/main/webapp/js/dcits.js @@ -130,7 +130,7 @@ var publish = { * getUrl:获取实体对象时的请求地址 * rules:rules规则 定义验证规则 * messages 提示 定义验证时展示的提示信息 - * beforeSubmitCallback 提交表单数据之前的回调,带一个参数modeFlag表示当前是新增(0)还是编辑数据(1) + * beforeSubmitCallback 提交表单数据之前的回调,参数modeFlag表示当前是新增(0)还是编辑数据(1),参数formObj是提交表单的jquery对象 * closeFlag:成功提交并返回之后是否关闭当前编辑窗口 默认为true 可选false * ajaxCallbackFun: ajax提交中的回调函数 如传入null,则使用默认 * renderCallback:function(obj){} 如果默认的渲染结果不是完整或者正确的,可以传入该回调重新或者附加渲染 obj=通过get方法获取的对应实体对象 @@ -235,7 +235,7 @@ var publish = { getUrl:"", rules:{}, messages:{}, - beforeSubmitCallback:function(modeFlag) {}, + beforeSubmitCallback:function(modeFlag, formObj) {}, closeFlag:true, ajaxCallbackFun:null, renderCallback:function(obj) {}, @@ -722,6 +722,7 @@ function ObjectEditPage(id, ajaxUrl, callback) { $(".form-horizontal").spinModal(); //编辑模式时将某些隐藏的控件展示 $(".editFlag").css("display","block"); + $(".addFlag").css("display","none"); $.post(ajaxUrl, {id:id}, function(data) { if (data.returnCode == 0) { var o = data.data; @@ -807,10 +808,11 @@ function formValidate(formObj, rules, messages, ajaxUrl, closeFlag, ajaxCallback submitHandlerCallbackFun($(form).serialize()); return false; } - - if (beforeSubmitCallback != null) { - beforeSubmitCallback(publish.renderParams.editPage.modeFlag); + + if (typeof beforeSubmitCallback === 'function') { + beforeSubmitCallback(publish.renderParams.editPage.modeFlag, $(form)); } + var formData = $(form).serialize(); $.post(ajaxUrl, formData, callbackFun); } diff --git a/src/main/webapp/js/globalConstant.js b/src/main/webapp/js/globalConstant.js index f102c9ef3f2e24c6f30c0e396c30e5285156e3fd..918ab84b7f1c99abcfeef5741829f6fab0e53f5a 100644 --- a/src/main/webapp/js/globalConstant.js +++ b/src/main/webapp/js/globalConstant.js @@ -451,7 +451,10 @@ var MESSAGE_PROTOCOL = { "ConnectTimeOut":"", "ReadTimeOut":"" }, - "Dubbo":{} + "Dubbo":{ + "ConnectTimeOut":"", + "ReadTimeOut":"" + } } diff --git a/src/main/webapp/resource/message/message.js b/src/main/webapp/resource/message/message.js index 33ac7c546b648e97e5f974d7a5002264032c2444..93587be0761ca70ae7c915a64ac48d6610732456 100644 --- a/src/main/webapp/resource/message/message.js +++ b/src/main/webapp/resource/message/message.js @@ -86,13 +86,13 @@ var templateParams = { }] }, { - label:"处理类型", + label:"报文处理器", select:[{ name:"processType", option:function(){ let options = [{ value:"", - text:"请选择一个处理类型" + text:"请选择一个报文处理器" }]; $.each(MESSAGE_PROCESS, function(k, p) { options.push({ @@ -172,7 +172,22 @@ var templateParams = { text:"禁用" }] }] - }, + }, + { + add: true, + reminder:"创建此报文时同时创建一个默认的测试场景和测试数据。", + label:"创建默认场景", + select:[{ + name:"createDefaultScene", + option:[{ + value:"true", + text:"是" + },{ + value:"false", + text:"否" + }] + }] + }, { edit:true, label:"创建日期", @@ -529,11 +544,11 @@ var eventList = { "#setting-process-parameter":function(){ var processType = $("#processType").val(); if (!strIsNotEmpty(processType)) { - layer.msg('请先选择一个处理类型!', {icon:5, time:1600}); + layer.msg('请先选择一个报文处理器!', {icon:5, time:1600}); return false; } var processParameter = JSON.parse($("#processParameter").val() || MESSAGE_PROCESS[processType]) ; - window.settingLayerIndex = layer_show("报文处理参数" + window.settingLayerIndex = layer_show("报文处理器参数" , templates["message-process-parameter-setting"](processParameter), 680, 400, 1, function(layero, index) { }); }, @@ -609,8 +624,8 @@ var mySetting = { } //编辑页面高度重设 - editPageHeight.add != null && (editPageHeight.add += 60); - editPageHeight.edit != null && (editPageHeight.edit += 60); + editPageHeight.add != null && (editPageHeight.add += 90); + editPageHeight.edit != null && (editPageHeight.edit += 10); df.resolve(); }, editPage:{ @@ -646,7 +661,7 @@ var mySetting = { }, messages:{ messageName:"请输入报文名称", - parameterJson:"请输入正确的报文 入参并点击验证", + parameterJson:"请输入正确的报文入参并点击验证", callParameter:"请点击配置按钮配置参数" }, renderCallback:function(obj){ diff --git a/src/main/webapp/resource/message/validateParameters.js b/src/main/webapp/resource/message/validateParameters.js index 9a385199974ba9961b60a096cefca63ebd8ad314..0d47c3f356d5c388bd73040f1e80d674064e613c 100644 --- a/src/main/webapp/resource/message/validateParameters.js +++ b/src/main/webapp/resource/message/validateParameters.js @@ -64,7 +64,7 @@ var templateParams = { }, { required:true, - label:"预期验证值类型", + label:"预期比对值类型", button:[{ style:"primary", value:"选择", @@ -354,11 +354,11 @@ var eventList = { changeTigs("4"); layer.close(index); }} - ,function(index){ + ,function(index){//常量 changeTigs("0"); layer.close(index); } - ,function(index){ + ,function(index){//入参节点 changeTigs("1"); layer.close(index); }); @@ -372,6 +372,7 @@ var eventList = { $("#" + name).val(value); } }); + $('#mark').val(globalVariable['mark']); layer.msg('已加载配置!', {icon:1, time:1500}); layer.close(index); }); @@ -456,6 +457,8 @@ $(function(){ * 绑定事件 */ function bindChooseRequestNodePath(){ + //防止重复绑定事件,先解绑 + $("#validateValue").unbind('click'); $("#validateValue").bind('click', function(){ chooseParameterNodePath(REQUEST_URL.MESSAGE_SCENE.GET_REQUEST_MSG_JSON_TREE, {messageSceneId:messageSceneId}, { titleName:"入参节点选择", @@ -532,7 +535,7 @@ function addEditPageHtml() { function showValidatRulePage(validateId) { //关联验证 根据publish.renderParams.editPage.modeFlag 0为增加 1为编辑 if (addValidateMethodFlag == 0) { - layer_show('关联验证', htmls["messageScene-validateKeyword"], '840', '490', 1, function() { + layer_show('关联验证', htmls["messageScene-validateKeyword"], '840', '560', 1, function() { if (publish.renderParams.editPage.modeFlag == 1) { $.get(REQUEST_URL.VALIDATE.GET, {id:validateId},function(data){ if(data.returnCode == 0) { @@ -552,6 +555,7 @@ function showValidatRulePage(validateId) { $("#getValueMethod").val(data.getValueMethod || "0"); $("#messageScene\\.messageSceneId").val(messageSceneId); $("#status").val(data.status); + $("#mark").val(data.mark); } else { layer.alert(data.msg,{icon:5}); } @@ -595,6 +599,7 @@ function saveValidateJson(){ sendData.validateValue = $("#validateValue").val(); sendData.validateId = $("#validateId").val(); sendData.getValueMethod = $("#getValueMethod").val(); + sendData.mark = $('#mark').val(); sendData["messageScene.messageSceneId"] = messageSceneId; sendData["status"] = $("#status").val(); diff --git a/src/main/webapp/resource/template/customTemplate.htm b/src/main/webapp/resource/template/customTemplate.htm index e9a68d38a0603b08d37250dd07c66474f9b22482..8d4b0a13920c22b00970884310a5c8f0059f384d 100644 --- a/src/main/webapp/resource/template/customTemplate.htm +++ b/src/main/webapp/resource/template/customTemplate.htm @@ -105,7 +105,7 @@
{{#each this}} {{#if label}} -
+
{{#if objText}} diff --git a/src/main/webapp/resource/template/messageScene-validateKeyword.htm b/src/main/webapp/resource/template/messageScene-validateKeyword.htm index a55bdad6c9f1dead95d4ef08e8725d9b890d2df9..d11d7652f397a5ada86a8495a71f5cd9324777a3 100644 --- a/src/main/webapp/resource/template/messageScene-validateKeyword.htm +++ b/src/main/webapp/resource/template/messageScene-validateKeyword.htm @@ -57,10 +57,16 @@
-
+
+
+ +
+ +
+
\ No newline at end of file diff --git a/src/main/webapp/welcome.html b/src/main/webapp/welcome.html index 0dd2b2ed7a1e2a071ec2b21ddb80b345c917a073..477a131eb9a51dee1ef93073e57759594505b5e7 100644 --- a/src/main/webapp/welcome.html +++ b/src/main/webapp/welcome.html @@ -114,6 +114,7 @@ var df = $.Deferred(); df.done(function(){ if (!($.isEmptyObject(userInfo))) { + parent.loadMenuFun(); getSetting(); getMailNum(); getStatisticalQuantity(); diff --git a/update.md b/update.md index c60d4803b85cab9bf6c3af274f707101c9fcfcb9..6d71a4152b13b8fdd53226bc6d8433aa586f1afd 100644 --- a/update.md +++ b/update.md @@ -1,3 +1,14 @@ +### v0.2.1beta +#### 2019.09.15 +- 修复:HTTP协议使用GET请求如果参数值为空的情况会导致无法正确的拼接查询参数到URL后面的问题; +- 修复:组合场景中没有测试场景测试集测试也会显示成功的问题; +- 修复:验证规则->节点验证时,重复指定预期验证比对值类型为入参节点时,点击预期比对值会弹出多个节点选择框的问题; +- 更新:导入接口参数时对值为‘null’的节点类型统一设置为String; +- 更新:关联验证可以添加备注信息; +- 更新:组合场景里如果没有测试场景则该组合场景将会被置为Stop状态; +- 增加:测试备注中的测试过程日志; +- 增加:创建测试报文时可以选择同时创建一个默认的测试场景。 + ### v0.2.0beta #### 2019.09.15 - 新增:HTTP/HTTPS接口支持请求类型PUT/DELETE