Merge remote-tracking branch 'origin/master'
This commit is contained in:
commit
bccc68b841
|
@ -193,6 +193,8 @@ public class ApiDefinitionExecResultService {
|
|||
planRequest.setScenarioId(item.getTestCaseID());
|
||||
} else if ("apiCase".equals(item.getCaseType())) {
|
||||
planRequest.setApiId(item.getTestCaseID());
|
||||
} else if ("load".equals(item.getCaseType())) {
|
||||
planRequest.setLoadId(item.getTestCaseID());
|
||||
}
|
||||
List<TestPlanDTO> dtoList = testPlanService.selectTestPlanByRelevancy(planRequest);
|
||||
item.setTestPlanDTOList(dtoList);
|
||||
|
|
|
@ -63,6 +63,18 @@
|
|||
WHERE report.project_id = #{projectId}
|
||||
AND ( report.STATUS = 'Error' OR report.STATUS = 'Fail' ) AND report.create_time >= #{startTimestamp}
|
||||
GROUP BY scene.id
|
||||
UNION
|
||||
SELECT ltr.test_id as testCaseID, ltr.name as caseName,tplt.testPlanName AS testPlan, count(ltr.id) as failureTimes, 'load' as caseType FROM load_test_report ltr
|
||||
join load_test on load_test.id = ltr.test_id
|
||||
JOIN (
|
||||
select tplc.load_case_id, group_concat(tp.`name`) AS testPlanName, tp.project_id
|
||||
from test_plan_load_case tplc
|
||||
join test_plan tp on tp.id = tplc.test_plan_id
|
||||
GROUP BY tplc.load_case_id
|
||||
) tplt on tplt.load_case_id = ltr.test_id
|
||||
WHERE load_test.project_id = #{projectId}
|
||||
AND ltr.STATUS = 'Error' and ltr.trigger_mode = 'TEST_PLAN_SCHEDULE' AND ltr.create_time >= #{startTimestamp}
|
||||
GROUP BY load_test.id
|
||||
) showTable
|
||||
ORDER BY showTable.failureTimes DESC
|
||||
</select>
|
||||
|
|
|
@ -223,6 +223,9 @@
|
|||
<if test="request.apiId != null">
|
||||
AND p.id IN (SELECT test_plan_id FROM test_plan_api_case WHERE api_case_id = #{request.apiId})
|
||||
</if>
|
||||
<if test="request.loadId != null">
|
||||
AND p.id IN (SELECT test_plan_id FROM test_plan_load_case WHERE load_case_id = #{request.loadId})
|
||||
</if>
|
||||
</where>
|
||||
</select>
|
||||
<select id="findTestProjectNameByTestPlanID" resultType="java.lang.String">
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
package io.metersphere.track.issue;
|
||||
|
||||
import com.alibaba.fastjson.JSON;
|
||||
import com.alibaba.fastjson.JSONArray;
|
||||
import com.alibaba.fastjson.JSONObject;
|
||||
import io.metersphere.base.domain.*;
|
||||
import io.metersphere.commons.constants.IssuesManagePlatform;
|
||||
|
@ -81,7 +82,55 @@ public class JiraPlatform extends AbstractIssuePlatform {
|
|||
|
||||
@Override
|
||||
public List<DemandDTO> getDemandList(String projectId) {
|
||||
return null;
|
||||
List<DemandDTO> list = new ArrayList<>();
|
||||
|
||||
try {
|
||||
String key = this.getProjectId(projectId);
|
||||
if (StringUtils.isBlank(key)) {
|
||||
MSException.throwException("未关联Jira 项目Key");
|
||||
}
|
||||
String config = getPlatformConfig(IssuesManagePlatform.Jira.toString());
|
||||
JSONObject object = JSON.parseObject(config);
|
||||
|
||||
if (object == null) {
|
||||
MSException.throwException("jira config is null");
|
||||
}
|
||||
|
||||
String account = object.getString("account");
|
||||
String password = object.getString("password");
|
||||
String url = object.getString("url");
|
||||
String type = object.getString("storytype");
|
||||
String auth = EncryptUtils.base64Encoding(account + ":" + password);
|
||||
HttpHeaders requestHeaders = new HttpHeaders();
|
||||
requestHeaders.add("Authorization", "Basic " + auth);
|
||||
requestHeaders.setContentType(org.springframework.http.MediaType.APPLICATION_JSON);
|
||||
//HttpEntity
|
||||
HttpEntity<String> requestEntity = new HttpEntity<>(requestHeaders);
|
||||
RestTemplate restTemplate = new RestTemplate();
|
||||
//post
|
||||
ResponseEntity<String> responseEntity = null;
|
||||
responseEntity = restTemplate.exchange(url + "/rest/api/2/search?jql=project="+key+"+AND+issuetype="+type+"&fields=summary,issuetype",
|
||||
HttpMethod.GET, requestEntity, String.class);
|
||||
String body = responseEntity.getBody();
|
||||
JSONObject jsonObject = JSONObject.parseObject(body);
|
||||
JSONArray jsonArray = jsonObject.getJSONArray("issues");
|
||||
for (int i = 0; i < jsonArray.size(); i++) {
|
||||
JSONObject o = jsonArray.getJSONObject(i);
|
||||
String issueKey = o.getString("key");
|
||||
JSONObject fields = o.getJSONObject("fields");
|
||||
String summary = fields.getString("summary");
|
||||
DemandDTO demandDTO = new DemandDTO();
|
||||
demandDTO.setName(summary);
|
||||
demandDTO.setId(issueKey);
|
||||
demandDTO.setPlatform(IssuesManagePlatform.Jira.name());
|
||||
list.add(demandDTO);
|
||||
}
|
||||
} catch (Exception e) {
|
||||
LogUtil.error(e.getMessage(), e);
|
||||
MSException.throwException("调用Jira查询需求失败");
|
||||
}
|
||||
|
||||
return list;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -20,6 +20,8 @@ public class QueryTestPlanRequest extends TestPlan {
|
|||
|
||||
private String apiId;
|
||||
|
||||
private String loadId;
|
||||
|
||||
private List<OrderRequest> orders;
|
||||
|
||||
private Map<String, List<String>> filters;
|
||||
|
|
|
@ -23,6 +23,7 @@
|
|||
<template v-slot:default="scope">
|
||||
<ms-tag v-if="scope.row.caseType == 'apiCase'" type="success" effect="plain" :content="$t('api_test.home_page.failed_case_list.table_value.case_type.api')"/>
|
||||
<ms-tag v-if="scope.row.caseType == 'scenario'" type="warning" effect="plain" :content="$t('api_test.home_page.failed_case_list.table_value.case_type.scene')"/>
|
||||
<ms-tag v-if="scope.row.caseType == 'load'" type="danger" effect="plain" :content="$t('api_test.home_page.failed_case_list.table_value.case_type.load')"/>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column prop="testPlan" :label="$t('api_test.home_page.failed_case_list.table_coloum.test_plan')">
|
||||
|
|
|
@ -16,6 +16,9 @@
|
|||
<el-form-item :label="$t('organization.integration.jira_issuetype')" prop="issuetype">
|
||||
<el-input v-model="form.issuetype" :placeholder="$t('organization.integration.input_jira_issuetype')"/>
|
||||
</el-form-item>
|
||||
<el-form-item :label="$t('organization.integration.jira_storytype')" prop="storytype">
|
||||
<el-input v-model="form.storytype" :placeholder="$t('organization.integration.input_jira_storytype')"/>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
</div>
|
||||
|
||||
|
@ -79,6 +82,11 @@ export default {
|
|||
required: true,
|
||||
message: this.$t('organization.integration.input_jira_issuetype'),
|
||||
trigger: ['change', 'blur']
|
||||
},
|
||||
storytype: {
|
||||
required: true,
|
||||
message: this.$t('organization.integration.input_jira_storytype'),
|
||||
trigger: ['change', 'blur']
|
||||
}
|
||||
},
|
||||
}
|
||||
|
@ -97,6 +105,7 @@ export default {
|
|||
this.$set(this.form, 'password', config.password);
|
||||
this.$set(this.form, 'url', config.url);
|
||||
this.$set(this.form, 'issuetype', config.issuetype);
|
||||
this.$set(this.form, 'storytype', config.storytype);
|
||||
} else {
|
||||
this.clear();
|
||||
}
|
||||
|
@ -114,7 +123,8 @@ export default {
|
|||
account: this.form.account,
|
||||
password: this.form.password,
|
||||
url: formatUrl,
|
||||
issuetype: this.form.issuetype
|
||||
issuetype: this.form.issuetype,
|
||||
storytype: this.form.storytype
|
||||
};
|
||||
const {lastOrganizationId} = getCurrentUser();
|
||||
param.organizationId = lastOrganizationId;
|
||||
|
@ -139,6 +149,7 @@ export default {
|
|||
this.$set(this.form, 'password', '');
|
||||
this.$set(this.form, 'url', '');
|
||||
this.$set(this.form, 'issuetype', '');
|
||||
this.$set(this.form, 'storytype', '');
|
||||
this.$nextTick(() => {
|
||||
this.$refs.form.clearValidate();
|
||||
});
|
||||
|
|
|
@ -775,6 +775,7 @@ export default {
|
|||
this.demandOptions.unshift({id: 'other', name: this.$t('test_track.case.other'), platform: 'Other'})
|
||||
this.result = {loading : false};
|
||||
}).catch(() => {
|
||||
this.demandOptions.unshift({id: 'other', name: this.$t('test_track.case.other'), platform: 'Other'})
|
||||
this.result = {loading : false};
|
||||
})
|
||||
}
|
||||
|
|
|
@ -1 +1 @@
|
|||
Subproject commit 06b31ddd4f2542cb86bf3e31a1a8f624742a2193
|
||||
Subproject commit f13fe5c9e5fe0bc527503c70d735163ea7e60665
|
|
@ -314,11 +314,13 @@ export default {
|
|||
account: 'Account',
|
||||
password: 'Password',
|
||||
jira_url: 'JIRA url',
|
||||
jira_issuetype: 'JIRA issuetype',
|
||||
jira_issuetype: 'JIRA issue type',
|
||||
jira_storytype: 'JIRA story type',
|
||||
input_api_account: 'please enter account',
|
||||
input_api_password: 'Please enter password',
|
||||
input_jira_url: 'Please enter Jira address, for example: https://metersphere.atlassian.net/',
|
||||
input_jira_issuetype: 'Please enter the question type',
|
||||
input_jira_issuetype: 'Please enter the issue type',
|
||||
input_jira_storytype: 'Please enter the story type',
|
||||
zentao_url: 'Zentao url',
|
||||
input_zentao_url: 'Please enter Zentao address, for example: http://xx.xx.xx.xx/zentao/',
|
||||
use_tip: 'Usage guidelines:',
|
||||
|
@ -1033,6 +1035,7 @@ export default {
|
|||
case_type: {
|
||||
api: "Api case",
|
||||
scene: "Scenario case",
|
||||
load: "Load case"
|
||||
}
|
||||
}
|
||||
},
|
||||
|
|
|
@ -313,10 +313,12 @@ export default {
|
|||
password: '密码',
|
||||
jira_url: 'JIRA 地址',
|
||||
jira_issuetype: '问题类型',
|
||||
jira_storytype: '需求类型',
|
||||
input_api_account: '请输入账号',
|
||||
input_api_password: '请输入密码',
|
||||
input_jira_url: '请输入Jira地址,例:https://metersphere.atlassian.net/',
|
||||
input_jira_issuetype: '请输入问题类型',
|
||||
input_jira_storytype: '请输入需求类型',
|
||||
zentao_url: 'Zentao 地址',
|
||||
input_zentao_url: '请输入Zentao地址,例:http://xx.xx.xx.xx/zentao/',
|
||||
use_tip: '使用指引:',
|
||||
|
@ -1037,6 +1039,7 @@ export default {
|
|||
case_type: {
|
||||
api: "接口用例",
|
||||
scene: "场景用例",
|
||||
load: "性能用例"
|
||||
}
|
||||
}
|
||||
},
|
||||
|
|
|
@ -313,10 +313,12 @@ export default {
|
|||
password: '密碼',
|
||||
jira_url: 'JIRA 地址',
|
||||
jira_issuetype: '問題類型',
|
||||
jira_storytype: '需求類型',
|
||||
input_api_account: '請輸入賬號',
|
||||
input_api_password: '請輸入密碼',
|
||||
input_jira_url: '請輸入Jira地址,例:https://metersphere.atlassian.net/',
|
||||
input_jira_issuetype: '請輸入問題類型',
|
||||
input_jira_storytype: '請輸入需求類型',
|
||||
zentao_url: 'Zentao 地址',
|
||||
input_zentao_url: '請輸入Zentao地址,例:http://xx.xx.xx.xx/zentao/',
|
||||
use_tip: '使用指引:',
|
||||
|
@ -1035,6 +1037,7 @@ export default {
|
|||
case_type: {
|
||||
api: "接口用例",
|
||||
scene: "場景用例",
|
||||
load: "性能用例"
|
||||
}
|
||||
}
|
||||
},
|
||||
|
|
Loading…
Reference in New Issue