测试用例执行相关优化

This commit is contained in:
liangdaliang
2025-03-21 16:09:53 +08:00
parent 2addbd2179
commit b4c89d3b9a
7 changed files with 72 additions and 12 deletions

View File

@@ -6,6 +6,7 @@ import com.test.common.core.domain.AjaxResult;
import com.test.common.core.page.TableDataInfo; import com.test.common.core.page.TableDataInfo;
import com.test.common.enums.BusinessType; import com.test.common.enums.BusinessType;
import com.test.common.utils.DateUtils; import com.test.common.utils.DateUtils;
import com.test.common.utils.uuid.IdUtils;
import com.test.test.domain.TestCase; import com.test.test.domain.TestCase;
import com.test.test.domain.qo.IDQO; import com.test.test.domain.qo.IDQO;
import com.test.test.domain.qo.TestCaseListQO; import com.test.test.domain.qo.TestCaseListQO;
@@ -82,16 +83,29 @@ public class TestCaseController extends BaseController {
} }
/** /**
* 执行用例 * 异步执行用例
*/ */
@Log(title = "用例", businessType = BusinessType.OTHER) @Log(title = "用例", businessType = BusinessType.OTHER)
@PostMapping("/run") @PostMapping("/run")
public AjaxResult run(@RequestBody IDQO qo) { public AjaxResult run(@RequestBody IDQO qo) {
log.info("执行用例 id:{}, jmeterHomePath:{}", qo.getId(), jmeterHomePath); log.info("执行用例 id:{}, jmeterHomePath:{}", qo.getId(), jmeterHomePath);
String caseSid = IdUtils.simpleUUID();
// 异步执行任务 // 异步执行任务
CompletableFuture.runAsync(() -> { CompletableFuture.runAsync(() -> {
testCaseService.executeTestCaseById(qo.getId(), jmeterHomePath); testCaseService.executeTestCaseById(qo.getId(), jmeterHomePath, caseSid);
}); });
return toAjax(true); return toAjax(true);
} }
/**
* 同步执行用例
*/
@Log(title = "用例", businessType = BusinessType.OTHER)
@PostMapping("/runSync")
public AjaxResult runSync(@RequestBody IDQO qo) {
log.info("同步执行用例 id:{}, jmeterHomePath:{}", qo.getId(), jmeterHomePath);
String caseSid = IdUtils.simpleUUID();
testCaseService.executeTestCaseById(qo.getId(), jmeterHomePath, caseSid);
return AjaxResult.success("执行成功", caseSid);
}
} }

View File

@@ -66,7 +66,8 @@ public interface ITestCaseService
* *
* @param id 用例主键id * @param id 用例主键id
* @param jmeterHomePath jmeter安装路径 * @param jmeterHomePath jmeter安装路径
* @param caseSid 用例执行uuid
* @return 是否成功 * @return 是否成功
*/ */
public String executeTestCaseById(Long id, String jmeterHomePath); public String executeTestCaseById(Long id, String jmeterHomePath, String caseSid);
} }

View File

