feat(接口管理): 新增用例详情的执行历史获取结果组件(等待调试)

This commit is contained in:
guoyuqi 2024-03-18 18:45:48 +08:00 committed by Craftsman
parent 329d391292
commit 3115160863
8 changed files with 89 additions and 10 deletions

View File

@ -30,6 +30,8 @@ import {
DeleteRecycleCaseUrl, DeleteRecycleCaseUrl,
ExecuteCaseUrl, ExecuteCaseUrl,
GetCaseDetailUrl, GetCaseDetailUrl,
GetCaseReportByIdUrl,
GetCaseReportDetailUrl,
GetChangeHistoryUrl, GetChangeHistoryUrl,
GetDefinitionDetailUrl, GetDefinitionDetailUrl,
GetDefinitionScheduleUrl, GetDefinitionScheduleUrl,
@ -72,7 +74,7 @@ import {
UploadTempFileUrl, UploadTempFileUrl,
} from '@/api/requrls/api-test/management'; } from '@/api/requrls/api-test/management';
import { ExecuteRequestParams } from '@/models/apiTest/common'; import { ApiCaseReportDetail, ExecuteRequestParams } from '@/models/apiTest/common';
import { import {
AddApiCaseParams, AddApiCaseParams,
ApiCaseBatchEditParams, ApiCaseBatchEditParams,
@ -478,3 +480,11 @@ export function getPoolOption(projectId: string) {
export function getPoolId(projectId: string) { export function getPoolId(projectId: string) {
return MSR.get<string>({ url: GetPoolId + projectId }); return MSR.get<string>({ url: GetPoolId + projectId });
} }
export function getReportById(id: string) {
return MSR.get<Record<string, any>>({ url: GetCaseReportByIdUrl + id });
}
export function getCaseReportDetail(reportId: string, stepId: string) {
return MSR.get<ApiCaseReportDetail>({ url: `${GetCaseReportDetailUrl + reportId}/${stepId}` });
}

View File

@ -74,6 +74,8 @@ export const GetExecuteHistoryUrl = '/api/case/execute/page'; // 获取用的执
export const GetDependencyUrl = '/api/case/get-reference'; // 获取用例的依赖关系 export const GetDependencyUrl = '/api/case/get-reference'; // 获取用例的依赖关系
export const GetChangeHistoryUrl = '/api/case/operation-history/page'; // 获取用例的依赖关系 export const GetChangeHistoryUrl = '/api/case/operation-history/page'; // 获取用例的依赖关系
export const ToggleFollowCaseUrl = '/api/case/follow'; // 接口定义-关注/取消关注 export const ToggleFollowCaseUrl = '/api/case/follow'; // 接口定义-关注/取消关注
export const GetCaseReportByIdUrl = '/api/report/case/get/'; // 接口用例报告获取
export const GetCaseReportDetailUrl = '/api/report/case/get/detail/'; // 接口用例报告获取
/** /**
* *

View File

@ -399,6 +399,7 @@ export interface ResponseResult {
vars: string; vars: string;
assertions: any; assertions: any;
} }
export interface RequestResult { export interface RequestResult {
body: string; body: string;
headers: string; headers: string;
@ -428,3 +429,18 @@ export interface ResponseDefinition {
body: ResponseDefinitionBody; body: ResponseDefinitionBody;
[key: string]: any; // 用于前端渲染时填充的自定义信息,后台无此字段 [key: string]: any; // 用于前端渲染时填充的自定义信息,后台无此字段
} }
// 接口用例执行历史报告对象
export type ApiCaseReportDetail = {
id: string | number;
reportId: string | number;
stepId: string | number;
status: string;
fakeCode: string;
requestName: string;
requestTime: number;
code: string;
responseSize: number;
scriptIdentifier: string;
content: RequestResult;
};

View File

@ -53,7 +53,7 @@
<tab-case-dependency :source-id="caseDetail.id" /> <tab-case-dependency :source-id="caseDetail.id" />
</a-tab-pane> </a-tab-pane>
<a-tab-pane key="executeHistory" :title="t('apiTestManagement.executeHistory')" class="px-[18px] py-[16px]"> <a-tab-pane key="executeHistory" :title="t('apiTestManagement.executeHistory')" class="px-[18px] py-[16px]">
<tab-case-execute-history :source-id="caseDetail.id" module-type="API_REPORT" /> <tab-case-execute-history :source-id="caseDetail.id" module-type="API_REPORT" :protocol="props.protocol" />
</a-tab-pane> </a-tab-pane>
<!-- <a-tab-pane key="dependencies" :title="t('apiTestManagement.dependencies')" class="px-[18px] py-[16px]"> <!-- <a-tab-pane key="dependencies" :title="t('apiTestManagement.dependencies')" class="px-[18px] py-[16px]">
</a-tab-pane> --> </a-tab-pane> -->

View File

@ -88,7 +88,7 @@
{ {
title: 'apiTestManagement.changeOrder', title: 'apiTestManagement.changeOrder',
dataIndex: 'id', dataIndex: 'id',
width: 200, width: 100,
}, },
{ {
title: 'apiTestManagement.type', title: 'apiTestManagement.type',

View File

@ -67,11 +67,23 @@
<execute-status :status="record.status" /> <execute-status :status="record.status" />
</template> </template>
<template #operation="{ record }"> <template #operation="{ record }">
<MsButton class="!mr-0" @click="showResult(record)" <a-tooltip :disabled="record.deleted" :content="t('case.detail.report.delete')" position="top">
>{{ t('apiScenario.executeHistory.execution.operation') }} <MsButton :disabled="!record.deleted" class="!mr-0" @click="showResult(record)"
</MsButton> >{{ t('apiScenario.executeHistory.execution.operation') }}
</MsButton>
</a-tooltip>
</template> </template>
</ms-base-table> </ms-base-table>
<a-modal v-model:visible="showResponse" class="ms-modal-form ms-modal-small" title-align="start">
<response
v-show="showResponse"
:is-expanded="true"
:is-http-protocol="props.protocol === 'HTTP'"
:is-priority-local-exec="false"
:active-tab="ResponseComposition.BODY"
:request-task-result="responseContent"
></response>
</a-modal>
</div> </div>
</template> </template>
@ -82,23 +94,31 @@
import MsBaseTable from '@/components/pure/ms-table/base-table.vue'; import MsBaseTable from '@/components/pure/ms-table/base-table.vue';
import { MsTableColumn } from '@/components/pure/ms-table/type'; import { MsTableColumn } from '@/components/pure/ms-table/type';
import useTable from '@/components/pure/ms-table/useTable'; import useTable from '@/components/pure/ms-table/useTable';
import response from '@/views/api-test/components/requestComposition/response/index.vue';
import ExecuteStatus from '@/views/api-test/scenario/components/executeStatus.vue'; import ExecuteStatus from '@/views/api-test/scenario/components/executeStatus.vue';
import { getApiCaseExecuteHistory } from '@/api/modules/api-test/management'; import { getApiCaseExecuteHistory, getCaseReportDetail, getReportById } from '@/api/modules/api-test/management';
import { useI18n } from '@/hooks/useI18n'; import { useI18n } from '@/hooks/useI18n';
import useAppStore from '@/store/modules/app'; import useAppStore from '@/store/modules/app';
import { ApiCaseReportDetail, RequestTaskResult } from '@/models/apiTest/common';
import { ApiCaseExecuteHistoryItem } from '@/models/apiTest/management'; import { ApiCaseExecuteHistoryItem } from '@/models/apiTest/management';
import { ExecuteStatusFilters } from '@/enums/apiEnum'; import { ExecuteStatusFilters, ResponseComposition } from '@/enums/apiEnum';
import { TriggerModeLabel } from '@/enums/reportEnum'; import { TriggerModeLabel } from '@/enums/reportEnum';
const triggerModeListFilters = ref<string[]>(Object.keys(TriggerModeLabel)); const triggerModeListFilters = ref<string[]>(Object.keys(TriggerModeLabel));
const triggerModeFilterVisible = ref(false); const triggerModeFilterVisible = ref(false);
const statusFilterVisible = ref(false); const statusFilterVisible = ref(false);
const statusFilters = ref(Object.keys(ExecuteStatusFilters)); const statusFilters = ref(Object.keys(ExecuteStatusFilters));
const showResponse = ref(false);
const responseContent = ref<RequestTaskResult>();
const props = defineProps<{ const props = defineProps<{
sourceId: string | number; sourceId: string | number;
moduleType: string; moduleType: string;
protocol: string;
}>(); }>();
const appStore = useAppStore(); const appStore = useAppStore();
@ -135,7 +155,7 @@
sortDirections: ['ascend', 'descend'], sortDirections: ['ascend', 'descend'],
sorter: true, sorter: true,
}, },
width: 100, width: 150,
}, },
{ {
title: 'apiTestManagement.taskOperator', title: 'apiTestManagement.taskOperator',
@ -194,7 +214,36 @@
loadExecuteList(); loadExecuteList();
} }
} }
function showResult(record: ApiCaseExecuteHistoryItem) {}
function loadedReportDetail(detail: ApiCaseReportDetail) {
if (detail.id) {
responseContent.value?.requestResults.push(detail.content);
showResponse.value = true;
}
}
async function loadedReport(detail: Record<string, any>) {
if (detail.id) {
if (detail.children && detail.children.length > 0) {
const { stepId } = detail.children[0].stepId;
try {
const caseReportDetail = getCaseReportDetail(detail.id, stepId);
loadedReportDetail(await caseReportDetail);
} catch (e) {
console.error(e);
}
}
}
}
function showResult(record: ApiCaseExecuteHistoryItem) {
try {
const result = getReportById(record.id);
loadedReport(result);
} catch (error) {
console.error(error);
}
}
onBeforeMount(() => { onBeforeMount(() => {
loadExecuteList(); loadExecuteList();

View File

@ -206,4 +206,5 @@ export default {
'case.detail.execute.history.list': 'Execution history list', 'case.detail.execute.history.list': 'Execution history list',
'case.detail.dependency.list': 'Reference relationship list', 'case.detail.dependency.list': 'Reference relationship list',
'case.detail.resource.api': 'API', 'case.detail.resource.api': 'API',
'case.detail.report.delete': 'Report cleared',
}; };

View File

@ -198,4 +198,5 @@ export default {
'case.detail.execute.history.list': '执行历史列表', 'case.detail.execute.history.list': '执行历史列表',
'case.detail.dependency.list': '引用关系列表', 'case.detail.dependency.list': '引用关系列表',
'case.detail.resource.api': '接口测试', 'case.detail.resource.api': '接口测试',
'case.detail.report.delete': '报告已清理',
}; };