refactor: 场景列表新增运行环境列

--story=1003532 --user=lyh 6.单接口用例列表和场景列表新增 运行环境 参考测试计划列表的运行环境展示
https://www.tapd.cn/55049933/s/1061128
This commit is contained in:
shiziyuan9527 2021-10-22 12:01:37 +08:00 committed by shiziyuan9527
parent e425f70f98
commit db13c7e8b9
9 changed files with 132 additions and 2 deletions

View File

@ -47,7 +47,8 @@ public class ApiAutomationController {
@RequiresPermissions("PROJECT_API_SCENARIO:READ")
public Pager<List<ApiScenarioDTO>> list(@PathVariable int goPage, @PathVariable int pageSize, @RequestBody ApiScenarioRequest request) {
Page<Object> page = PageHelper.startPage(goPage, pageSize, true);
// 查询场景环境
request.setSelectEnvironment(true);
return PageUtils.setPageInfo(page, apiAutomationService.list(request));
}
@ -367,5 +368,6 @@ public class ApiAutomationController {
public List<String> getFollows(@PathVariable String scenarioId) {
return apiAutomationService.getFollows(scenarioId);
}
}

View File

@ -5,6 +5,7 @@ import lombok.Getter;
import lombok.Setter;
import java.util.List;
import java.util.Map;
@Getter
@Setter
@ -24,4 +25,9 @@ public class ApiScenarioDTO extends ApiScenarioWithBLOBs {
private String caseId;
private String environment;
/**
* 场景列表 环境
*/
private String env;
private Map<String, String> environmentMap;
}

View File

@ -28,4 +28,8 @@ public class ApiScenarioRequest extends BaseQueryRequest {
private String operator;
//操作时间
private Long operationTime;
/**
* 是否需要查询环境字段
*/
private boolean selectEnvironment = false;
}

View File

@ -174,9 +174,58 @@ public class ApiAutomationService {
public List<ApiScenarioDTO> list(ApiScenarioRequest request) {
request = this.initRequest(request, true, true);
List<ApiScenarioDTO> list = extApiScenarioMapper.list(request);
if (BooleanUtils.isTrue(request.isSelectEnvironment())) {
this.setApiScenarioEnv(list);
}
return list;
}
private void setApiScenarioEnv(List<ApiScenarioDTO> list) {
List<Project> projectList = projectMapper.selectByExample(new ProjectExample());
List<ApiTestEnvironmentWithBLOBs> apiTestEnvironments = apiTestEnvironmentMapper.selectByExampleWithBLOBs(new ApiTestEnvironmentExample());
for (int i = 0; i < list.size(); i++) {
String env = list.get(i).getEnv();
// 环境属性为空 跳过
if (StringUtils.isBlank(env)) {
continue;
}
try {
Map map = JSON.parseObject(env, Map.class);
Set<String> set = map.keySet();
HashMap<String, String> envMap = new HashMap<>(16);
// 项目为空 跳过
if (set.isEmpty()) {
continue;
}
for (String projectId : set) {
String envId = (String) map.get(projectId);
if (StringUtils.isBlank(envId)) {
continue;
}
List<Project> projects = projectList.stream().filter(p -> StringUtils.equals(p.getId(), projectId)).collect(Collectors.toList());
if (CollectionUtils.isEmpty(projects)) {
continue;
}
Project project = projects.get(0);
List<ApiTestEnvironmentWithBLOBs> envs = apiTestEnvironments.stream().filter(e -> StringUtils.equals(e.getId(), envId)).collect(Collectors.toList());
if (CollectionUtils.isEmpty(envs)) {
continue;
}
ApiTestEnvironmentWithBLOBs environment = envs.get(0);
String projectName = project.getName();
String envName = environment.getName();
if (StringUtils.isBlank(projectName) || StringUtils.isBlank(envName)) {
continue;
}
envMap.put(projectName, envName);
}
list.get(i).setEnvironmentMap(envMap);
} catch (Exception e) {
LogUtil.error("api scenario environment map incorrect parsing. api scenario id:" + list.get(i).getId());
}
}
}
public List<ApiScenarioWithBLOBs> listAll(ApiScenarioBatchRequest request) {
ServiceUtils.getSelectAllIds(request, request.getCondition(),
(query) -> extApiScenarioMapper.selectIdsByQuery(query));

View File

@ -84,4 +84,5 @@ public interface ExtApiScenarioMapper {
Long getLastOrder(@Param("projectId") String projectId, @Param("baseOrder") Long baseOrder);
List<RelationshipGraphData.Node> getTestCaseForGraph(@Param("ids") Set<String> ids);
}

View File

@ -153,6 +153,9 @@
<select id="list" resultMap="BaseResultMap">
select api_scenario.id, api_scenario.project_id, api_scenario.tags, api_scenario.user_id, api_scenario.num,
api_scenario.custom_num, api_scenario.version,
<if test="request.selectEnvironment == true">
api_scenario.scenario_definition -> '$.environmentMap' as env,
</if>
api_scenario.api_scenario_module_id,api_scenario.module_path, api_scenario.name, api_scenario.level,
api_scenario.status, api_scenario.principal, api_scenario.step_total,
api_scenario.last_result,api_scenario.pass_rate,api_scenario.report_id,
@ -607,4 +610,5 @@
</foreach>
and api_scenario.status != 'Trash';
</select>
</mapper>

View File

@ -341,7 +341,7 @@ public class TestPlanScenarioCaseService {
return testPlanApiScenarioMapper.countByExample(example) > 0 ? true : false;
}
public Map<String, String> getScenarioCaseEnv(HashMap<String, String> map) {
public Map<String, String> getScenarioCaseEnv(Map<String, String> map) {
Set<String> set = map.keySet();
HashMap<String, String> envMap = new HashMap<>(16);
if (set.isEmpty()) {

View File

@ -132,6 +132,39 @@
:field="item"
:fields-width="fieldsWidth"
sortable="custom"/>
<ms-table-column
:field="item"
:fields-width="fieldsWidth"
prop="environmentMap"
:label="$t('commons.environment')"
min-width="180">
<template v-slot:default="{row}">
<div v-if="row.environmentMap">
<span v-for="(k, v, index) in row.environmentMap" :key="index">
<span v-if="index===0">
<span class="project-name" :title="v">{{v}}</span>:
<el-tag type="success" size="mini" effect="plain">
<span class="project-env">{{k}}</span>
</el-tag>
<br/>
</span>
<el-popover
placement="top"
width="350"
trigger="click">
<div v-for="(k, v, index) in row.environmentMap" :key="index">
<span class="plan-case-env">{{v}}:
<el-tag type="success" size="mini" effect="plain">{{k}}</el-tag><br/>
</span>
</div>
<el-link v-if="index === 1" slot="reference" type="info" :underline="false" icon="el-icon-more"/>
</el-popover>
</span>
</div>
</template>
</ms-table-column>
<ms-table-column prop="updateTime"
:field="item"
:fields-width="fieldsWidth"
@ -1196,4 +1229,34 @@ export default {
border-color: #dd3636;
color: white;
}
.plan-case-env {
display: inline-block;
padding: 0 0;
max-width: 350px;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
margin-top: 2px;
margin-left: 5px;
}
.project-name {
display: inline-block;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
width: 80px;
vertical-align: middle;
}
.project-env{
display: inline-block;
white-space: nowrap;
overflow: hidden;
width: 50px;
text-overflow: ellipsis;
vertical-align: middle;
}
</style>

View File

@ -73,6 +73,7 @@ export let CUSTOM_TABLE_HEADER = {
{id: 'tags', key: '5', label: 'commons.tag'},
{id: 'userName', key: '6', label: 'api_test.automation.creator'},
{id: 'principalName', key: '7', label: 'api_test.definition.api_principal'},
{id: 'environmentMap', key: 'e', label: 'commons.environment'},
{id: 'updateTime', key: '8', label: 'api_test.definition.api_last_time'},
{id: 'stepTotal', key: '9', label: 'api_test.automation.step'},
{id: 'lastResult', key: 'a', label: 'api_test.automation.last_result'},