@@ -1,6 +1,7 @@
package com.test.test.service.impl; package com.test.test.service.impl;
import com.test.common.utils.DateUtils; import com.test.common.utils.DateUtils;
import com.test.common.utils.uuid.IdUtils;
import com.test.test.domain.TestTask; import com.test.test.domain.TestTask;
import com.test.test.domain.TestTaskCase; import com.test.test.domain.TestTaskCase;
import com.test.test.domain.TestTaskResult; import com.test.test.domain.TestTaskResult;
@@ -139,11 +140,12 @@ public class TaskManagerService {
try { try {
// 测试用例执行逻辑 // 测试用例执行逻辑
log.info("Executing test case {} for task {}", testCaseId, taskId); log.info("Executing test case {} for task {}", testCaseId, taskId);
String result = testCaseService.executeTestCaseById(testCaseId, jmeterHomePath); String caseSid = IdUtils.simpleUUID();
String result = testCaseService.executeTestCaseById(testCaseId, jmeterHomePath, caseSid);
if (result==null && retry == 0) { if (result==null && retry == 0) {
if (retryCount != null && retryCount > 0) { if (retryCount != null && retryCount > 0) {
for (int i = 0; i < retryCount; i++) { for (int i = 0; i < retryCount; i++) {
result = testCaseService.executeTestCaseById(testCaseId, jmeterHomePath); result = testCaseService.executeTestCaseById(testCaseId, jmeterHomePath, caseSid);
if (result!=null) { if (result!=null) {
break; break;
} }

View File

@@ -9,7 +9,6 @@ import com.test.common.utils.JMeterUtil;
import com.test.common.utils.MySQLExecutor; import com.test.common.utils.MySQLExecutor;
import com.test.common.utils.StringUtils; import com.test.common.utils.StringUtils;
import com.test.common.utils.sql.TinyIntTypeAdapter; import com.test.common.utils.sql.TinyIntTypeAdapter;
import com.test.common.utils.uuid.IdUtils;
import com.test.test.domain.*; import com.test.test.domain.*;
import com.test.test.domain.qo.*; import com.test.test.domain.qo.*;
import com.test.test.mapper.TestCaseLogMapper; import com.test.test.mapper.TestCaseLogMapper;
@@ -132,10 +131,11 @@ public class TestCaseServiceImpl implements ITestCaseService
* *
* @param id 用例主键id * @param id 用例主键id
* @param jmeterHomePath jmeter安装路径 * @param jmeterHomePath jmeter安装路径
* @param caseSid 用例执行uuid
* @return 是否成功 * @return 是否成功
*/ */
@Override @Override
public String executeTestCaseById(Long id, String jmeterHomePath) { public String executeTestCaseById(Long id, String jmeterHomePath, String caseSid) {
TestCase testCase = this.selectTestCaseById(id); TestCase testCase = this.selectTestCaseById(id);
if (testCase == null || "2".equals(testCase.getDelFlag())) { if (testCase == null || "2".equals(testCase.getDelFlag())) {
log.error("用例计划已被删除,不能执行!"); log.error("用例计划已被删除,不能执行!");
@@ -145,9 +145,8 @@ public class TestCaseServiceImpl implements ITestCaseService
testCase.setContextResultMap(contextResultMap); testCase.setContextResultMap(contextResultMap);
TestCaseLog testCaseLog = new TestCaseLog(); TestCaseLog testCaseLog = new TestCaseLog();
testCaseLog.setCaseId(id); testCaseLog.setCaseId(id);
testCaseLog.setCreateTime(DateUtils.getNowDate()); testCaseLog.setOperTime(DateUtils.getNowDate());
testCaseLog.setOperType("执行"); testCaseLog.setOperType("执行");
String caseSid = IdUtils.simpleUUID();
testCaseLog.setCaseSid(caseSid); testCaseLog.setCaseSid(caseSid);
testCase.setCaseSid(caseSid); testCase.setCaseSid(caseSid);
List<TestCaseStep> testCaseStepList = testCaseStepService.selectTestCaseStepListByCaseId(id); List<TestCaseStep> testCaseStepList = testCaseStepService.selectTestCaseStepListByCaseId(id);
@@ -632,6 +631,12 @@ public class TestCaseServiceImpl implements ITestCaseService
} else { } else {
ruleResult.setResult("未通过"); ruleResult.setResult("未通过");
} }
} else if ("不等于".equals(fn)) {
if (!target.equals(value)) {
ruleResult.setResult("通过");
} else {
ruleResult.setResult("未通过");
}
} else { } else {
ruleResult.setResult("未通过"); ruleResult.setResult("未通过");
} }

View File

@@ -53,3 +53,13 @@ export function runCase(id) {
data: {id} data: {id}
}) })
} }
// 同步执行用例
export function runCaseSync(id) {
return request({
url: '/test/case/runSync',
method: 'post',
data: {id},
timeout: 60000
})
}

View File

@@ -178,6 +178,32 @@ export default {
let compareName = '${' + name + '}'; let compareName = '${' + name + '}';
return this.extract_object.some(obj => obj.value === compareName); return this.extract_object.some(obj => obj.value === compareName);
}, },
handleTableEdit(e, flag, scope) {
if (flag === "assignment") {
if (e && this.form.assignment.length === scope.$index + 1) {
this.form.assignment.push({
key: "",
value: ""
})
}
}
if (flag === "assertion") {
if (e && this.form.assertion.length === scope.$index + 1) {
this.form.assertion.push({
key: "",
value: ""
})
}
}
},
handleDelete(flag, scope) {
if (flag === "assignment") {
this.form.assignment.splice(scope.$index, 1)
}
if (flag === "assertion") {
this.form.assertion.splice(scope.$index, 1)
}
},
handleLogChange(val) { handleLogChange(val) {
const selectedItem = this.form.testCaseResultList.find(item => item.title === val); const selectedItem = this.form.testCaseResultList.find(item => item.title === val);
if (selectedItem) { if (selectedItem) {

View File

@@ -33,7 +33,7 @@
<script> <script>
import FolderPage from "@/components/FolderPage/index.vue"; import FolderPage from "@/components/FolderPage/index.vue";
import Report from "@/views/test/case/report/index.vue"; import Report from "@/views/test/case/report/index.vue";
import {addCase, delCase, listCase, runCase} from "@/api/test/case"; import {addCase, delCase, listCase, runCaseSync} from "@/api/test/case";
export default { export default {
name: "Case", name: "Case",
@@ -89,12 +89,14 @@ export default {
}); });
}, },
handleRun(id) { handleRun(id) {
this.loading = true;
this.$modal.confirm('是否确认执行用例?').then(function () { this.$modal.confirm('是否确认执行用例?').then(function () {
return runCase(id); return runCaseSync(id);
}).then((res) => { }).then((res) => {
this.$modal.msgSuccess("执行成功"); this.$modal.msgSuccess("执行成功");
this.caseSID = res.msg this.caseSID = res.data
this.open = true; this.open = true;
this.loading = false;
}); });
}, },
handleRowClick(row) { handleRowClick(row) {