From a413cea8894a3215fc1ce775c992f0b6828ead3e Mon Sep 17 00:00:00 2001 From: zhangdahai112 Date: Wed, 27 Jul 2022 00:41:34 +0800 Subject: [PATCH] =?UTF-8?q?fix(UI=20=E8=87=AA=E5=8A=A8=E5=8C=96):=20ui?= =?UTF-8?q?=E6=8A=A5=E5=91=8A=E7=BB=9F=E8=AE=A1=EF=BC=8C=E6=9F=A5=E8=AF=A2?= =?UTF-8?q?=E7=9B=B8=E5=85=B3=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --bug=1015192 --user=张大海 【测试跟踪】ui用例统计分析,步骤数统计的不对 https://www.tapd.cn/55049933/s/1212920 --bug=1015062 --user=张大海 【测试跟踪】测试计划执行UI场景,没执行的场景显示了之前执行的结果 https://www.tapd.cn/55049933/s/1212922 --bug=1015059 --user=张大海 【测试跟踪】测试计划报告,UI场景结果显示在了接口场景结果里 https://www.tapd.cn/55049933/s/1212924 --bug=1015057 --user=张大海 【测试跟踪】UI测试计划报告,最新的报告内容会覆盖之前的 https://www.tapd.cn/55049933/s/1212926 --- .../api/service/UiAutomationServiceProxy.java | 23 ++++-- .../TestPlanReportContentWithBLOBs.java | 2 + .../mapper/TestPlanReportContentMapper.xml | 28 +++++-- .../dto/TestPlanExecuteReportDTO.java | 1 + .../track/dto/TestPlanUiResultReportDTO.java | 3 + .../track/service/TestPlanReportService.java | 18 +++-- .../track/service/TestPlanService.java | 11 ++- .../TestPlanUiScenarioCaseService.java | 78 +++++++++++++------ .../db/migration/V125__2.0.0_ddl__release.sql | 4 +- .../report/detail/TestPlanReportContent.vue | 2 +- 10 files changed, 128 insertions(+), 42 deletions(-) diff --git a/backend/src/main/java/io/metersphere/api/service/UiAutomationServiceProxy.java b/backend/src/main/java/io/metersphere/api/service/UiAutomationServiceProxy.java index 23366c57bd..ab4a1eaf7d 100644 --- a/backend/src/main/java/io/metersphere/api/service/UiAutomationServiceProxy.java +++ b/backend/src/main/java/io/metersphere/api/service/UiAutomationServiceProxy.java @@ -3,18 +3,25 @@ package io.metersphere.api.service; import io.metersphere.api.dto.automation.RunScenarioRequest; import io.metersphere.commons.utils.CommonBeanFactory; import io.metersphere.dto.RunUiScenarioRequest; +import io.metersphere.dto.UiScenarioDTO; +import io.metersphere.dto.UiScenarioRequest; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.lang.reflect.Method; +import java.util.List; import java.util.function.Function; @Service @Transactional(rollbackFor = Exception.class) public class UiAutomationServiceProxy { - public Object run(RunScenarioRequest request) { - return invoke((clazz) -> { + private Object invoke(Function getDeclaredMethod, Object... args) { + return CommonBeanFactory.invoke("uiAutomationService", getDeclaredMethod, args); + } + + public List run(RunScenarioRequest request) { + return (List) invoke((clazz) -> { try { return clazz.getDeclaredMethod("run", RunUiScenarioRequest.class); } catch (NoSuchMethodException e) { @@ -24,8 +31,14 @@ public class UiAutomationServiceProxy { }, request); } - private Object invoke(Function getDeclaredMethod, Object... args) { - return CommonBeanFactory.invoke("uiAutomationService", getDeclaredMethod, args); + public List list(UiScenarioRequest request) { + return (List) invoke((clazz) -> { + try { + return clazz.getDeclaredMethod("list", UiScenarioRequest.class); + } catch (NoSuchMethodException e) { + e.printStackTrace(); + return null; + } + }, request); } - } diff --git a/backend/src/main/java/io/metersphere/base/domain/TestPlanReportContentWithBLOBs.java b/backend/src/main/java/io/metersphere/base/domain/TestPlanReportContentWithBLOBs.java index 04d4cd848a..c80e0a7e22 100644 --- a/backend/src/main/java/io/metersphere/base/domain/TestPlanReportContentWithBLOBs.java +++ b/backend/src/main/java/io/metersphere/base/domain/TestPlanReportContentWithBLOBs.java @@ -57,5 +57,7 @@ public class TestPlanReportContentWithBLOBs extends TestPlanReportContent implem private String apiBaseCount; + private String uiAllCases; + private static final long serialVersionUID = 1L; } \ No newline at end of file diff --git a/backend/src/main/java/io/metersphere/base/mapper/TestPlanReportContentMapper.xml b/backend/src/main/java/io/metersphere/base/mapper/TestPlanReportContentMapper.xml index 9da6ab0015..56ec83af93 100644 --- a/backend/src/main/java/io/metersphere/base/mapper/TestPlanReportContentMapper.xml +++ b/backend/src/main/java/io/metersphere/base/mapper/TestPlanReportContentMapper.xml @@ -36,6 +36,7 @@ + @@ -104,7 +105,8 @@ issue_list, api_all_cases, api_failure_cases, scenario_all_cases, scenario_failure_cases, load_all_Cases, load_failure_cases, plan_scenario_report_struct, plan_api_case_report_struct, plan_load_case_report_struct, error_report_cases, error_report_scenarios, un_execute_cases, - un_execute_scenarios, plan_ui_scenario_report_struct, ui_result, api_base_count + un_execute_scenarios, plan_ui_scenario_report_struct, ui_result, api_base_count, + ui_all_cases @@ -486,6 +496,9 @@ api_base_count = #{record.apiBaseCount,jdbcType=LONGVARCHAR}, + + ui_all_cases = #{record.uiAllCases,jdbcType=LONGVARCHAR}, + @@ -524,7 +537,8 @@ un_execute_scenarios = #{record.unExecuteScenarios,jdbcType=LONGVARCHAR}, plan_ui_scenario_report_struct = #{record.planUiScenarioReportStruct,jdbcType=LONGVARCHAR}, ui_result = #{record.uiResult,jdbcType=LONGVARCHAR}, - api_base_count = #{record.apiBaseCount,jdbcType=LONGVARCHAR} + api_base_count = #{record.apiBaseCount,jdbcType=LONGVARCHAR}, + ui_all_cases = #{record.uiAllCases,jdbcType=LONGVARCHAR} @@ -639,6 +653,9 @@ api_base_count = #{apiBaseCount,jdbcType=LONGVARCHAR}, + + ui_all_cases = #{uiAllCases,jdbcType=LONGVARCHAR}, + where id = #{id,jdbcType=VARCHAR} @@ -674,7 +691,8 @@ un_execute_scenarios = #{unExecuteScenarios,jdbcType=LONGVARCHAR}, plan_ui_scenario_report_struct = #{planUiScenarioReportStruct,jdbcType=LONGVARCHAR}, ui_result = #{uiResult,jdbcType=LONGVARCHAR}, - api_base_count = #{apiBaseCount,jdbcType=LONGVARCHAR} + api_base_count = #{apiBaseCount,jdbcType=LONGVARCHAR}, + ui_all_cases = #{uiAllCases,jdbcType=LONGVARCHAR} where id = #{id,jdbcType=VARCHAR} diff --git a/backend/src/main/java/io/metersphere/dto/TestPlanExecuteReportDTO.java b/backend/src/main/java/io/metersphere/dto/TestPlanExecuteReportDTO.java index ab84328883..082afb66bf 100644 --- a/backend/src/main/java/io/metersphere/dto/TestPlanExecuteReportDTO.java +++ b/backend/src/main/java/io/metersphere/dto/TestPlanExecuteReportDTO.java @@ -19,4 +19,5 @@ public class TestPlanExecuteReportDTO { private Map testPlanLoadCaseIdAndReportIdMap; private Map apiCaseInfoDTOMap; private Map scenarioInfoDTOMap; + private Map uiScenarioInfoDTOMap; } diff --git a/backend/src/main/java/io/metersphere/track/dto/TestPlanUiResultReportDTO.java b/backend/src/main/java/io/metersphere/track/dto/TestPlanUiResultReportDTO.java index 7a1c209ab3..f670bfb4cf 100644 --- a/backend/src/main/java/io/metersphere/track/dto/TestPlanUiResultReportDTO.java +++ b/backend/src/main/java/io/metersphere/track/dto/TestPlanUiResultReportDTO.java @@ -8,8 +8,11 @@ import java.util.List; @Getter @Setter public class TestPlanUiResultReportDTO { + //历史的case数据 private List uiScenarioCaseData; + //场景的分类统计数据 private List uiScenarioData; + //步骤的分类统计数据 private List uiScenarioStepData; } diff --git a/backend/src/main/java/io/metersphere/track/service/TestPlanReportService.java b/backend/src/main/java/io/metersphere/track/service/TestPlanReportService.java index 6dc0234b2a..96c1463a90 100644 --- a/backend/src/main/java/io/metersphere/track/service/TestPlanReportService.java +++ b/backend/src/main/java/io/metersphere/track/service/TestPlanReportService.java @@ -669,6 +669,9 @@ public class TestPlanReportService { if (reportDTO.getUiResult() != null) { testPlanReportContentWithBLOBs.setUiResult(JSONObject.toJSONString(reportDTO.getUiResult())); } + if (reportDTO.getUiAllCases() != null) { + testPlanReportContentWithBLOBs.setUiAllCases(JSONObject.toJSONString(reportDTO.getUiAllCases())); + } if (reportDTO.getLoadResult() != null) { testPlanReportContentWithBLOBs.setLoadResult(JSONObject.toJSONString(reportDTO.getLoadResult())); } @@ -973,6 +976,9 @@ public class TestPlanReportService { if (StringUtils.isNotBlank(testPlanReportContent.getUiResult())) { testPlanReportDTO.setUiResult(JSONObject.parseObject(testPlanReportContent.getUiResult(), TestPlanUiResultReportDTO.class)); } + if (StringUtils.isNotBlank(testPlanReportContent.getUiAllCases())) { + testPlanReportDTO.setUiAllCases(JSONObject.parseArray(testPlanReportContent.getUiAllCases(), TestPlanUiScenarioDTO.class)); + } testPlanReportDTO.setId(reportId); TestPlanReport testPlanReport = testPlanReportMapper.selectByPrimaryKey(testPlanReportContent.getTestPlanReportId()); testPlanReportDTO.setName(testPlanReport.getName()); @@ -1121,6 +1127,7 @@ public class TestPlanReportService { Map testPlanLoadCaseIdAndReportIdMap = new LinkedHashMap<>(); Map apiCaseInfoDTOMap = new LinkedHashMap<>(); Map scenarioInfoDTOMap = new LinkedHashMap<>(); + Map uiScenarioInfoDTOMap = new LinkedHashMap<>(); if (testPlanReportContentWithBLOBs != null) { if (StringUtils.isNotEmpty(testPlanReportContentWithBLOBs.getPlanApiCaseReportStruct())) { @@ -1160,9 +1167,9 @@ public class TestPlanReportService { } } if (StringUtils.isNotEmpty(testPlanReportContentWithBLOBs.getPlanUiScenarioReportStruct())) { - List scenarioInfoDTOList = null; + List scenarioInfoDTOList = null; try { - scenarioInfoDTOList = JSONArray.parseArray(testPlanReportContentWithBLOBs.getPlanUiScenarioReportStruct(), TestPlanFailureScenarioDTO.class); + scenarioInfoDTOList = JSONArray.parseArray(testPlanReportContentWithBLOBs.getPlanUiScenarioReportStruct(), TestPlanUiScenarioDTO.class); } catch (Exception ignored) { } if (scenarioInfoDTOList == null) { @@ -1171,9 +1178,10 @@ public class TestPlanReportService { } catch (Exception ignored) { } } else { - for (TestPlanFailureScenarioDTO item : scenarioInfoDTOList) { + for (TestPlanUiScenarioDTO item : scenarioInfoDTOList) { testPlanUiScenarioIdAndReportIdMap.put(item.getId(), item.getReportId()); - scenarioInfoDTOMap.put(item.getId(), item); + uiScenarioInfoDTOMap.put(item.getId(), item); + } } } @@ -1184,7 +1192,7 @@ public class TestPlanReportService { } } } - TestPlanExecuteReportDTO returnDTO = new TestPlanExecuteReportDTO(testPlanApiCaseIdAndReportIdMap, testPlanScenarioIdAndReportIdMap, testPlanUiScenarioIdAndReportIdMap, testPlanLoadCaseIdAndReportIdMap, apiCaseInfoDTOMap, scenarioInfoDTOMap); + TestPlanExecuteReportDTO returnDTO = new TestPlanExecuteReportDTO(testPlanApiCaseIdAndReportIdMap, testPlanScenarioIdAndReportIdMap, testPlanUiScenarioIdAndReportIdMap, testPlanLoadCaseIdAndReportIdMap, apiCaseInfoDTOMap, scenarioInfoDTOMap, uiScenarioInfoDTOMap); return returnDTO; } diff --git a/backend/src/main/java/io/metersphere/track/service/TestPlanService.java b/backend/src/main/java/io/metersphere/track/service/TestPlanService.java index 973f421023..63b0d26831 100644 --- a/backend/src/main/java/io/metersphere/track/service/TestPlanService.java +++ b/backend/src/main/java/io/metersphere/track/service/TestPlanService.java @@ -1403,13 +1403,17 @@ public class TestPlanService { } } - public void buildUiReport(TestPlanSimpleReportDTO report, JSONObject config, String planId, boolean saveResponse) { + public void buildUiReport(TestPlanSimpleReportDTO report, JSONObject config, String planId, TestPlanExecuteReportDTO testPlanExecuteReportDTO, boolean saveResponse) { if (checkReportConfig(config, "ui")) { List allCases; List statusList = getUiReportStatusList(config); if (statusList != null) { // 不等于null,说明配置了用例,根据配置的状态查询用例 - allCases = testPlanUiScenarioCaseService.getAllCasesByStatusList(planId, statusList); + if (testPlanExecuteReportDTO != null) { + allCases = testPlanUiScenarioCaseService.getAllCases(testPlanExecuteReportDTO.getTestPlanUiScenarioIdAndReportIdMap(), testPlanExecuteReportDTO.getUiScenarioInfoDTOMap()); + } else { + allCases = testPlanUiScenarioCaseService.getAllCasesByStatusList(planId, statusList); + } report.setUiAllCases(allCases); if (saveResponse) { buildUiScenarioResponse(allCases); @@ -1839,6 +1843,7 @@ public class TestPlanService { buildFunctionalReport(report, config, testPlanReport.getTestPlanId()); buildApiReport(report, config, testPlanExecuteReportDTO); buildLoadReport(report, config, testPlanExecuteReportDTO.getTestPlanLoadCaseIdAndReportIdMap(), false); + buildUiReport(report, config, testPlanReport.getTestPlanId(), testPlanExecuteReportDTO, false); returnDTO.setTestPlanSimpleReportDTO(report); return returnDTO; } else { @@ -1859,7 +1864,7 @@ public class TestPlanService { buildFunctionalReport(report, config, planId); buildApiReport(report, config, planId, saveResponse); buildLoadReport(report, config, planId, saveResponse); - buildUiReport(report, config, planId, saveResponse); + buildUiReport(report, config, planId, null, saveResponse); return report; } diff --git a/backend/src/main/java/io/metersphere/track/service/TestPlanUiScenarioCaseService.java b/backend/src/main/java/io/metersphere/track/service/TestPlanUiScenarioCaseService.java index 5e8edc7085..a02b762afb 100644 --- a/backend/src/main/java/io/metersphere/track/service/TestPlanUiScenarioCaseService.java +++ b/backend/src/main/java/io/metersphere/track/service/TestPlanUiScenarioCaseService.java @@ -5,13 +5,14 @@ import com.alibaba.fastjson.JSONObject; import com.github.pagehelper.Page; import com.github.pagehelper.PageHelper; import io.metersphere.api.dto.EnvironmentType; -import io.metersphere.api.dto.automation.*; +import io.metersphere.api.dto.automation.APIScenarioReportResult; +import io.metersphere.api.dto.automation.ExecuteType; +import io.metersphere.api.dto.automation.RunTestPlanScenarioRequest; +import io.metersphere.api.dto.automation.TestPlanScenarioRequest; import io.metersphere.api.service.ApiScenarioReportService; +import io.metersphere.api.service.UiAutomationServiceProxy; import io.metersphere.base.domain.*; -import io.metersphere.base.mapper.ApiScenarioMapper; -import io.metersphere.base.mapper.ApiTestEnvironmentMapper; -import io.metersphere.base.mapper.TestPlanMapper; -import io.metersphere.base.mapper.TestPlanUiScenarioMapper; +import io.metersphere.base.mapper.*; import io.metersphere.base.mapper.ext.ExtTestPlanUiScenarioCaseMapper; import io.metersphere.commons.constants.ApiRunMode; import io.metersphere.commons.constants.ExecuteResult; @@ -26,10 +27,6 @@ import io.metersphere.service.ProjectApplicationService; import io.metersphere.service.ProjectService; import io.metersphere.track.dto.*; import io.metersphere.track.request.testcase.TestPlanScenarioCaseBatchRequest; -import io.metersphere.dto.RunUiScenarioRequest; -import io.metersphere.dto.UiScenarioRequest; -import io.metersphere.track.dto.UiRunModeConfigDTO; -import io.metersphere.xpack.ui.service.UiAutomationService; import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.apache.ibatis.session.ExecutorType; @@ -49,7 +46,7 @@ import java.util.stream.Collectors; public class TestPlanUiScenarioCaseService { @Resource - UiAutomationService uiAutomationService; + UiAutomationServiceProxy uiAutomationServiceProxy; @Resource TestPlanUiScenarioMapper testPlanUiScenarioMapper; @Resource @@ -71,6 +68,8 @@ public class TestPlanUiScenarioCaseService { private TestPlanService testPlanService; @Resource private ProjectApplicationService projectApplicationService; + @Resource + private UiScenarioMapper uiScenarioMapper; public List list(TestPlanScenarioRequest request) { request.setProjectId(null); @@ -135,7 +134,7 @@ public class TestPlanUiScenarioCaseService { request.setNotInTestPlan(false); } Page page = PageHelper.startPage(goPage, pageSize, true); - return PageUtils.setPageInfo(page, uiAutomationService.list(request)); + return PageUtils.setPageInfo(page, uiAutomationServiceProxy.list(request)); } public int delete(String id) { @@ -216,7 +215,7 @@ public class TestPlanUiScenarioCaseService { request.setUiConfig(configDTO); request.setPlanCaseIds(planCaseIdList); request.setRequestOriginator("TEST_PLAN"); - return uiAutomationService.run(request); + return uiAutomationServiceProxy.run(request); } public void setScenarioEnv(List testPlanApiScenarios, List planScenarioIds, RunModeConfigDTO runModeConfig) { @@ -485,16 +484,34 @@ public class TestPlanUiScenarioCaseService { private void calculateScenarioResultDTO(PlanReportCaseDTO item, TestPlanScenarioStepCountDTO stepCount) { if (StringUtils.isNotBlank(item.getReportId())) { - APIScenarioReportResult apiScenarioReportResult = apiScenarioReportService.get(item.getReportId(),false); - if (apiScenarioReportResult != null) { - String content = apiScenarioReportResult.getContent(); + APIScenarioReportResult uiScenarioReportResult = apiScenarioReportService.get(item.getReportId(), false); + + if (uiScenarioReportResult != null) { + String content = uiScenarioReportResult.getContent(); if (StringUtils.isNotBlank(content)) { JSONObject jsonObject = JSONObject.parseObject(content); - stepCount.setScenarioStepTotal(stepCount.getScenarioStepTotal() + jsonObject.getIntValue("scenarioStepTotal")); + stepCount.setScenarioStepSuccess(stepCount.getScenarioStepSuccess() + jsonObject.getIntValue("scenarioStepSuccess")); stepCount.setScenarioStepError(stepCount.getScenarioStepError() + jsonObject.getIntValue("scenarioStepError")); stepCount.setScenarioStepErrorReport(stepCount.getScenarioStepErrorReport() + jsonObject.getIntValue("scenarioStepErrorReport")); - stepCount.setScenarioStepUnExecute(stepCount.getScenarioStepUnExecute() + jsonObject.getIntValue("scenarioStepUnExecuteReport")); + + if (!StringUtils.equalsIgnoreCase("STOP", uiScenarioReportResult.getStatus())) { + stepCount.setScenarioStepTotal(stepCount.getScenarioStepTotal() + jsonObject.getIntValue("scenarioStepTotal")); + stepCount.setScenarioStepUnExecute(stepCount.getScenarioStepUnExecute() + jsonObject.getIntValue("scenarioStepUnExecuteReport")); + } else { + //串行执行的报告 勾选了失败停止 后续的所有场景的未禁用步骤都统计到总数和未执行里面去 + UiScenarioWithBLOBs stoppedScenario = uiScenarioMapper.selectByPrimaryKey(uiScenarioReportResult.getScenarioId()); + if (stoppedScenario == null) { + TestPlanUiScenario testPlanUiScenario = testPlanUiScenarioMapper.selectByPrimaryKey(uiScenarioReportResult.getScenarioId()); + stoppedScenario = uiScenarioMapper.selectByPrimaryKey(testPlanUiScenario.getUiScenarioId()); + } + if (stoppedScenario == null) { + return; + } + int totalSteps = getTotalSteps(stoppedScenario); + stepCount.setScenarioStepTotal(stepCount.getScenarioStepTotal() + totalSteps); + stepCount.setScenarioStepUnExecute(stepCount.getScenarioStepUnExecute() + totalSteps); + } } } } else { @@ -502,6 +519,27 @@ public class TestPlanUiScenarioCaseService { } } + /** + * 获取一个ui场景所有未禁用的步骤数 + * + * @param stoppedScenario + * @return + */ + private int getTotalSteps(UiScenarioWithBLOBs stoppedScenario) { + if (StringUtils.isNotBlank(stoppedScenario.getScenarioDefinition())) { + JSONObject definition = JSONObject.parseObject(stoppedScenario.getScenarioDefinition()); + if (definition.containsKey("hashTree")) { + return definition + .getJSONArray("hashTree") + .stream() + .filter(cmd -> (((JSONObject) cmd).getBoolean("enable"))) + .collect(Collectors.toList()) + .size(); + } + } + return 0; + } + private void getScenarioCaseReportStatusResultDTO(String status, int count, List scenarioCaseList) { if (count > 0) { TestCaseReportStatusResultDTO scenarioCase = new TestCaseReportStatusResultDTO(); @@ -518,7 +556,7 @@ public class TestPlanUiScenarioCaseService { } public List getAllCases(Map idMap, Map scenarioInfoDTOMap) { - String defaultStatus = "Fail"; + String defaultStatus = "Error"; Map reportStatus = apiScenarioReportService.getReportStatusByReportIds(idMap.values()); Map savedReportMap = new HashMap<>(idMap); List apiTestCases = new ArrayList<>(); @@ -530,10 +568,6 @@ public class TestPlanUiScenarioCaseService { String status = reportStatus.get(reportId); if (status == null) { status = defaultStatus; - } else { - if (StringUtils.equalsIgnoreCase(status, "Error")) { - status = "Fail"; - } } dto.setLastResult(status); dto.setStatus(status); diff --git a/backend/src/main/resources/db/migration/V125__2.0.0_ddl__release.sql b/backend/src/main/resources/db/migration/V125__2.0.0_ddl__release.sql index 5295f899b1..db03113d6a 100644 --- a/backend/src/main/resources/db/migration/V125__2.0.0_ddl__release.sql +++ b/backend/src/main/resources/db/migration/V125__2.0.0_ddl__release.sql @@ -253,4 +253,6 @@ CREATE TABLE IF NOT EXISTS `attachment_module_relation` INDEX `attachment_module_index`(`relation_id`, `relation_type`) USING BTREE ) ENGINE = InnoDB CHARACTER SET = utf8mb4 - COLLATE = utf8mb4_general_ci; \ No newline at end of file + COLLATE = utf8mb4_general_ci; + +ALTER TABLE test_plan_report_content ADD COLUMN `ui_all_cases` LONGTEXT COMMENT 'ui all cases (JSON format)'; diff --git a/frontend/src/business/components/track/plan/view/comonents/report/detail/TestPlanReportContent.vue b/frontend/src/business/components/track/plan/view/comonents/report/detail/TestPlanReportContent.vue index 48801974d7..f3332cf7f8 100644 --- a/frontend/src/business/components/track/plan/view/comonents/report/detail/TestPlanReportContent.vue +++ b/frontend/src/business/components/track/plan/view/comonents/report/detail/TestPlanReportContent.vue @@ -13,7 +13,7 @@ :is-template="isTemplate" :report="report" :plan-id="planId"/> -