fix(测试跟踪): 修复批量执行测试计划会偶发执行人错误的问题

--bug=1026019 --user=宋天阳 【测试跟踪】测试计划批量执行-报告执行人非当前执行人-任务中心不显示执行记录
https://www.tapd.cn/55049933/s/1369590
This commit is contained in:
song-tianyang 2023-05-08 11:33:57 +08:00 committed by 刘瑞斌
parent c266e9522a
commit 9139471fc8
8 changed files with 140 additions and 40 deletions

View File

@ -1,8 +1,7 @@
package io.metersphere.base.domain;
import lombok.Data;
import java.io.Serializable;
import lombok.Data;
@Data
public class TestPlanExecutionQueue implements Serializable {
@ -20,5 +19,7 @@ public class TestPlanExecutionQueue implements Serializable {
private Integer num;
private String executeUser;
private static final long serialVersionUID = 1L;
}

View File

@ -573,6 +573,76 @@ public class TestPlanExecutionQueueExample {
addCriterion("num not between", value1, value2, "num");
return (Criteria) this;
}
public Criteria andExecuteUserIsNull() {
addCriterion("execute_user is null");
return (Criteria) this;
}
public Criteria andExecuteUserIsNotNull() {
addCriterion("execute_user is not null");
return (Criteria) this;
}
public Criteria andExecuteUserEqualTo(String value) {
addCriterion("execute_user =", value, "executeUser");
return (Criteria) this;
}
public Criteria andExecuteUserNotEqualTo(String value) {
addCriterion("execute_user <>", value, "executeUser");
return (Criteria) this;
}
public Criteria andExecuteUserGreaterThan(String value) {
addCriterion("execute_user >", value, "executeUser");
return (Criteria) this;
}
public Criteria andExecuteUserGreaterThanOrEqualTo(String value) {
addCriterion("execute_user >=", value, "executeUser");
return (Criteria) this;
}
public Criteria andExecuteUserLessThan(String value) {
addCriterion("execute_user <", value, "executeUser");
return (Criteria) this;
}
public Criteria andExecuteUserLessThanOrEqualTo(String value) {
addCriterion("execute_user <=", value, "executeUser");
return (Criteria) this;
}
public Criteria andExecuteUserLike(String value) {
addCriterion("execute_user like", value, "executeUser");
return (Criteria) this;
}
public Criteria andExecuteUserNotLike(String value) {
addCriterion("execute_user not like", value, "executeUser");
return (Criteria) this;
}
public Criteria andExecuteUserIn(List<String> values) {
addCriterion("execute_user in", values, "executeUser");
return (Criteria) this;
}
public Criteria andExecuteUserNotIn(List<String> values) {
addCriterion("execute_user not in", values, "executeUser");
return (Criteria) this;
}
public Criteria andExecuteUserBetween(String value1, String value2) {
addCriterion("execute_user between", value1, value2, "executeUser");
return (Criteria) this;
}
public Criteria andExecuteUserNotBetween(String value1, String value2) {
addCriterion("execute_user not between", value1, value2, "executeUser");
return (Criteria) this;
}
}
public static class Criteria extends GeneratedCriteria {

View File

@ -28,5 +28,4 @@ public interface TestPlanExecutionQueueMapper {
int updateByPrimaryKeySelective(TestPlanExecutionQueue record);
int updateByPrimaryKey(TestPlanExecutionQueue record);
}

View File

@ -9,6 +9,7 @@
<result column="test_plan_id" jdbcType="VARCHAR" property="testPlanId" />
<result column="resource_id" jdbcType="VARCHAR" property="resourceId" />
<result column="num" jdbcType="INTEGER" property="num" />
<result column="execute_user" jdbcType="VARCHAR" property="executeUser" />
</resultMap>
<sql id="Example_Where_Clause">
<where>
@ -69,7 +70,7 @@
</where>
</sql>
<sql id="Base_Column_List">
id, report_id, run_mode, create_time, test_plan_id, resource_id, num
id, report_id, run_mode, create_time, test_plan_id, resource_id, num, execute_user
</sql>
<select id="selectByExample" parameterType="io.metersphere.base.domain.TestPlanExecutionQueueExample" resultMap="BaseResultMap">
select
@ -104,10 +105,10 @@
<insert id="insert" parameterType="io.metersphere.base.domain.TestPlanExecutionQueue">
insert into test_plan_execution_queue (id, report_id, run_mode,
create_time, test_plan_id, resource_id,
num)
num, execute_user)
values (#{id,jdbcType=VARCHAR}, #{reportId,jdbcType=VARCHAR}, #{runMode,jdbcType=VARCHAR},
#{createTime,jdbcType=BIGINT}, #{testPlanId,jdbcType=VARCHAR}, #{resourceId,jdbcType=VARCHAR},
#{num,jdbcType=INTEGER})
#{num,jdbcType=INTEGER}, #{executeUser,jdbcType=VARCHAR})
</insert>
<insert id="insertSelective" parameterType="io.metersphere.base.domain.TestPlanExecutionQueue">
insert into test_plan_execution_queue
@ -133,6 +134,9 @@
<if test="num != null">
num,
</if>
<if test="executeUser != null">
execute_user,
</if>
</trim>
<trim prefix="values (" suffix=")" suffixOverrides=",">
<if test="id != null">
@ -156,6 +160,9 @@
<if test="num != null">
#{num,jdbcType=INTEGER},
</if>
<if test="executeUser != null">
#{executeUser,jdbcType=VARCHAR},
</if>
</trim>
</insert>
<select id="countByExample" parameterType="io.metersphere.base.domain.TestPlanExecutionQueueExample" resultType="java.lang.Long">
@ -188,6 +195,9 @@
<if test="record.num != null">
num = #{record.num,jdbcType=INTEGER},
</if>
<if test="record.executeUser != null">
execute_user = #{record.executeUser,jdbcType=VARCHAR},
</if>
</set>
<if test="_parameter != null">
<include refid="Update_By_Example_Where_Clause" />
@ -201,7 +211,8 @@
create_time = #{record.createTime,jdbcType=BIGINT},
test_plan_id = #{record.testPlanId,jdbcType=VARCHAR},
resource_id = #{record.resourceId,jdbcType=VARCHAR},
num = #{record.num,jdbcType=INTEGER}
num = #{record.num,jdbcType=INTEGER},
execute_user = #{record.executeUser,jdbcType=VARCHAR}
<if test="_parameter != null">
<include refid="Update_By_Example_Where_Clause" />
</if>
@ -227,6 +238,9 @@
<if test="num != null">
num = #{num,jdbcType=INTEGER},
</if>
<if test="executeUser != null">
execute_user = #{executeUser,jdbcType=VARCHAR},
</if>
</set>
where id = #{id,jdbcType=VARCHAR}
</update>
@ -237,7 +251,8 @@
create_time = #{createTime,jdbcType=BIGINT},
test_plan_id = #{testPlanId,jdbcType=VARCHAR},
resource_id = #{resourceId,jdbcType=VARCHAR},
num = #{num,jdbcType=INTEGER}
num = #{num,jdbcType=INTEGER},
execute_user = #{executeUser,jdbcType=VARCHAR}
where id = #{id,jdbcType=VARCHAR}
</update>
</mapper>

View File

@ -50,37 +50,35 @@ public class TestPlanMessageService {
@Async
public void checkTestPlanStatusAndSendMessage(TestPlanReport report, TestPlanReportContentWithBLOBs testPlanReportContent, boolean sendMessage) {
if (report == null) {
return;
}
if (testPlanReportContent != null) {
report = testPlanReportService.checkTestPlanReportHasErrorCase(report, testPlanReportContent);
}
if (!report.getIsApiCaseExecuting() && !report.getIsPerformanceExecuting() && !report.getIsScenarioExecuting() && !report.getIsUiScenarioExecuting()) {
if (report != null && testPlanReportContent != null) {
// 异步发送通知需要指定调用其他服务的user
HttpHeaderUtils.runAsUser(report.getCreator());
//更新TestPlan状态为完成
TestPlanWithBLOBs testPlan = testPlanMapper.selectByPrimaryKey(report.getTestPlanId());
if (testPlan != null
&& !StringUtils.equalsAny(testPlan.getStatus(), TestPlanStatus.Completed.name(), TestPlanStatus.Finished.name())) {
testPlan.setStatus(calcTestPlanStatusWithPassRate(testPlan));
testPlanService.editTestPlan(testPlan);
}
try {
if (sendMessage && testPlan != null && StringUtils.equalsAny(report.getTriggerMode(),
ReportTriggerMode.MANUAL.name(),
ReportTriggerMode.API.name(),
ReportTriggerMode.SCHEDULE.name()) && !StringUtils.equalsIgnoreCase(report.getStatus(), ExecuteResult.TEST_PLAN_RUNNING.toString())
) {
//发送通知
this.sendMessage(testPlan, report, testPlan.getProjectId());
report = testPlanReportService.checkTestPlanReportHasErrorCase(report, testPlanReportContent);
if (!report.getIsApiCaseExecuting() && !report.getIsPerformanceExecuting() && !report.getIsScenarioExecuting() && !report.getIsUiScenarioExecuting()) {
//更新TestPlan状态为完成
TestPlanWithBLOBs testPlan = testPlanMapper.selectByPrimaryKey(report.getTestPlanId());
if (testPlan != null
&& !StringUtils.equalsAny(testPlan.getStatus(), TestPlanStatus.Completed.name(), TestPlanStatus.Finished.name())) {
testPlan.setStatus(calcTestPlanStatusWithPassRate(testPlan));
testPlanService.editTestPlan(testPlan);
}
if (sendMessage && testPlan != null && StringUtils.equalsAny(report.getTriggerMode(),
ReportTriggerMode.MANUAL.name(),
ReportTriggerMode.API.name(),
ReportTriggerMode.SCHEDULE.name()) && !StringUtils.equalsIgnoreCase(report.getStatus(), ExecuteResult.TEST_PLAN_RUNNING.toString())
) {
//发送通知
this.sendMessage(testPlan, report, testPlan.getProjectId());
}
}
} catch (Exception e) {
LogUtil.error(e);
LogUtil.error("检查测试计划状态出错", e);
} finally {
HttpHeaderUtils.clearUser();
}
}
}

View File

@ -683,6 +683,10 @@ public class TestPlanReportService {
Map jsonObject = JSON.parseMap(testPlan.getRunModeConfig());
TestPlanRequestUtil.changeStringToBoolean(jsonObject);
TestPlanRunRequest runRequest = JSON.parseObject(JSON.toJSONString(jsonObject), TestPlanRunRequest.class);
if (StringUtils.isNotBlank(testPlanExecutionQueue.getExecuteUser())) {
runRequest.setUserId(testPlanExecutionQueue.getExecuteUser());
}
runRequest.setTestPlanId(testPlanExecutionQueue.getTestPlanId());
runRequest.setReportId(testPlanExecutionQueue.getReportId());
runRequest.setTestPlanId(testPlan.getId());
try {

View File

@ -474,8 +474,7 @@ public class TestPlanService {
}
});
testPlan.setTotal(testPlan.getTotal() + execResults.size());
} catch (MSException e) {
LogUtil.error(e);
} catch (MSException ignore) {
}
}
@ -527,6 +526,7 @@ public class TestPlanService {
/**
* 异步将测试计划的状态置为已结束
*
* @param changeToFinishedIds
*/
@Async
@ -2159,6 +2159,7 @@ public class TestPlanService {
executionQueue.setRunMode(request.getMode());
executionQueue.setResourceId(resourceId);
executionQueue.setNum(nextNum[0]);
executionQueue.setExecuteUser(request.getUserId());
nextNum[0]++;
planExecutionQueues.add(executionQueue);
});
@ -2174,6 +2175,10 @@ public class TestPlanService {
Map jsonObject = JSON.parseMap(testPlan.getRunModeConfig());
TestPlanRequestUtil.changeStringToBoolean(jsonObject);
TestPlanRunRequest runRequest = JSON.parseObject(JSON.toJSONString(jsonObject), TestPlanRunRequest.class);
if (StringUtils.isNotBlank(planExecutionQueue.getExecuteUser())) {
runRequest.setUserId(planExecutionQueue.getExecuteUser());
}
runRequest.setTestPlanId(planExecutionQueue.getTestPlanId());
runRequest.setReportId(planExecutionQueue.getReportId());
runPlan(runRequest);
} else {

View File

@ -0,0 +1,8 @@
SET SESSION innodb_lock_wait_timeout = 7200;
-- 队列增加执行人
ALTER TABLE test_plan_execution_queue
ADD COLUMN `execute_user` VARCHAR(50);
SET SESSION innodb_lock_wait_timeout = DEFAULT;