Merge remote-tracking branch 'origin/master'
This commit is contained in:
commit
2b6c627e14
|
@ -243,21 +243,23 @@ public class APIBackendListenerClient extends AbstractBackendListenerClient impl
|
|||
|
||||
BaseSystemConfigDTO baseSystemConfigDTO = systemParameterService.getBaseInfo();
|
||||
String url = reportUrl;
|
||||
String url2 = reportUrl;
|
||||
if (StringUtils.isEmpty(url)) {
|
||||
url = baseSystemConfigDTO.getUrl() + "/#/api/report/view/" + report.getId();
|
||||
url2 = baseSystemConfigDTO.getUrl() + "/#/api/automation/report";
|
||||
}
|
||||
String successContext = "";
|
||||
String failedContext = "";
|
||||
String subject = "";
|
||||
String event = "";
|
||||
if (StringUtils.equals(ReportTriggerMode.API.name(), report.getTriggerMode())) {
|
||||
successContext = "接口测试 API任务通知:'" + report.getName() + "'执行成功" + "\n" + "请点击下面链接进入测试报告页面" + "\n" + url;
|
||||
failedContext = "接口测试 API任务通知:'" + report.getName() + "'执行失败" + "\n" + "请点击下面链接进入测试报告页面" + "\n" + url;
|
||||
successContext = "接口测试 API任务通知:'" + report.getName() + "'执行成功" + "\n" + "请点击下面链接进入测试报告页面" + "\n" + "旧版接口测试路径" + url + "\n" + "新版接口测试路径" + url2;
|
||||
failedContext = "接口测试 API任务通知:'" + report.getName() + "'执行失败" + "\n" + "请点击下面链接进入测试报告页面" + "\n" + "旧版接口测试路径" + url + "\n" + "新版接口测试路径" + url2;
|
||||
subject = Translator.get("task_notification_jenkins");
|
||||
}
|
||||
if (StringUtils.equals(ReportTriggerMode.SCHEDULE.name(), report.getTriggerMode())) {
|
||||
successContext = "接口测试定时任务通知:'" + report.getName() + "'执行成功" + "\n" + "请点击下面链接进入测试报告页面" + "\n" + url;
|
||||
failedContext = "接口测试定时任务通知:'" + report.getName() + "'执行失败" + "\n" + "请点击下面链接进入测试报告页面" + "\n" + url;
|
||||
successContext = "接口测试定时任务通知:'" + report.getName() + "'执行成功" + "\n" + "请点击下面链接进入测试报告页面" + "\n" + "旧版接口测试路径" + url + "\n" + "新版接口测试路径" + url2;
|
||||
failedContext = "接口测试定时任务通知:'" + report.getName() + "'执行失败" + "\n" + "请点击下面链接进入测试报告页面" + "\n" + "旧版接口测试路径" + url + "\n" + "新版接口测试路径" + url2;
|
||||
subject = Translator.get("task_notification");
|
||||
}
|
||||
if (StringUtils.equals("Success", report.getStatus())) {
|
||||
|
|
|
@ -55,6 +55,9 @@ public class ApiDefinitionExecResultService {
|
|||
saveResult.setCreateTime(System.currentTimeMillis());
|
||||
saveResult.setUserId(Objects.requireNonNull(SessionUtils.getUser()).getId());
|
||||
saveResult.setName(item.getName());
|
||||
if (item.getName().indexOf("<->") != -1) {
|
||||
saveResult.setName(item.getName().substring(0, item.getName().indexOf("<->")));
|
||||
}
|
||||
saveResult.setResourceId(item.getName());
|
||||
saveResult.setContent(JSON.toJSONString(item));
|
||||
saveResult.setStartTime(item.getStartTime());
|
||||
|
|
|
@ -14,6 +14,7 @@ import io.metersphere.api.dto.scenario.request.RequestType;
|
|||
import io.metersphere.api.dto.swaggerurl.SwaggerTaskResult;
|
||||
import io.metersphere.api.dto.swaggerurl.SwaggerUrlRequest;
|
||||
import io.metersphere.api.jmeter.JMeterService;
|
||||
import io.metersphere.api.jmeter.RequestResult;
|
||||
import io.metersphere.api.jmeter.TestResult;
|
||||
import io.metersphere.api.parse.ApiImportParser;
|
||||
import io.metersphere.api.parse.ApiImportParserFactory;
|
||||
|
@ -297,7 +298,7 @@ public class ApiDefinitionService {
|
|||
}
|
||||
}
|
||||
|
||||
private ApiDefinition importCreate(ApiDefinitionResult request, ApiDefinitionMapper batchMapper,ApiTestImportRequest apiTestImportRequest) {
|
||||
private ApiDefinition importCreate(ApiDefinitionResult request, ApiDefinitionMapper batchMapper, ApiTestImportRequest apiTestImportRequest) {
|
||||
SaveApiDefinitionRequest saveReq = new SaveApiDefinitionRequest();
|
||||
BeanUtils.copyBean(saveReq, request);
|
||||
final ApiDefinitionWithBLOBs apiDefinition = new ApiDefinitionWithBLOBs();
|
||||
|
@ -313,7 +314,7 @@ public class ApiDefinitionService {
|
|||
apiDefinition.setDescription(request.getDescription());
|
||||
|
||||
List<ApiDefinition> sameRequest = getSameRequest(saveReq);
|
||||
if(StringUtils.equals("fullCoverage",apiTestImportRequest.getModeId())){
|
||||
if (StringUtils.equals("fullCoverage", apiTestImportRequest.getModeId())) {
|
||||
if (CollectionUtils.isEmpty(sameRequest)) {
|
||||
batchMapper.insert(apiDefinition);
|
||||
} else {
|
||||
|
@ -321,9 +322,9 @@ public class ApiDefinitionService {
|
|||
apiDefinition.setId(sameRequest.get(0).getId());
|
||||
apiDefinitionMapper.updateByPrimaryKeyWithBLOBs(apiDefinition);
|
||||
}
|
||||
}else if(StringUtils.equals("incrementalMerge",apiTestImportRequest.getModeId())){
|
||||
} else if (StringUtils.equals("incrementalMerge", apiTestImportRequest.getModeId())) {
|
||||
batchMapper.insert(apiDefinition);
|
||||
}else{
|
||||
} else {
|
||||
if (CollectionUtils.isEmpty(sameRequest)) {
|
||||
batchMapper.insert(apiDefinition);
|
||||
} else {
|
||||
|
@ -372,7 +373,11 @@ public class ApiDefinitionService {
|
|||
|
||||
public void addResult(TestResult res) {
|
||||
if (!res.getScenarios().isEmpty() && !res.getScenarios().get(0).getRequestResults().isEmpty()) {
|
||||
cache.put(res.getTestId(), res.getScenarios().get(0).getRequestResults().get(0));
|
||||
RequestResult result = res.getScenarios().get(0).getRequestResults().get(0);
|
||||
if (result.getName().indexOf("<->") != -1) {
|
||||
result.setName(result.getName().substring(0, result.getName().indexOf("<->")));
|
||||
}
|
||||
cache.put(res.getTestId(), result);
|
||||
} else {
|
||||
MSException.throwException(Translator.get("test_not_found"));
|
||||
}
|
||||
|
@ -451,7 +456,7 @@ public class ApiDefinitionService {
|
|||
item.setName(item.getName().substring(0, 255));
|
||||
}
|
||||
item.setNum(num++);
|
||||
importCreate(item, batchMapper,request);
|
||||
importCreate(item, batchMapper, request);
|
||||
if (i % 300 == 0) {
|
||||
sqlSession.flushStatements();
|
||||
}
|
||||
|
@ -614,7 +619,7 @@ public class ApiDefinitionService {
|
|||
/*swagger定时导入*/
|
||||
public void createSchedule(Schedule request) {
|
||||
/*保存swaggerUrl*/
|
||||
SwaggerUrlProject swaggerUrlProject=new SwaggerUrlProject();
|
||||
SwaggerUrlProject swaggerUrlProject = new SwaggerUrlProject();
|
||||
swaggerUrlProject.setId(UUID.randomUUID().toString());
|
||||
swaggerUrlProject.setProjectId(request.getProjectId());
|
||||
swaggerUrlProject.setSwaggerUrl(request.getResourceId());
|
||||
|
@ -631,33 +636,38 @@ public class ApiDefinitionService {
|
|||
this.addOrUpdateSwaggerImportCronJob(request);
|
||||
|
||||
}
|
||||
|
||||
//关闭
|
||||
public void updateSchedule(Schedule request){
|
||||
public void updateSchedule(Schedule request) {
|
||||
scheduleService.editSchedule(request);
|
||||
this.addOrUpdateSwaggerImportCronJob(request);
|
||||
}
|
||||
|
||||
//删除
|
||||
public void deleteSchedule(ScheduleInfoSwaggerUrlRequest request){
|
||||
public void deleteSchedule(ScheduleInfoSwaggerUrlRequest request) {
|
||||
swaggerUrlProjectMapper.deleteByPrimaryKey(request.getId());
|
||||
scheduleMapper.deleteByPrimaryKey(request.getTaskId());
|
||||
|
||||
}
|
||||
|
||||
//查询swaggerUrl详情
|
||||
public SwaggerUrlProject getSwaggerInfo(String resourceId){
|
||||
public SwaggerUrlProject getSwaggerInfo(String resourceId) {
|
||||
return swaggerUrlProjectMapper.selectByPrimaryKey(resourceId);
|
||||
}
|
||||
public String getResourceId(SwaggerUrlRequest swaggerUrlRequest){
|
||||
SwaggerUrlProjectExample swaggerUrlProjectExample=new SwaggerUrlProjectExample();
|
||||
SwaggerUrlProjectExample.Criteria criteria=swaggerUrlProjectExample.createCriteria();
|
||||
|
||||
public String getResourceId(SwaggerUrlRequest swaggerUrlRequest) {
|
||||
SwaggerUrlProjectExample swaggerUrlProjectExample = new SwaggerUrlProjectExample();
|
||||
SwaggerUrlProjectExample.Criteria criteria = swaggerUrlProjectExample.createCriteria();
|
||||
criteria.andProjectIdEqualTo(swaggerUrlRequest.getProjectId()).andSwaggerUrlEqualTo(swaggerUrlRequest.getSwaggerUrl()).andModuleIdEqualTo(swaggerUrlRequest.getModuleId());
|
||||
List<SwaggerUrlProject> list=swaggerUrlProjectMapper.selectByExample(swaggerUrlProjectExample);
|
||||
String resourceId="";
|
||||
if(list.size()==1){
|
||||
resourceId=list.get(0).getId();
|
||||
List<SwaggerUrlProject> list = swaggerUrlProjectMapper.selectByExample(swaggerUrlProjectExample);
|
||||
String resourceId = "";
|
||||
if (list.size() == 1) {
|
||||
resourceId = list.get(0).getId();
|
||||
}
|
||||
return resourceId;
|
||||
}
|
||||
public List<SwaggerTaskResult> getSwaggerScheduleList(String projectId){
|
||||
|
||||
public List<SwaggerTaskResult> getSwaggerScheduleList(String projectId) {
|
||||
return extSwaggerUrlScheduleMapper.getSwaggerTaskList(projectId);
|
||||
}
|
||||
|
||||
|
|
|
@ -412,6 +412,7 @@ public class HistoricalDataUpgradeService {
|
|||
MsScenario step = new MsScenario();
|
||||
step.setId(scenario1.getId());
|
||||
step.setName(scenario1.getName());
|
||||
step.setEnable(scenario.isEnable());
|
||||
step.setType("scenario");
|
||||
step.setResourceId(UUID.randomUUID().toString());
|
||||
step.setReferenced("REF");
|
||||
|
|
|
@ -33,5 +33,7 @@ public class TestPlanReport implements Serializable {
|
|||
|
||||
private String principal;
|
||||
|
||||
private String components;
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
}
|
|
@ -1013,6 +1013,76 @@ public class TestPlanReportExample {
|
|||
addCriterion("principal not between", value1, value2, "principal");
|
||||
return (Criteria) this;
|
||||
}
|
||||
|
||||
public Criteria andComponentsIsNull() {
|
||||
addCriterion("components is null");
|
||||
return (Criteria) this;
|
||||
}
|
||||
|
||||
public Criteria andComponentsIsNotNull() {
|
||||
addCriterion("components is not null");
|
||||
return (Criteria) this;
|
||||
}
|
||||
|
||||
public Criteria andComponentsEqualTo(String value) {
|
||||
addCriterion("components =", value, "components");
|
||||
return (Criteria) this;
|
||||
}
|
||||
|
||||
public Criteria andComponentsNotEqualTo(String value) {
|
||||
addCriterion("components <>", value, "components");
|
||||
return (Criteria) this;
|
||||
}
|
||||
|
||||
public Criteria andComponentsGreaterThan(String value) {
|
||||
addCriterion("components >", value, "components");
|
||||
return (Criteria) this;
|
||||
}
|
||||
|
||||
public Criteria andComponentsGreaterThanOrEqualTo(String value) {
|
||||
addCriterion("components >=", value, "components");
|
||||
return (Criteria) this;
|
||||
}
|
||||
|
||||
public Criteria andComponentsLessThan(String value) {
|
||||
addCriterion("components <", value, "components");
|
||||
return (Criteria) this;
|
||||
}
|
||||
|
||||
public Criteria andComponentsLessThanOrEqualTo(String value) {
|
||||
addCriterion("components <=", value, "components");
|
||||
return (Criteria) this;
|
||||
}
|
||||
|
||||
public Criteria andComponentsLike(String value) {
|
||||
addCriterion("components like", value, "components");
|
||||
return (Criteria) this;
|
||||
}
|
||||
|
||||
public Criteria andComponentsNotLike(String value) {
|
||||
addCriterion("components not like", value, "components");
|
||||
return (Criteria) this;
|
||||
}
|
||||
|
||||
public Criteria andComponentsIn(List<String> values) {
|
||||
addCriterion("components in", values, "components");
|
||||
return (Criteria) this;
|
||||
}
|
||||
|
||||
public Criteria andComponentsNotIn(List<String> values) {
|
||||
addCriterion("components not in", values, "components");
|
||||
return (Criteria) this;
|
||||
}
|
||||
|
||||
public Criteria andComponentsBetween(String value1, String value2) {
|
||||
addCriterion("components between", value1, value2, "components");
|
||||
return (Criteria) this;
|
||||
}
|
||||
|
||||
public Criteria andComponentsNotBetween(String value1, String value2) {
|
||||
addCriterion("components not between", value1, value2, "components");
|
||||
return (Criteria) this;
|
||||
}
|
||||
}
|
||||
|
||||
public static class Criteria extends GeneratedCriteria {
|
||||
|
|
|
@ -12,10 +12,11 @@
|
|||
<result column="creator" jdbcType="VARCHAR" property="creator" />
|
||||
<result column="start_time" jdbcType="BIGINT" property="startTime" />
|
||||
<result column="end_time" jdbcType="BIGINT" property="endTime" />
|
||||
<result column="is_api_case_executing" jdbcType="BIT" property="isApiCaseExecuting" />
|
||||
<result column="is_scenario_executing" jdbcType="BIT" property="isScenarioExecuting" />
|
||||
<result column="is_performance_executing" jdbcType="BIT" property="isPerformanceExecuting" />
|
||||
<result column="is_api_case_executing" jdbcType="TINYINT" property="isApiCaseExecuting" />
|
||||
<result column="is_scenario_executing" jdbcType="TINYINT" property="isScenarioExecuting" />
|
||||
<result column="is_performance_executing" jdbcType="TINYINT" property="isPerformanceExecuting" />
|
||||
<result column="principal" jdbcType="VARCHAR" property="principal" />
|
||||
<result column="components" jdbcType="VARCHAR" property="components" />
|
||||
</resultMap>
|
||||
<sql id="Example_Where_Clause">
|
||||
<where>
|
||||
|
@ -78,7 +79,7 @@
|
|||
<sql id="Base_Column_List">
|
||||
id, test_plan_id, create_time, update_time, `name`, `status`, trigger_mode, creator,
|
||||
start_time, end_time, is_api_case_executing, is_scenario_executing, is_performance_executing,
|
||||
principal
|
||||
principal, components
|
||||
</sql>
|
||||
<select id="selectByExample" parameterType="io.metersphere.base.domain.TestPlanReportExample" resultMap="BaseResultMap">
|
||||
select
|
||||
|
@ -115,12 +116,14 @@
|
|||
update_time, `name`, `status`,
|
||||
trigger_mode, creator, start_time,
|
||||
end_time, is_api_case_executing, is_scenario_executing,
|
||||
is_performance_executing, principal)
|
||||
is_performance_executing, principal, components
|
||||
)
|
||||
values (#{id,jdbcType=VARCHAR}, #{testPlanId,jdbcType=VARCHAR}, #{createTime,jdbcType=BIGINT},
|
||||
#{updateTime,jdbcType=BIGINT}, #{name,jdbcType=VARCHAR}, #{status,jdbcType=VARCHAR},
|
||||
#{triggerMode,jdbcType=VARCHAR}, #{creator,jdbcType=VARCHAR}, #{startTime,jdbcType=BIGINT},
|
||||
#{endTime,jdbcType=BIGINT}, #{isApiCaseExecuting,jdbcType=BIT}, #{isScenarioExecuting,jdbcType=BIT},
|
||||
#{isPerformanceExecuting,jdbcType=BIT}, #{principal,jdbcType=VARCHAR})
|
||||
#{endTime,jdbcType=BIGINT}, #{isApiCaseExecuting,jdbcType=TINYINT}, #{isScenarioExecuting,jdbcType=TINYINT},
|
||||
#{isPerformanceExecuting,jdbcType=TINYINT}, #{principal,jdbcType=VARCHAR}, #{components,jdbcType=VARCHAR}
|
||||
)
|
||||
</insert>
|
||||
<insert id="insertSelective" parameterType="io.metersphere.base.domain.TestPlanReport">
|
||||
insert into test_plan_report
|
||||
|
@ -167,6 +170,9 @@
|
|||
<if test="principal != null">
|
||||
principal,
|
||||
</if>
|
||||
<if test="components != null">
|
||||
components,
|
||||
</if>
|
||||
</trim>
|
||||
<trim prefix="values (" suffix=")" suffixOverrides=",">
|
||||
<if test="id != null">
|
||||
|
@ -200,17 +206,20 @@
|
|||
#{endTime,jdbcType=BIGINT},
|
||||
</if>
|
||||
<if test="isApiCaseExecuting != null">
|
||||
#{isApiCaseExecuting,jdbcType=BIT},
|
||||
#{isApiCaseExecuting,jdbcType=TINYINT},
|
||||
</if>
|
||||
<if test="isScenarioExecuting != null">
|
||||
#{isScenarioExecuting,jdbcType=BIT},
|
||||
#{isScenarioExecuting,jdbcType=TINYINT},
|
||||
</if>
|
||||
<if test="isPerformanceExecuting != null">
|
||||
#{isPerformanceExecuting,jdbcType=BIT},
|
||||
#{isPerformanceExecuting,jdbcType=TINYINT},
|
||||
</if>
|
||||
<if test="principal != null">
|
||||
#{principal,jdbcType=VARCHAR},
|
||||
</if>
|
||||
<if test="components != null">
|
||||
#{components,jdbcType=VARCHAR},
|
||||
</if>
|
||||
</trim>
|
||||
</insert>
|
||||
<select id="countByExample" parameterType="io.metersphere.base.domain.TestPlanReportExample" resultType="java.lang.Long">
|
||||
|
@ -253,17 +262,20 @@
|
|||
end_time = #{record.endTime,jdbcType=BIGINT},
|
||||
</if>
|
||||
<if test="record.isApiCaseExecuting != null">
|
||||
is_api_case_executing = #{record.isApiCaseExecuting,jdbcType=BIT},
|
||||
is_api_case_executing = #{record.isApiCaseExecuting,jdbcType=TINYINT},
|
||||
</if>
|
||||
<if test="record.isScenarioExecuting != null">
|
||||
is_scenario_executing = #{record.isScenarioExecuting,jdbcType=BIT},
|
||||
is_scenario_executing = #{record.isScenarioExecuting,jdbcType=TINYINT},
|
||||
</if>
|
||||
<if test="record.isPerformanceExecuting != null">
|
||||
is_performance_executing = #{record.isPerformanceExecuting,jdbcType=BIT},
|
||||
is_performance_executing = #{record.isPerformanceExecuting,jdbcType=TINYINT},
|
||||
</if>
|
||||
<if test="record.principal != null">
|
||||
principal = #{record.principal,jdbcType=VARCHAR},
|
||||
</if>
|
||||
<if test="record.components != null">
|
||||
components = #{record.components,jdbcType=VARCHAR},
|
||||
</if>
|
||||
</set>
|
||||
<if test="_parameter != null">
|
||||
<include refid="Update_By_Example_Where_Clause" />
|
||||
|
@ -281,10 +293,11 @@
|
|||
creator = #{record.creator,jdbcType=VARCHAR},
|
||||
start_time = #{record.startTime,jdbcType=BIGINT},
|
||||
end_time = #{record.endTime,jdbcType=BIGINT},
|
||||
is_api_case_executing = #{record.isApiCaseExecuting,jdbcType=BIT},
|
||||
is_scenario_executing = #{record.isScenarioExecuting,jdbcType=BIT},
|
||||
is_performance_executing = #{record.isPerformanceExecuting,jdbcType=BIT},
|
||||
principal = #{record.principal,jdbcType=VARCHAR}
|
||||
is_api_case_executing = #{record.isApiCaseExecuting,jdbcType=TINYINT},
|
||||
is_scenario_executing = #{record.isScenarioExecuting,jdbcType=TINYINT},
|
||||
is_performance_executing = #{record.isPerformanceExecuting,jdbcType=TINYINT},
|
||||
principal = #{record.principal,jdbcType=VARCHAR},
|
||||
components = #{record.components,jdbcType=VARCHAR}
|
||||
<if test="_parameter != null">
|
||||
<include refid="Update_By_Example_Where_Clause" />
|
||||
</if>
|
||||
|
@ -320,17 +333,20 @@
|
|||
end_time = #{endTime,jdbcType=BIGINT},
|
||||
</if>
|
||||
<if test="isApiCaseExecuting != null">
|
||||
is_api_case_executing = #{isApiCaseExecuting,jdbcType=BIT},
|
||||
is_api_case_executing = #{isApiCaseExecuting,jdbcType=TINYINT},
|
||||
</if>
|
||||
<if test="isScenarioExecuting != null">
|
||||
is_scenario_executing = #{isScenarioExecuting,jdbcType=BIT},
|
||||
is_scenario_executing = #{isScenarioExecuting,jdbcType=TINYINT},
|
||||
</if>
|
||||
<if test="isPerformanceExecuting != null">
|
||||
is_performance_executing = #{isPerformanceExecuting,jdbcType=BIT},
|
||||
is_performance_executing = #{isPerformanceExecuting,jdbcType=TINYINT},
|
||||
</if>
|
||||
<if test="principal != null">
|
||||
principal = #{principal,jdbcType=VARCHAR},
|
||||
</if>
|
||||
<if test="components != null">
|
||||
components = #{components,jdbcType=VARCHAR},
|
||||
</if>
|
||||
</set>
|
||||
where id = #{id,jdbcType=VARCHAR}
|
||||
</update>
|
||||
|
@ -345,10 +361,11 @@
|
|||
creator = #{creator,jdbcType=VARCHAR},
|
||||
start_time = #{startTime,jdbcType=BIGINT},
|
||||
end_time = #{endTime,jdbcType=BIGINT},
|
||||
is_api_case_executing = #{isApiCaseExecuting,jdbcType=BIT},
|
||||
is_scenario_executing = #{isScenarioExecuting,jdbcType=BIT},
|
||||
is_performance_executing = #{isPerformanceExecuting,jdbcType=BIT},
|
||||
principal = #{principal,jdbcType=VARCHAR}
|
||||
is_api_case_executing = #{isApiCaseExecuting,jdbcType=TINYINT},
|
||||
is_scenario_executing = #{isScenarioExecuting,jdbcType=TINYINT},
|
||||
is_performance_executing = #{isPerformanceExecuting,jdbcType=TINYINT},
|
||||
principal = #{principal,jdbcType=VARCHAR},
|
||||
components = #{components,jdbcType=VARCHAR}
|
||||
where id = #{id,jdbcType=VARCHAR}
|
||||
</update>
|
||||
</mapper>
|
|
@ -233,6 +233,8 @@ public class TestPlanReportService {
|
|||
testPlanReport.setEndTime(System.currentTimeMillis());
|
||||
testPlanReport.setUpdateTime(System.currentTimeMillis());
|
||||
|
||||
//手动触发的需要保存手工执行的信息
|
||||
|
||||
JSONObject content = JSONObject.parseObject("{\"components\":[1,2,3,4,5]}");
|
||||
JSONArray componentIds = content.getJSONArray("components");
|
||||
List<ReportComponent> components = ReportComponentFactory.createComponents(componentIds.toJavaList(String.class), testPlan);
|
||||
|
|
|
@ -0,0 +1 @@
|
|||
ALTER TABLE test_plan_report ADD components VARCHAR (20);
|
|
@ -14,6 +14,8 @@
|
|||
<p>您所执行的 ${testName} 接口测试运行失败<br/>
|
||||
请点击下面链接进入测试报告页面</p>
|
||||
<a href="${url}/#/${type}/report/view/${id}">${url}/#/${type}/report/view/${id}</a>
|
||||
<p>新版接口测试报告路径</p>
|
||||
<a href="${url}/#/api/automation">${url}/#/api/automation</a>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
|
|
@ -13,6 +13,8 @@
|
|||
<p>您所执行的 ${testName} 接口测试运行成功<br/>
|
||||
请点击下面链接进入测试报告页面</p>
|
||||
<a href="${url}/#/${type}/report/view/${id}">${url}/#/${type}/report/view/${id}</a>
|
||||
<p>新版接口测试报告路径</p>
|
||||
<a href="${url}/#/api/automation">${url}/#/api/automation</a>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
|
@ -22,6 +22,7 @@
|
|||
:trash-enable="trashEnable"
|
||||
:checkRedirectID="checkRedirectID"
|
||||
:isRedirectEdit="isRedirectEdit"
|
||||
@openScenario="editScenario"
|
||||
@edit="editScenario"
|
||||
@changeSelectDataRangeAll="changeSelectDataRangeAll"
|
||||
ref="apiScenarioList"/>
|
||||
|
|
|
@ -100,7 +100,7 @@
|
|||
<ms-table-operator-button :tip="$t('api_test.automation.copy')" icon="el-icon-document-copy" type=""
|
||||
@exec="copy(row)"/>
|
||||
<ms-table-operator-button :tip="$t('api_test.automation.remove')" icon="el-icon-delete" @exec="remove(row)" type="danger" v-tester/>
|
||||
<ms-scenario-extend-buttons :row="row"/>
|
||||
<ms-scenario-extend-buttons @openScenario="openScenario" :row="row"/>
|
||||
</div>
|
||||
</template>
|
||||
</el-table-column>
|
||||
|
@ -589,6 +589,9 @@ export default {
|
|||
_filter(filters, this.condition);
|
||||
this.search();
|
||||
},
|
||||
openScenario (item) {
|
||||
this.$emit('openScenario', item)
|
||||
},
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
|
|
@ -148,7 +148,7 @@
|
|||
<!-- 步骤组件-->
|
||||
<ms-component-config :type="data.type" :scenario="data" :response="response" :currentScenario="currentScenario"
|
||||
:currentEnvironmentId="currentEnvironmentId" :node="node"
|
||||
@remove="remove" @copyRow="copyRow" @suggestClick="suggestClick"/>
|
||||
@remove="remove" @copyRow="copyRow" @suggestClick="suggestClick" @refReload="reload"/>
|
||||
</span>
|
||||
</el-tree>
|
||||
</div>
|
||||
|
@ -423,7 +423,6 @@
|
|||
document.removeEventListener("keydown", this.createCtrlSHandle);
|
||||
},
|
||||
createCtrlSHandle(event) {
|
||||
console.log("create ctrl + s");
|
||||
handleCtrlSEvent(event, this.editScenario);
|
||||
},
|
||||
getIdx(index) {
|
||||
|
@ -884,7 +883,6 @@
|
|||
}
|
||||
this.enableCookieShare = obj.enableCookieShare;
|
||||
this.scenarioDefinition = obj.hashTree;
|
||||
console.log(this.scenarioDefinition)
|
||||
}
|
||||
}
|
||||
if (this.currentScenario.copy) {
|
||||
|
|
|
@ -3,12 +3,20 @@
|
|||
width="45%" :destroy-on-close="true" >
|
||||
<span>{{ $t('api_test.automation.scenario_ref') }}:</span>
|
||||
<div class="refs" v-loading="scenarioLoading">
|
||||
<div v-for="(item, index) in scenarioRefs" :key="index" class="el-button--text">{{ item.name }}</div>
|
||||
<div v-for="(item, index) in scenarioRefs" :key="index" class="el-button--text">
|
||||
<el-link @click="openScenario(item)">
|
||||
{{ item.name }}
|
||||
</el-link>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<span>{{ $t('api_test.automation.plan_ref') }}:</span>
|
||||
<div class="refs">
|
||||
<div v-for="(item, index) in planRefs" :key="index" class="el-button--text">{{ item.name }}</div>
|
||||
<div v-for="(item, index) in planRefs" :key="index" class="el-button--text">
|
||||
<router-link :to="'/track/plan/view/' + item.id">
|
||||
{{ item.name }}
|
||||
</router-link>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<template v-slot:footer>
|
||||
|
@ -47,6 +55,10 @@
|
|||
open(row) {
|
||||
this.getReferenceData(row);
|
||||
this.visible = true
|
||||
},
|
||||
openScenario(item) {
|
||||
this.$emit('openScenario', item);
|
||||
this.visible = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -10,7 +10,7 @@
|
|||
<el-dropdown-item command="create_performance" v-tester>{{ $t('api_test.create_performance_test') }}</el-dropdown-item>
|
||||
</el-dropdown-menu>
|
||||
</el-dropdown>
|
||||
<ms-reference-view ref="viewRef"/>
|
||||
<ms-reference-view @openScenario="openScenario" ref="viewRef"/>
|
||||
<ms-schedule-maintain ref="scheduleMaintain" @refreshTable="refreshTable"/>
|
||||
|
||||
</div>
|
||||
|
@ -64,6 +64,9 @@
|
|||
})
|
||||
});
|
||||
},
|
||||
openScenario (item) {
|
||||
this.$emit('openScenario', item)
|
||||
},
|
||||
refreshTable() {
|
||||
|
||||
}
|
||||
|
|
|
@ -6,7 +6,7 @@
|
|||
|
||||
<ms-environment-select :project-id="projectId" v-if="isTestPlan" :is-read-only="isReadOnly" @setEnvironment="setEnvironment"/>
|
||||
|
||||
<el-input placeholder="搜索" @blur="initTable" class="search-input" size="small" @keyup.enter.native="initTable" v-model="condition.name"/>
|
||||
<el-input :placeholder="$t('api_monitor.please_search')" @blur="initTable" class="search-input" size="small" @keyup.enter.native="initTable" v-model="condition.name"/>
|
||||
|
||||
<el-table v-loading="result.loading"
|
||||
border
|
||||
|
@ -26,7 +26,7 @@
|
|||
<ms-tag v-if="scope.row.status == 'Prepare'" type="info" effect="plain" :content="$t('test_track.plan.plan_status_prepare')"/>
|
||||
<ms-tag v-if="scope.row.status == 'Underway'" type="warning" effect="plain" :content="$t('test_track.plan.plan_status_running')"/>
|
||||
<ms-tag v-if="scope.row.status == 'Completed'" type="success" effect="plain" :content="$t('test_track.plan.plan_status_completed')"/>
|
||||
<ms-tag v-if="scope.row.status == 'Trash'" type="danger" effect="plain" content="废弃"/>
|
||||
<ms-tag v-if="scope.row.status == 'Trash'" type="danger" effect="plain" :content="$t('test_track.plan.plan_status_trash')"/>
|
||||
</template>
|
||||
</el-table-column>
|
||||
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
<template>
|
||||
<relevance-dialog :title="'场景导入'" ref="relevanceDialog">
|
||||
<relevance-dialog :title="$t('api_test.automation.scenario_import')" ref="relevanceDialog">
|
||||
|
||||
<template v-slot:aside>
|
||||
<ms-api-scenario-module
|
||||
|
@ -19,8 +19,8 @@
|
|||
ref="apiScenarioList"/>
|
||||
|
||||
<template v-slot:footer>
|
||||
<el-button type="primary" @click="copy" @keydown.enter.native.prevent>复制</el-button>
|
||||
<el-button type="primary" @click="reference" @keydown.enter.native.prevent>引用</el-button>
|
||||
<el-button type="primary" @click="copy" @keydown.enter.native.prevent>{{$t('commons.copy')}}</el-button>
|
||||
<el-button type="primary" @click="reference" @keydown.enter.native.prevent> {{ $t('api_test.scenario.reference') }}</el-button>
|
||||
</template>
|
||||
|
||||
</relevance-dialog>
|
||||
|
|
|
@ -12,7 +12,7 @@
|
|||
<span @click.stop>
|
||||
<slot name="headerLeft">
|
||||
<i class="icon el-icon-arrow-right" :class="{'is-active': data.active}"
|
||||
@click="active(data)"/>
|
||||
@click="active(data)" v-if="data.type!='scenario'"/>
|
||||
<el-input :draggable="draggable" v-if="isShowInput && isShowNameInput" size="small" v-model="data.name" class="name-input"
|
||||
@blur="isShowInput = false" :placeholder="$t('commons.input_name')" ref="nameEdit"/>
|
||||
<span v-else>
|
||||
|
|
|
@ -14,7 +14,7 @@
|
|||
<el-tag size="mini" style="margin-left: 20px" v-if="request.referenced==='Deleted'" type="danger">{{$t('api_test.automation.reference_deleted')}}</el-tag>
|
||||
<el-tag size="mini" style="margin-left: 20px" v-if="request.referenced==='Copy'">{{ $t('commons.copy') }}</el-tag>
|
||||
<el-tag size="mini" style="margin-left: 20px" v-if="request.referenced ==='REF'">{{ $t('api_test.scenario.reference') }}</el-tag>
|
||||
<ms-run :debug="false" :reportId="reportId" :run-data="runData"
|
||||
<ms-run :debug="true" :reportId="reportId" :run-data="runData"
|
||||
@runRefresh="runRefresh" ref="runTest"/>
|
||||
|
||||
</template>
|
||||
|
|
|
@ -42,6 +42,12 @@
|
|||
this.isActive = true;
|
||||
}
|
||||
},
|
||||
watch: {
|
||||
result() {
|
||||
this.response = this.result;
|
||||
this.isActive = true;
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
getExecResult() {
|
||||
// 执行结果信息
|
||||
|
|
|
@ -38,11 +38,15 @@
|
|||
},
|
||||
watch: {},
|
||||
created() {
|
||||
if (this.scenario.id && this.scenario.referenced === 'REF') {
|
||||
if (this.scenario.id && this.scenario.referenced === 'REF' && !this.scenario.loaded) {
|
||||
this.result = this.$get("/api/automation/getApiScenario/" + this.scenario.id, response => {
|
||||
if (response.data) {
|
||||
this.scenario.loaded = true;
|
||||
if (response.data.scenarioDefinition) {
|
||||
this.scenario.hashTree = JSON.parse(response.data.scenarioDefinition).hashTree;
|
||||
}
|
||||
this.scenario.name = response.data.name;
|
||||
this.reload();
|
||||
this.$emit('refReload');
|
||||
} else {
|
||||
this.scenario.referenced = "Deleted";
|
||||
}
|
||||
|
@ -58,7 +62,7 @@
|
|||
},
|
||||
computed: {
|
||||
isDeletedOrRef() {
|
||||
if (this.scenario.referenced!= undefined && this.scenario.referenced === 'Deleted' || this.scenario.referenced === 'REF') {
|
||||
if (this.scenario.referenced != undefined && this.scenario.referenced === 'Deleted' || this.scenario.referenced === 'REF') {
|
||||
return true
|
||||
}
|
||||
return false;
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
<div class="request-form">
|
||||
<component :is="component" :scenario="scenario" :controller="scenario" :timer="scenario" :assertions="scenario" :extract="scenario" :jsr223-processor="scenario" :request="scenario" :currentScenario="currentScenario" :currentEnvironmentId="currentEnvironmentId" :node="node"
|
||||
:draggable="true" :title="title" :color="titleColor" :background-color="backgroundColor" @suggestClick="suggestClick(node)" :response="response"
|
||||
@remove="remove" @copyRow="copyRow"/>
|
||||
@remove="remove" @copyRow="copyRow" @refReload="refReload"/>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
|
@ -107,6 +107,9 @@
|
|||
suggestClick(node) {
|
||||
this.$emit('suggestClick', node);
|
||||
},
|
||||
refReload(){
|
||||
this.$emit('refReload');
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
|
|
@ -6,6 +6,26 @@
|
|||
@click="handleAddTaskModel">
|
||||
{{ $t('organization.message.create_new_notification') }}
|
||||
</el-button>
|
||||
<el-popover
|
||||
placement="right-end"
|
||||
title="示例"
|
||||
width="400"
|
||||
trigger="click"
|
||||
:content="title">
|
||||
<el-button icon="el-icon-warning" plain size="mini" slot="reference">
|
||||
{{ $t('organization.message.mail_template_example') }}
|
||||
</el-button>
|
||||
</el-popover>
|
||||
<el-popover
|
||||
placement="right-end"
|
||||
title="示例"
|
||||
width="400"
|
||||
trigger="click"
|
||||
:content="robotTitle">
|
||||
<el-button icon="el-icon-warning" plain size="mini" slot="reference">
|
||||
{{ $t('organization.message.robot_template') }}
|
||||
</el-button>
|
||||
</el-popover>
|
||||
</el-col>
|
||||
</el-row>
|
||||
<el-row>
|
||||
|
@ -134,7 +154,35 @@ export default {
|
|||
},
|
||||
data() {
|
||||
return {
|
||||
|
||||
title: '<!DOCTYPE html>\n' +
|
||||
'<html lang="en">\n' +
|
||||
'<head>\n' +
|
||||
' <meta charset="UTF-8">\n' +
|
||||
' <title>MeterSphere</title>\n' +
|
||||
'</head>\n' +
|
||||
'<body>\n' +
|
||||
'<div>\n' +
|
||||
' <div style="text-align: left">\n' +
|
||||
' <p>尊敬的用户:</p>\n' +
|
||||
' <p style="margin-left: 60px">您好:\n' +
|
||||
' </div>\n' +
|
||||
' <div style="margin-left: 100px">\n' +
|
||||
' <p>您所执行的 ${testName} 接口测试运行失败<br/>\n' +
|
||||
' 请点击下面链接进入测试报告页面</p>\n' +
|
||||
' <a href="${url}/#/${type}/report/view/${id}">${url}/#/${type}/report/view/${id}</a>\n' +
|
||||
' <p>新版接口测试报告路径</p>\n' +
|
||||
' <a href="${url}/#/api/automation">${url}/#/api/automation</a>\n' +
|
||||
' </div>\n' +
|
||||
'\n' +
|
||||
'</div>\n' +
|
||||
'</body>\n' +
|
||||
'</html>',
|
||||
robotTitle:
|
||||
"测试【任务通知】:'您所执行的 ${testName} ${type}测试运行${status}\n" +
|
||||
"请点击下面链接进入测试报告页面\n" +
|
||||
"${url}/#/${type}/report/view/${id}" +
|
||||
"新版接口测试报告路径\n" +
|
||||
"${url}/#/api/automation",
|
||||
scheduleTask: [{
|
||||
taskType: "scheduleTask",
|
||||
event: "",
|
||||
|
|
|
@ -227,7 +227,7 @@
|
|||
}); // 删除所有tab的 ctrl + s 监听
|
||||
let tabs = this.apiTabs;
|
||||
let index = tabs.findIndex(item => item.name === tab.name); // 找到当前选中tab的index
|
||||
if (index != -1) {
|
||||
if (index != -1 && this.$refs.apiConfig[index - 1]) {
|
||||
this.$refs.apiConfig[index - 1].addListener(); // 为选中tab添加 ctrl + s 监听(index-1的原因是要除去第一个固有tab)
|
||||
}
|
||||
}
|
||||
|
|
|
@ -33,6 +33,7 @@
|
|||
<i class="el-icon-edit" style="cursor:pointer" @click="showInput(apiCase)" v-tester/>
|
||||
</span>
|
||||
</span>
|
||||
|
||||
<div v-if="apiCase.id" style="color: #999999;font-size: 12px">
|
||||
<span>
|
||||
{{ apiCase.createTime | timestampFormatDate }}
|
||||
|
@ -46,26 +47,28 @@
|
|||
</el-col>
|
||||
|
||||
<el-col :span="4">
|
||||
<div class="tag-item">
|
||||
<div class="tag-item" @click.stop>
|
||||
<ms-input-tag :currentScenario="apiCase" ref="tag" @keyup.enter.native="saveTestCase(apiCase)"/>
|
||||
</div>
|
||||
</el-col>
|
||||
|
||||
<el-col :span="4">
|
||||
<ms-tip-button @click="singleRun(apiCase)" :tip="$t('api_test.run')" icon="el-icon-video-play"
|
||||
style="background-color: #409EFF;color: white" size="mini" :disabled="!apiCase.id" circle v-tester/>
|
||||
<ms-tip-button @click="copyCase(apiCase)" :tip="$t('commons.copy')" icon="el-icon-document-copy"
|
||||
size="mini" :disabled="!apiCase.id || isCaseEdit" circle v-tester/>
|
||||
<ms-tip-button @click="deleteCase(index,apiCase)" :tip="$t('commons.delete')" icon="el-icon-delete"
|
||||
size="mini" :disabled="!apiCase.id || isCaseEdit" circle v-tester/>
|
||||
<ms-api-extend-btns :is-case-edit="isCaseEdit" :environment="environment" :row="apiCase" v-tester/>
|
||||
<span @click.stop>
|
||||
<ms-tip-button @click="singleRun(apiCase)" :tip="$t('api_test.run')" icon="el-icon-video-play"
|
||||
style="background-color: #409EFF;color: white" size="mini" :disabled="!apiCase.id" circle v-tester/>
|
||||
<ms-tip-button @click="copyCase(apiCase)" :tip="$t('commons.copy')" icon="el-icon-document-copy"
|
||||
size="mini" :disabled="!apiCase.id || isCaseEdit" circle v-tester/>
|
||||
<ms-tip-button @click="deleteCase(index,apiCase)" :tip="$t('commons.delete')" icon="el-icon-delete"
|
||||
size="mini" :disabled="!apiCase.id || isCaseEdit" circle v-tester/>
|
||||
<ms-api-extend-btns :is-case-edit="isCaseEdit" :environment="environment" :row="apiCase" v-tester/>
|
||||
</span>
|
||||
</el-col>
|
||||
|
||||
<el-col :span="3">
|
||||
<el-link type="danger" v-if="apiCase.execResult && apiCase.execResult==='error'" @click="showExecResult(apiCase)">
|
||||
<el-link @click.stop type="danger" v-if="apiCase.execResult && apiCase.execResult==='error'" @click="showExecResult(apiCase)">
|
||||
{{ getResult(apiCase.execResult) }}
|
||||
</el-link>
|
||||
<el-link v-else-if="apiCase.execResult && apiCase.execResult==='success'" @click="showExecResult(apiCase)">
|
||||
<el-link @click.stop v-else-if="apiCase.execResult && apiCase.execResult==='success'" @click="showExecResult(apiCase)">
|
||||
{{ getResult(apiCase.execResult) }}
|
||||
</el-link>
|
||||
<div v-else> {{ getResult(apiCase.execResult) }}</div>
|
||||
|
|
|
@ -29,6 +29,8 @@
|
|||
<p class="tip">{{$t('api_test.definition.request.res_param')}} </p>
|
||||
<ms-request-result-tail :response="responseData" :currentProtocol="currentProtocol" ref="debugResult"/>
|
||||
|
||||
<ms-jmx-step :request="request" :response="responseData"/>
|
||||
|
||||
<!-- 执行组件 -->
|
||||
<ms-run :debug="true" :reportId="reportId" :run-data="runData" @runRefresh="runRefresh" ref="runTest"/>
|
||||
</el-card>
|
||||
|
@ -50,10 +52,12 @@
|
|||
import {REQ_METHOD} from "../../model/JsonData";
|
||||
import MsRequestResultTail from "../response/RequestResultTail";
|
||||
import TcpBasisParameters from "../request/tcp/TcpBasisParameters";
|
||||
import MsJmxStep from "../step/JmxStep";
|
||||
|
||||
export default {
|
||||
name: "ApiConfig",
|
||||
components: {
|
||||
MsJmxStep,
|
||||
TcpBasisParameters,
|
||||
MsRequestResultTail, MsResponseResult, MsApiRequestForm, MsRequestMetric, MsResponseText, MsRun},
|
||||
props: {
|
||||
|
|
|
@ -181,7 +181,7 @@ export default {
|
|||
methods: {
|
||||
scheduleEdit() {
|
||||
if (!this.formData.swaggerUrl) {
|
||||
this.$warning(this.$t('commons.please_upload'));
|
||||
this.$warning(this.$t('commons.please_fill_path'));
|
||||
this.swaggerSynchronization = !this.swaggerSynchronization
|
||||
} else {
|
||||
if (this.swaggerSynchronization) {
|
||||
|
|
|
@ -469,7 +469,10 @@ export default {
|
|||
return ids;
|
||||
},
|
||||
showCaseRef(row) {
|
||||
this.$refs.viewRef.open(row);
|
||||
let param = {};
|
||||
Object.assign(param, row);
|
||||
param.moduleId = undefined;
|
||||
this.$refs.viewRef.open(param);
|
||||
},
|
||||
showEnvironment(row) {
|
||||
|
||||
|
|
|
@ -5,14 +5,9 @@
|
|||
</el-link>
|
||||
<el-dropdown-menu slot="dropdown">
|
||||
<el-dropdown-item command="ref">{{ $t('api_test.automation.view_ref') }}</el-dropdown-item>
|
||||
<!-- <el-dropdown-item :disabled="isCaseEdit" command="add_plan">{{ $t('api_test.automation.batch_add_plan') }}</el-dropdown-item>-->
|
||||
<el-dropdown-item :disabled="isCaseEdit" command="create_performance">{{ $t('api_test.create_performance_test') }}</el-dropdown-item>
|
||||
</el-dropdown-menu>
|
||||
<ms-reference-view ref="viewRef"/>
|
||||
<!--测试计划-->
|
||||
<el-drawer :visible.sync="planVisible" :destroy-on-close="true" direction="ltr" :withHeader="false" :title="$t('test_track.plan_view.test_result')" :modal="false" size="90%">
|
||||
<ms-test-plan-list @addTestPlan="addTestPlan"/>
|
||||
</el-drawer>
|
||||
</el-dropdown>
|
||||
</template>
|
||||
|
||||
|
@ -36,7 +31,6 @@
|
|||
planVisible: false,
|
||||
}
|
||||
},
|
||||
|
||||
methods: {
|
||||
handleCommand(cmd) {
|
||||
if (this.row.id) {
|
||||
|
@ -44,9 +38,6 @@
|
|||
case "ref":
|
||||
this.$refs.viewRef.open(this.row);
|
||||
break;
|
||||
case "add_plan":
|
||||
this.addCaseToPlan();
|
||||
break;
|
||||
case "create_performance":
|
||||
this.createPerformance(this.row);
|
||||
break;
|
||||
|
@ -113,16 +104,6 @@
|
|||
this.$emit('runRefresh', {});
|
||||
});
|
||||
|
||||
},
|
||||
addCaseToPlan() {
|
||||
this.planVisible = true;
|
||||
},
|
||||
addTestPlan(plans) {
|
||||
let obj = {planIds: plans, apiIds: [this.row.id]};
|
||||
this.planVisible = false;
|
||||
this.$post("/api/automation/scenario/plan", obj, response => {
|
||||
this.$success(this.$t("commons.save_success"));
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -116,7 +116,7 @@
|
|||
}
|
||||
|
||||
.search-bar {
|
||||
width: 200px
|
||||
width: 240px
|
||||
}
|
||||
|
||||
</style>
|
||||
|
|
|
@ -6,6 +6,26 @@
|
|||
<el-button icon="el-icon-circle-plus-outline" plain size="mini" @click="handleAddTaskModel">
|
||||
{{ $t('organization.message.create_new_notification') }}
|
||||
</el-button>
|
||||
<el-popover
|
||||
placement="right-end"
|
||||
title="示例"
|
||||
width="400"
|
||||
trigger="click"
|
||||
:content="title">
|
||||
<el-button icon="el-icon-warning" plain size="mini" slot="reference">
|
||||
{{ $t('organization.message.mail_template_example') }}
|
||||
</el-button>
|
||||
</el-popover>
|
||||
<el-popover
|
||||
placement="right-end"
|
||||
title="示例"
|
||||
width="400"
|
||||
trigger="click"
|
||||
:content="robotTitle">
|
||||
<el-button icon="el-icon-warning" plain size="mini" slot="reference">
|
||||
{{ $t('organization.message.robot_template') }}
|
||||
</el-button>
|
||||
</el-popover>
|
||||
</el-col>
|
||||
</el-row>
|
||||
<el-row>
|
||||
|
@ -129,6 +149,19 @@ export default {
|
|||
},
|
||||
data() {
|
||||
return {
|
||||
title: "<!DOCTYPE html>\n" +
|
||||
"<html lang=\"en\">\n" +
|
||||
"<head>\n" +
|
||||
" <meta charset=\"UTF-8\">\n" +
|
||||
" <title>MeterSphere</title>\n" +
|
||||
"</head>\n" +
|
||||
"<body>\n" +
|
||||
"<div>\n" +
|
||||
" <p>${creator}发起了一个缺陷:${issuesName},请跟进</p>\n" +
|
||||
"</div>\n" +
|
||||
"</body>\n" +
|
||||
"</html>",
|
||||
robotTitle: "【任务通知】:${creator}发起了一个缺陷:${issuesName},请跟进",
|
||||
defectTask: [{
|
||||
taskType: "defectTask",
|
||||
event: "",
|
||||
|
|
|
@ -6,6 +6,28 @@
|
|||
<el-button icon="el-icon-circle-plus-outline" plain size="mini" @click="handleAddTaskModel">
|
||||
{{ $t('organization.message.create_new_notification') }}
|
||||
</el-button>
|
||||
<el-popover
|
||||
placement="right-end"
|
||||
title="示例"
|
||||
width="400"
|
||||
trigger="click"
|
||||
:content="title">
|
||||
<el-button icon="el-icon-warning" plain size="mini" slot="reference">
|
||||
{{ $t('organization.message.mail_template_example') }}
|
||||
</el-button>
|
||||
</el-popover>
|
||||
<el-popover
|
||||
placement="right-end"
|
||||
title="示例"
|
||||
width="400"
|
||||
trigger="click"
|
||||
:content="robotTitle">
|
||||
<el-button icon="el-icon-warning" plain size="mini" slot="reference">
|
||||
{{ $t('organization.message.robot_template') }}
|
||||
</el-button>
|
||||
</el-popover>
|
||||
|
||||
|
||||
</el-col>
|
||||
</el-row>
|
||||
<el-row>
|
||||
|
@ -132,6 +154,35 @@ export default {
|
|||
},
|
||||
data() {
|
||||
return {
|
||||
title: '<!DOCTYPE html>\n' +
|
||||
'<html lang="en">\n' +
|
||||
'<head>\n' +
|
||||
' <meta charset="UTF-8">\n' +
|
||||
' <title>MeterSphere</title>\n' +
|
||||
'</head>\n' +
|
||||
'<body>\n' +
|
||||
'<div>\n' +
|
||||
' <div style="text-align: left">\n' +
|
||||
' <p>尊敬的用户:</p>\n' +
|
||||
' <p style="margin-left: 60px">您好:\n' +
|
||||
' </div>\n' +
|
||||
' <div style="margin-left: 100px">\n' +
|
||||
' <p>您所执行的 ${testName} 接口测试运行失败<br/>\n' +
|
||||
' 请点击下面链接进入测试报告页面</p>\n' +
|
||||
' <a href="${url}/#/${type}/report/view/${id}">${url}/#/${type}/report/view/${id}</a>\n' +
|
||||
' <p>新版接口测试报告路径</p>\n' +
|
||||
' <a href="${url}/#/api/automation">${url}/#/api/automation</a>\n' +
|
||||
' </div>\n' +
|
||||
'\n' +
|
||||
'</div>\n' +
|
||||
'</body>\n' +
|
||||
'</html>',
|
||||
robotTitle:
|
||||
"测试【任务通知】:'您所执行的 ${testName} ${type}测试运行${status}\n" +
|
||||
"请点击下面链接进入测试报告页面\n" +
|
||||
"${url}/#/${type}/report/view/${id}" +
|
||||
"新版接口测试报告路径\n" +
|
||||
"${url}/#/api/automation",
|
||||
jenkinsTask: [{
|
||||
taskType: "jenkinsTask",
|
||||
event: "",
|
||||
|
|
|
@ -6,6 +6,26 @@
|
|||
@click="handleAddTaskModel">
|
||||
{{ $t('organization.message.create_new_notification') }}
|
||||
</el-button>
|
||||
<el-popover
|
||||
placement="right-end"
|
||||
title="示例"
|
||||
width="400"
|
||||
trigger="click"
|
||||
:content="title">
|
||||
<el-button icon="el-icon-warning" plain size="mini" slot="reference">
|
||||
{{ $t('organization.message.mail_template_example') }}
|
||||
</el-button>
|
||||
</el-popover>
|
||||
<el-popover
|
||||
placement="right-end"
|
||||
title="示例"
|
||||
width="400"
|
||||
trigger="click"
|
||||
:content="robotTitle">
|
||||
<el-button icon="el-icon-warning" plain size="mini" slot="reference">
|
||||
{{ $t('organization.message.robot_template') }}
|
||||
</el-button>
|
||||
</el-popover>
|
||||
</el-col>
|
||||
</el-row>
|
||||
<el-row>
|
||||
|
@ -135,7 +155,35 @@ export default {
|
|||
},
|
||||
data() {
|
||||
return {
|
||||
|
||||
title: '<!DOCTYPE html>\n' +
|
||||
'<html lang="en">\n' +
|
||||
'<head>\n' +
|
||||
' <meta charset="UTF-8">\n' +
|
||||
' <title>MeterSphere</title>\n' +
|
||||
'</head>\n' +
|
||||
'<body>\n' +
|
||||
'<div>\n' +
|
||||
' <div style="text-align: left">\n' +
|
||||
' <p>尊敬的用户:</p>\n' +
|
||||
' <p style="margin-left: 60px">您好:\n' +
|
||||
' </div>\n' +
|
||||
' <div style="margin-left: 100px">\n' +
|
||||
' <p>您所执行的 ${testName} 接口测试运行失败<br/>\n' +
|
||||
' 请点击下面链接进入测试报告页面</p>\n' +
|
||||
' <a href="${url}/#/${type}/report/view/${id}">${url}/#/${type}/report/view/${id}</a>\n' +
|
||||
' <p>新版接口测试报告路径</p>\n' +
|
||||
' <a href="${url}/#/api/automation">${url}/#/api/automation</a>\n' +
|
||||
' </div>\n' +
|
||||
'\n' +
|
||||
'</div>\n' +
|
||||
'</body>\n' +
|
||||
'</html>',
|
||||
robotTitle:
|
||||
"测试【任务通知】:'您所执行的 ${testName} ${type}测试运行${status}\n" +
|
||||
"请点击下面链接进入测试报告页面\n" +
|
||||
"${url}/#/${type}/report/view/${id}" +
|
||||
"新版接口测试报告路径\n" +
|
||||
"${url}/#/api/automation",
|
||||
scheduleTask: [{
|
||||
taskType: "scheduleTask",
|
||||
event: "",
|
||||
|
|
|
@ -6,6 +6,26 @@
|
|||
<el-button icon="el-icon-circle-plus-outline" plain size="mini" @click="handleAddTaskModel">
|
||||
{{ $t('organization.message.create_new_notification') }}
|
||||
</el-button>
|
||||
<el-popover
|
||||
placement="right-end"
|
||||
title="示例"
|
||||
width="400"
|
||||
trigger="click"
|
||||
:content="title">
|
||||
<el-button icon="el-icon-warning" plain size="mini" slot="reference">
|
||||
{{ $t('organization.message.mail_template_example') }}
|
||||
</el-button>
|
||||
</el-popover>
|
||||
<el-popover
|
||||
placement="right-end"
|
||||
title="示例"
|
||||
width="400"
|
||||
trigger="click"
|
||||
:content="robotTitle">
|
||||
<el-button icon="el-icon-warning" plain size="mini" slot="reference">
|
||||
{{ $t('organization.message.robot_template') }}
|
||||
</el-button>
|
||||
</el-popover>
|
||||
</el-col>
|
||||
</el-row>
|
||||
<el-row>
|
||||
|
@ -130,6 +150,27 @@ export default {
|
|||
},
|
||||
data() {
|
||||
return {
|
||||
title: "<!DOCTYPE html>\n" +
|
||||
"<html lang=\"en\">\n" +
|
||||
"<head>\n" +
|
||||
" <meta charset=\"UTF-8\">\n" +
|
||||
" <title>MeterSphere</title>\n" +
|
||||
"</head>\n" +
|
||||
"<body>\n" +
|
||||
"<div>\n" +
|
||||
" <p style=\"text-align: left\">${creator} 创建的:<br>\n" +
|
||||
" ${testPlanName}<br>\n" +
|
||||
" 计划开始时间是:${start}<br>\n" +
|
||||
" 计划结束时间为:${end}<br>\n" +
|
||||
" 请跟进!<br>\n" +
|
||||
" 点击下面链接进入测试计划页面</p>\n" +
|
||||
" <a href=\"${url}/#/track/plan/all\">${url}/#/track/plan/all</a>\n" +
|
||||
"</div>\n" +
|
||||
"</body>\n" +
|
||||
"</html>",
|
||||
robotTitle:
|
||||
" 【任务通知】:${creator} 创建的:${testPlanName}计划开始时间是:${start}计划结束时间是:${end}请跟进!/ ${status}!" +
|
||||
"点击下面链接进入测试计划页面${url}/#/track/plan/all",
|
||||
testCasePlanTask: [{
|
||||
taskType: "testPlanTask",
|
||||
event: "",
|
||||
|
|
|
@ -6,6 +6,26 @@
|
|||
<el-button icon="el-icon-circle-plus-outline" plain size="mini" @click="handleAddTaskModel">
|
||||
{{ $t('organization.message.create_new_notification') }}
|
||||
</el-button>
|
||||
<el-popover
|
||||
placement="right-end"
|
||||
title="示例"
|
||||
width="400"
|
||||
trigger="click"
|
||||
:content="title">
|
||||
<el-button icon="el-icon-warning" plain size="mini" slot="reference">
|
||||
{{ $t('organization.message.mail_template_example') }}
|
||||
</el-button>
|
||||
</el-popover>
|
||||
<el-popover
|
||||
placement="right-end"
|
||||
title="示例"
|
||||
width="400"
|
||||
trigger="click"
|
||||
:content="robotTitle">
|
||||
<el-button icon="el-icon-warning" plain size="mini" slot="reference">
|
||||
{{ $t('organization.message.robot_template') }}
|
||||
</el-button>
|
||||
</el-popover>
|
||||
</el-col>
|
||||
</el-row>
|
||||
<el-row>
|
||||
|
@ -130,6 +150,26 @@ export default {
|
|||
},
|
||||
data() {
|
||||
return {
|
||||
title: "<!DOCTYPE html>\n" +
|
||||
"<html lang=\"en\">\n" +
|
||||
"<head>\n" +
|
||||
" <meta charset=\"UTF-8\">\n" +
|
||||
" <title>MeterSphere</title>\n" +
|
||||
"</head>\n" +
|
||||
"<body>\n" +
|
||||
"<div>\n" +
|
||||
" <p style=\"text-align: left\">${creator} 创建的:<br>\n" +
|
||||
" ${reviewName}待开始<br>\n" +
|
||||
" 计划开始时间是:${start}<br>\n" +
|
||||
" 计划结束时间为:${end}<br>\n" +
|
||||
" 请跟进!/${status}<br>\n" +
|
||||
" 点击下面链接进入评审页面进行审核</p>\n" +
|
||||
" <a href=\"${url}/#/track/review/view/${id}\">${url}/#/track/review/view/${id}</a>\n" +
|
||||
"</div>\n" +
|
||||
"</body>\n" +
|
||||
"</html>",
|
||||
robotTitle: "【任务通知】:${creator} 创建的:${reviewName}待开始,计划开始时间是:${start}," +
|
||||
"计划结束时间是:${end}请跟进!/ ${status}!点击下面链接进入测试评审页面${url}/#/track/review/view/${id}",
|
||||
reviewTask: [{
|
||||
taskType: "reviewTask",
|
||||
event: "",
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
<template>
|
||||
<div class="batch-move" v-loading="result.loading">
|
||||
<div v-if="dialogVisible" class="batch-move" v-loading="result.loading">
|
||||
<el-dialog :title="this.$t('test_track.case.select_catalog')"
|
||||
:visible.sync="dialogVisible"
|
||||
:before-close="close"
|
||||
|
@ -25,15 +25,15 @@
|
|||
</span>
|
||||
<span class="node-title">{{node.label}}</span>
|
||||
</span>
|
||||
</template>
|
||||
</el-tree>
|
||||
</div>
|
||||
<template v-slot:footer>
|
||||
<ms-dialog-footer
|
||||
@cancel="close"
|
||||
@confirm="save"/>
|
||||
</template>
|
||||
</el-dialog>
|
||||
</template>
|
||||
</el-tree>
|
||||
</div>
|
||||
<template v-slot:footer>
|
||||
<ms-dialog-footer
|
||||
@cancel="close"
|
||||
@confirm="save"/>
|
||||
</template>
|
||||
</el-dialog>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
:condition="condition"
|
||||
@search="$emit('refresh')"
|
||||
:show-create="false"
|
||||
:tip="$t('commons.search_by_name_or_id')">
|
||||
:tip="$t('commons.search_by_id_name_tag')">
|
||||
<template v-slot:title>
|
||||
接口用例
|
||||
</template>
|
||||
|
|
|
@ -257,9 +257,10 @@
|
|||
<el-table-column prop="description" :label="$t('test_track.issue.description')">
|
||||
<template v-slot:default="scope">
|
||||
<el-popover
|
||||
placement="left"
|
||||
width="400"
|
||||
placement="right"
|
||||
width="500"
|
||||
trigger="hover"
|
||||
popper-class="issues-popover"
|
||||
>
|
||||
<ckeditor :editor="editor" disabled :config="readConfig"
|
||||
v-model="scope.row.description"/>
|
||||
|
@ -748,3 +749,10 @@ p {
|
|||
z-index: 999;
|
||||
}
|
||||
</style>
|
||||
|
||||
<style>
|
||||
.issues-popover {
|
||||
height: 550px;
|
||||
overflow: auto;
|
||||
}
|
||||
</style>
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
<el-card class="card-content" v-loading="result.loading">
|
||||
<template v-slot:header>
|
||||
<ms-table-header :is-tester-permission="true" :condition.sync="condition" @search="initTableData"
|
||||
:show-create="false" :tip="$t('commons.search_by_name_or_id')">
|
||||
:show-create="false" :tip="$t('commons.search_by_id_name_tag')">
|
||||
<template v-slot:title>
|
||||
<node-breadcrumb class="table-title" :nodes="selectParentNodes" @refresh="breadcrumbRefresh"/>
|
||||
</template>
|
||||
|
|
|
@ -71,7 +71,8 @@ export default {
|
|||
not_filled: 'Not filled',
|
||||
please_select: 'Please select',
|
||||
search_by_name: 'Search by name',
|
||||
search_by_name_or_id: 'Search by name or id',
|
||||
search_by_name_or_id: 'Search by ID/NAME',
|
||||
search_by_id_name_tag: 'Search by ID/NAME/TAG',
|
||||
personal_information: 'Personal Information',
|
||||
exit_system: 'Exit System',
|
||||
verification: 'Verification',
|
||||
|
@ -123,6 +124,7 @@ export default {
|
|||
required: "{0} is required",
|
||||
millisecond: 'ms',
|
||||
please_upload: 'Please upload file',
|
||||
please_fill_path: 'Please fill in the path',
|
||||
reference_documentation: "Reference documentation",
|
||||
already_exists: 'The name already exists',
|
||||
modifier: 'Modifier',
|
||||
|
@ -250,6 +252,8 @@ export default {
|
|||
test_review_task_notice: 'Test review task notice',
|
||||
defect_task_notification: 'Defect task notification',
|
||||
create_new_notification: 'Create a new notification',
|
||||
mail_template_example: 'Mail template',
|
||||
robot_template: 'Robot template',
|
||||
select_events: 'Select event',
|
||||
select_receiving_method: 'Select receiving method',
|
||||
mail: 'mail',
|
||||
|
|
|
@ -72,7 +72,8 @@ export default {
|
|||
not_filled: '未填写',
|
||||
please_select: '请选择',
|
||||
search_by_name: '根据名称搜索',
|
||||
search_by_name_or_id: '根据ID或名称搜索',
|
||||
search_by_name_or_id: '根据 ID/名称 搜索',
|
||||
search_by_id_name_tag: '根据 ID/名称/标签 搜索',
|
||||
personal_information: '个人信息',
|
||||
exit_system: '退出系统',
|
||||
verification: '验证',
|
||||
|
@ -118,6 +119,7 @@ export default {
|
|||
input_login_username: '请输入用户 ID 或 邮箱',
|
||||
input_name: '请输入名称',
|
||||
please_upload: '请上传文件',
|
||||
please_fill_path: '请填写ur路径',
|
||||
formatErr: '格式错误',
|
||||
please_save: '请先保存',
|
||||
reference_documentation: "参考文档",
|
||||
|
@ -251,6 +253,8 @@ export default {
|
|||
test_plan_task_notification: '测试计划任务通知',
|
||||
test_review_task_notice: '测试评审任务通知',
|
||||
create_new_notification: '创建新通知',
|
||||
mail_template_example: '邮件模版',
|
||||
robot_template: '机器人模版',
|
||||
select_events: '选择事件',
|
||||
defect_task_notification: '缺陷任务通知',
|
||||
select_receiving_method: '选择接收方式',
|
||||
|
|
|
@ -72,7 +72,8 @@ export default {
|
|||
not_filled: '未填寫',
|
||||
please_select: '請選擇',
|
||||
search_by_name: '根據名稱搜索',
|
||||
search_by_name_or_id: '根據ID或名稱搜索',
|
||||
search_by_name_or_id: '根據 ID/名稱 搜索',
|
||||
search_by_id_name_tag: '根據 ID/名稱/標籤 搜索',
|
||||
personal_information: '個人信息',
|
||||
exit_system: '退出系統',
|
||||
verification: '驗證',
|
||||
|
@ -118,6 +119,7 @@ export default {
|
|||
input_login_username: '請輸入用戶 ID 或 郵箱',
|
||||
input_name: '請輸入名稱',
|
||||
please_upload: '請上傳文件',
|
||||
please_fill_path: '請填寫ur路徑',
|
||||
formatErr: '格式錯誤',
|
||||
please_save: '請先保存',
|
||||
reference_documentation: "參考文檔",
|
||||
|
@ -251,6 +253,8 @@ export default {
|
|||
test_plan_task_notification: '測試計劃任務通知',
|
||||
test_review_task_notice: '測試評審任務通知',
|
||||
create_new_notification: '創建新通知',
|
||||
mail_template_example: '郵件範本示例',
|
||||
robot_template: '機器人模版',
|
||||
select_events: '選擇事件',
|
||||
defect_task_notification: '缺陷任務通知',
|
||||
select_receiving_method: '選擇接收方式',
|
||||
|
|
Loading…
Reference in New Issue