Commit 124f8e6f by 吴博

feat: [none] ws_auto_test

parent 73a9ad4b
...@@ -254,6 +254,35 @@ ...@@ -254,6 +254,35 @@
<artifactId>jenkins-client</artifactId> <artifactId>jenkins-client</artifactId>
<version>0.3.7</version> <version>0.3.7</version>
</dependency> </dependency>
<dependency>
<groupId>org.java-websocket</groupId>
<artifactId>Java-WebSocket</artifactId>
<version>1.5.2</version>
</dependency>
<!-- https://mvnrepository.com/artifact/cn.hutool/hutool-all -->
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.8.33</version>
</dependency>
<dependency>
<groupId>com.pcloud.common</groupId>
<artifactId>llm-cockpit-api</artifactId>
<version>3.1.1-RELEASE</version>
</dependency>
<dependency>
<groupId>com.pcloud.service</groupId>
<artifactId>llm-cockpit-client</artifactId>
<version>3.1.1-RELEASE</version>
</dependency>
</dependencies> </dependencies>
......
package com.lemon.cases;
import io.qameta.allure.Description;
import org.apache.http.Header;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.util.EntityUtils;
import org.testng.Assert;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
import java.util.Arrays;
public class Rays7WSCase extends BaseCase {
@Test(dataProvider = "datas0")
@Description("执行RAYS7服务")
public void testManager(int id, String casename, String url, String json,String expectValue) throws Exception {
// String token = "430f837c00f9978dffec9d4c0c05c751";
// 创建post请求
HttpPost post= new HttpPost(url);
post.setHeader("Content-Type", "application/json;charset=UTF-8");
post.setHeader("Authorization", "Bearer");
post.setEntity(new StringEntity(json, "UTF-8"));
DefaultHttpClient client = new DefaultHttpClient();
// 执行get请求,并使用response来存放执行后返回的响应内容
HttpResponse response = client.execute(post);
Header[] header = response.getAllHeaders(); // 响应头
System.out.println("请求链接:"+url);
System.out.println("请求参数:"+json);
System.out.print("id:" + id + "\n"+ "casename:" + casename+ "\n");
System.out.print("响应头信息:::" + Arrays.toString(header) + "\n");
int status = response.getStatusLine().getStatusCode();
System.out.print("状态码:::" + status + "\n");
HttpEntity entity = response.getEntity(); // 响应体
String body = EntityUtils.toString(entity);
System.out.print("预期结果: " + expectValue+ "\n");
System.out.print("响应结果: " + body+ "\n");
Boolean assertResponseFlag = assertRespon(expectValue, body);
String assertContent = (assertResponseFlag) ? "Pass" : "Fail";
System.out.print("assertContent:"+assertContent);
Assert.assertEquals(assertContent, "Pass");
}
@DataProvider(name = "datas0")
public Object[][] datas0() {
//Object[m][n] m代表执行次数,n代表参数个数
Object[][] datas = {
{0, "", "https://adviser.raysgo.com/aibrain/v1.0/digitalRange/testManager",
"{\"event\":\"SDK_MSG_REPORT\",\"origin\":\"WECHAT_H5\",\"wxSdkMsgDTO\":{\"clientHost\":\"192.168.92.114\",\"clientPort\":59634,\"content\":{\"textMsgDTO\":{\"content\":\"答案2\"}},\"contentType\":\"Text\",\"conversationId\":\"143773987\",\"digitalPersonId\":2174,\"language\":\"zh-CN\",\"messageMetaId\":4252464657572101,\"msgRemoteId\":\"4252464657572100\",\"sdkCode\":\"23\",\"senderSdkCode\":\"143773987\",\"serverHost\":\"192.168.92.118\",\"serverPort\":9000,\"userId\":143773987}}"
,"{\"errCode\":0,\"message\":\"操作成功!\"}"}, // RAYS跳RAYS
};
return datas;
}
}
package com.lemon.cases;
import cn.hutool.core.lang.UUID;
import cn.hutool.core.thread.ThreadUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.lemon.constants.Constants;
import com.lemon.pojo.API;
import com.lemon.pojo.Case;
import com.lemon.pojo.TestRecord;
import com.lemon.testng.WebSocketManager;
import com.lemon.utils.ExcelUtils;
import com.lemon.utils.SqlUtils;
import com.pcloud.llm.cockpit.api.domain.dto.request.DifyRequestFile;
import com.pcloud.llm.cockpit.api.domain.dto.request.WorkflowRequestBody;
import com.pcloud.llm.cockpit.api.domain.dto.response.CompletionResponse;
import com.pcloud.llm.cockpit.client.DifyClient;
import org.apache.http.client.utils.DateUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.testng.Assert;
import org.testng.annotations.AfterClass;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
import java.net.URISyntaxException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
import static com.lemon.utils.Robot.sendAlarm;
@Component
public class changjiangzuoyeserveCase extends BaseCase {
private WebSocketManager webSocketManager;
@Autowired
private DifyClient difyClient;
//excel用例路径
public static final String EXCEL_PATH = "src/test/resources/changjiangcase.xls";
private static final String ramdonUserId = UUID.randomUUID().toString();
private String caseTraceId;
@BeforeClass()
public void setup() throws URISyntaxException {
webSocketManager = new WebSocketManager();
webSocketManager.connect();
}
@Test(dataProvider = "data1", priority = 1, description = "接收event-3响应")
public void testSendEvent2AndReceiveEvent3(Case cas) {
try {
caseTraceId = UUID.randomUUID().toString();
log.info(caseTraceId + caseTraceId + "本次执行的case是:" + JSONUtil.toJsonStr(cas) + "caseTraceId是" + caseTraceId);
webSocketManager.messageCount = cas.getMessageCount();
// 设置 latch,等待服务端 event-3 响应
webSocketManager.latch4Event3 = new CountDownLatch(1);
// 定义 requestId,发送 event-2 消息时使用,并在接收 event-3 时验证
String event2Message = "{\"event\":2,\"sendType\":0,\"userId\":\"143773987\",\"officialAccountsId\":997,\"messageBody\":\"{\\\"contentType\\\":\\\"Text\\\",\\\"content\\\":{\\\"textMsgDTO\\\":{\\\"content\\\":\\\"一起学中文\\\"}},\\\"digitalPersonId\\\":\\\"2938\\\",\\\"language\\\":\\\"zh-CN\\\",\\\"chatTypeEnum\\\":\\\"\\\"}\",\"origin\":\"WEB_H5\",\"bookId\":\"12597711\",\"requestId\":\"W5dI5aII\"}";
log.info(caseTraceId + "发送event2的消息是" + event2Message);
JSONObject sendJson = JSONUtil.parseObj(event2Message);
webSocketManager.sendMessage(event2Message);
webSocketManager.expectedRequestId = sendJson.getStr("requestId");
log.info(caseTraceId + "expectedRequestId是" + webSocketManager.expectedRequestId);
// 等待最多 10 秒
boolean event3Received = webSocketManager.latch4Event3.await(60, TimeUnit.SECONDS);
Assert.assertTrue(event3Received, "未在规定时间内收到 event-3 响应");
log.info(caseTraceId + "收到的msgRemoteId是: " + webSocketManager.msgRemoteId);
// 验证 msgRemoteId 非空
Assert.assertNotNull(webSocketManager.msgRemoteId, "msgRemoteId 不应为空");
// 验证 event-3 的 requestId 是否匹配
log.info(caseTraceId + "receivedRequestId 是: " + webSocketManager.receivedRequestId + "expectedRequestId 是: " + webSocketManager.expectedRequestId);
Assert.assertEquals(webSocketManager.receivedRequestId, webSocketManager.expectedRequestId, "收到的 requestId 不匹配");
} catch (Exception e) {
log.info(caseTraceId + "testSendEvent2AndReceiveEvent3,WebSocket出错: " + e.getMessage());
}
}
@Test(dataProvider = "data1", priority = 2, dependsOnMethods = "testSendEvent2AndReceiveEvent3", description = "接收event-5响应")
public void testReceiveEvent5Responses(Case cas) {
try {
// 设置 latch,等待服务端 event-5 响应
webSocketManager.latch4Event5 = new CountDownLatch(webSocketManager.messageCount);
// 等待并验证 event-5 消息
boolean event5Received = webSocketManager.latch4Event5.await(60, TimeUnit.SECONDS);
Assert.assertTrue(event5Received, "未在规定时间内收到 event-5 响应");
// 验证 event-5 消息的内容
log.info(caseTraceId + "event5 收到的消息是: " + JSONUtil.toJsonStr(webSocketManager.event5Messages));
/*
addWBD(Integer.parseInt(cas.getId()), Constants.ASSERT_RESULT_CELL_NUM, "");
*/
Assert.assertNotNull(webSocketManager.event5Messages, "event-5 消息不应为空");
cas.setActualValue(JSONUtil.toJsonStr(webSocketManager.event5Messages));
cas.setPassState(cas.getExpectValue().equals(cas.getActualValue()) ? 1 : 0);
} catch (Exception e) {
log.info(caseTraceId + "testReceiveEvent5Responses,WebSocket出错: " + e.getMessage());
} finally {
// 同时将测试结果新增到数据库中
TestRecord testRecord = new TestRecord();
testRecord.setCaseId(Integer.valueOf(cas.getId()));
testRecord.setCaseDesc(cas.getDesc());
testRecord.setInquiry(cas.getParams());
testRecord.setExpectContent(cas.getExpectValue());
testRecord.setInputContent(cas.getParams());
testRecord.setOutputContent(JSONUtil.toJsonStr(webSocketManager.event5Messages));
testRecord.setState(cas.getPassState());
testRecord.setTestVersion(DateUtils.formatDate(new Date(), "yyyyMMdd HH:mm"));
testRecord.setCreateTime(new Date());
testRecord.setUpdateTime(new Date());
testRecord.setIsDelete(0);
// SqlUtils.insertTestRecord(testRecord);
// 如果失败则发送消息提醒
if (cas.getPassState() == null || cas.getPassState() == 0)
sendAlarm(cas.getParams());
}
}
@AfterClass
public void tearDown() {
// 关闭连接
webSocketManager.close();
// 将执行结果发给模型进行判断用例是否通过
List<Case> caseList4Excel = ExcelUtils.read(EXCEL_PATH, 0, Case.class);
// 转换为只保留指定字段的 JSON 数组
List<JSONObject> filteredList = new ArrayList<>();
for (Case item : caseList4Excel) {
// 构造一个只包含所需字段的 JSONObject
JSONObject jsonObject = new JSONObject();
jsonObject.putOpt("id", item.getId());
jsonObject.putOpt("expectValue", item.getExpectValue());
jsonObject.putOpt("actualValue", item.getActualValue());
filteredList.add(jsonObject);
}
// 转换为 JSON 字符串
String jsonStr = JSONUtil.toJsonStr(filteredList);
log.info(caseTraceId + "本次执行的测试结果是: " + jsonStr);
//调用dify
Map<String, Object> inputs = Maps.newHashMap();
inputs.put("inquery", jsonStr);
WorkflowRequestBody requestBody = WorkflowRequestBody.builder().user(ramdonUserId).inputs(inputs).build();
log.info(caseTraceId + "调用dify请求参数:" + JSONUtil.toJsonStr(requestBody));
int count = 0;
String res = "";
try {
do {
CompletionResponse aiTopicScience = difyClient.workflowsRunBlocking("ai_autotest", requestBody);
Map<String, Object> outputs = aiTopicScience.getData().getOutputs();
res = (String) outputs.get("result");
if (count > 3) {
log.info(caseTraceId + "没有返回指定内容,dify调用开始重试" + com.alibaba.fastjson.JSONObject.toJSONString(requestBody));
break;
}
int finalCount = count;
ThreadUtil.safeSleep(1 + finalCount * 2L);
count++;
} while (!StrUtil.containsAny(res, "考查知识", "解题思路", "分步骤讲解"));
} catch (Exception e) {
log.warn("请求dify异常:{}" + e.getMessage());
}
log.info(caseTraceId + "dify返回的内容======>{}" + res);
}
@DataProvider(name = "data1")
public Object[][] data1() {
Object[][] totalCase = ExcelUtils.getTotalCase(EXCEL_PATH);
return totalCase;
}
}
...@@ -50,4 +50,6 @@ public class Constants { ...@@ -50,4 +50,6 @@ public class Constants {
public static final String JDBC_PASSWORD = "C1euBfvS"; public static final String JDBC_PASSWORD = "C1euBfvS";
} }
...@@ -28,11 +28,20 @@ public class Case { ...@@ -28,11 +28,20 @@ public class Case {
private String checkBSQL; private String checkBSQL;
@Excel(name = "B段预期结果") @Excel(name = "B段预期结果")
private String bExpectValue; private String bExpectValue;
@Excel(name = "是否流式")
private Boolean stream;
@Excel(name = "消息条数")
private Integer messageCount;
@Excel(name = "是否验证通过")
private Integer passState;
@Excel(name = "实际响应数据")
private String actualValue;
public Case() { public Case() {
} }
public Case(String id, String desc, String params, String apiID, String expectValue, String checkSQL, String aExpectValue, String checkBSQL, String bExpectValue) { public Case(String id, String desc, String params, String apiID, String expectValue, String checkSQL, String aExpectValue,
String checkBSQL, String bExpectValue,Boolean stream, Integer messageCount,Integer passState,String actualValue) {
this.id = id; this.id = id;
this.desc = desc; this.desc = desc;
this.params = params; this.params = params;
...@@ -42,6 +51,10 @@ public class Case { ...@@ -42,6 +51,10 @@ public class Case {
this.aExpectValue = aExpectValue; this.aExpectValue = aExpectValue;
this.checkBSQL = checkBSQL; this.checkBSQL = checkBSQL;
this.bExpectValue = bExpectValue; this.bExpectValue = bExpectValue;
this.stream = stream;
this.messageCount = messageCount;
this.passState = passState;
this.actualValue = actualValue;
} }
public String getId() { public String getId() {
...@@ -116,6 +129,38 @@ public class Case { ...@@ -116,6 +129,38 @@ public class Case {
this.bExpectValue = bExpectValue; this.bExpectValue = bExpectValue;
} }
public Boolean getStream() {
return stream;
}
public void setStream(Boolean stream) {
this.stream = stream;
}
public Integer getMessageCount() {
return messageCount;
}
public void setMessageCount(Integer messageCount) {
this.messageCount = messageCount;
}
public Integer getPassState() {
return passState;
}
public void setPassState(Integer passState) {
this.passState = passState;
}
public String getActualValue() {
return actualValue;
}
public void setActualValue(String actualValue) {
this.actualValue = actualValue;
}
@Override @Override
public String toString() { public String toString() {
return "Case{" + return "Case{" +
...@@ -128,6 +173,10 @@ public class Case { ...@@ -128,6 +173,10 @@ public class Case {
", aExpectValue='" + aExpectValue + '\'' + ", aExpectValue='" + aExpectValue + '\'' +
", checkBSQL='" + checkBSQL + '\'' + ", checkBSQL='" + checkBSQL + '\'' +
", bExpectValue='" + bExpectValue + '\'' + ", bExpectValue='" + bExpectValue + '\'' +
", stream=" + stream +
", messageCount=" + messageCount +
", passState=" + passState +
", actualValue='" + actualValue + '\'' +
'}'; '}';
} }
} }
package com.lemon.testng;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import org.java_websocket.client.WebSocketClient;
import org.java_websocket.handshake.ServerHandshake;
import org.testng.Assert;
import org.testng.annotations.AfterClass;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
public class WebSocketFlowTest {
private WebSocketClient webSocketClient;
private CountDownLatch latch4Event3;
private CountDownLatch latch4Event5;
private String msgRemoteId;
private String receivedRequestId;
private String expectedRequestId;
// 创建定时任务发送心跳消息
private ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
private List<String> event5Messages = new ArrayList<>();
Integer messageCount;
@BeforeClass
public void setup() throws URISyntaxException, InterruptedException {
// 初始化 WebSocket 客户端并连接
webSocketClient = new WebSocketClient(new URI("wss://wss.raysgo.com/chat/ws")) {
@Override
public void onOpen(ServerHandshake handshake) {
System.out.println("WebSocket连接已打开");
System.out.println("连接状态: " + webSocketClient.isOpen());
}
@Override
public void onMessage(String message) {
System.out.println("收到消息: " + message);
JSONObject receiveJson = JSONUtil.parseObj(message);
Integer event = receiveJson.getInt("event");
if (null == event) {
System.out.println("event为null,消息异常不处理");
return;
}
JSONObject messageBody = receiveJson.getJSONObject("messageBody");
if (event == 3) {
// 提取并验证 requestId
receivedRequestId = receiveJson.getStr("requestId");
System.out.println("receivedRequestId是" + receivedRequestId + "、expectedRequestId是" + expectedRequestId);
if (receivedRequestId.equals(expectedRequestId)) {
if (null == messageBody) {
System.out.println("messageBody为null,消息异常不处理");
return;
}
msgRemoteId = messageBody.getStr("msgRemoteId");
latch4Event3.countDown();
}
} else if (event == 5) {
// 处理 event-5 消息
if (null == messageBody) {
System.out.println("messageBody为null,消息异常不处理");
return;
}
String msgRemoteId4Event5 = messageBody.getStr("msgRemoteId");
Boolean stream = messageBody.getBool("stream");
if (msgRemoteId.equals(msgRemoteId4Event5)) {
latch4Event5.countDown(); // 结束接受消息
}
if(!stream) {
event5Messages.add(messageBody.getStr("message"));
latch4Event5.countDown(); // 每条非流式消息执行一次
}
}
}
@Override
public void onClose(int code, String reason, boolean remote) {
System.out.println("WebSocket连接已关闭,原因: " + reason);
}
@Override
public void onError(Exception ex) {
System.out.println("WebSocket出错: " + ex.getMessage());
}
};
webSocketClient.connect();
// 等待连接成功
while (!webSocketClient.isOpen()) {
Thread.sleep(100);
}
}
@Test(priority = 1)
public void testSendEvent2AndReceiveEvent3() throws Exception {
try {
messageCount = 2;
// 设置 latch,等待服务端 event-3 响应
latch4Event3 = new CountDownLatch(1);
// 定义 requestId,发送 event-2 消息时使用,并在接收 event-3 时验证
String event2Message = "{\"event\":2,\"sendType\":0,\"userId\":\"143773987\",\"officialAccountsId\":997,\"messageBody\":\"{\\\"contentType\\\":\\\"Text\\\",\\\"content\\\":{\\\"textMsgDTO\\\":{\\\"content\\\":\\\"一起学中文\\\"}},\\\"digitalPersonId\\\":\\\"2938\\\",\\\"language\\\":\\\"zh-CN\\\",\\\"chatTypeEnum\\\":\\\"\\\"}\",\"origin\":\"WEB_H5\",\"bookId\":\"12597711\",\"requestId\":\"W5dI5aII\"}";
System.out.println("发送event2的消息是" + event2Message);
JSONObject sendJson = JSONUtil.parseObj(event2Message);
webSocketClient.send(event2Message);
expectedRequestId = sendJson.getStr("requestId");
System.out.println("expectedRequestId是" + expectedRequestId);
// 等待最多 10 秒
boolean event3Received = latch4Event3.await(10, TimeUnit.SECONDS);
Assert.assertTrue(event3Received, "未在规定时间内收到 event-3 响应");
System.out.println("收到的msgRemoteId是: " + msgRemoteId);
// 验证 msgRemoteId 非空
Assert.assertNotNull(msgRemoteId, "msgRemoteId 不应为空");
// 验证 event-3 的 requestId 是否匹配
System.out.println("receivedRequestId 是: " + receivedRequestId + "expectedRequestId 是: " + expectedRequestId);
Assert.assertEquals(receivedRequestId, expectedRequestId, "收到的 requestId 不匹配");
} catch (Exception e) {
webSocketClient.close();
System.out.println("testSendEvent2AndReceiveEvent3,WebSocket出错: " + e.getMessage());
throw new Exception(e);
}
}
@Test(priority = 2, dependsOnMethods = "testSendEvent2AndReceiveEvent3")
public void testReceiveEvent5Responses() throws Exception {
try {
// 设置 latch,等待服务端 event-5 响应
latch4Event5 = new CountDownLatch(messageCount);
// 等待并验证 event-5 消息
boolean event5Received = latch4Event5.await(20, TimeUnit.SECONDS);
Assert.assertTrue(event5Received, "未在规定时间内收到 event-5 响应");
// 验证 event-5 消息的内容
System.out.println("event5 收到的消息是: " + JSONUtil.toJsonStr(event5Messages));
Assert.assertNotNull(event5Messages, "event-5 消息不应为空");
} catch (Exception e) {
webSocketClient.close();
System.out.println("testReceiveEvent5Responses,WebSocket出错: " + e.getMessage());
throw new Exception(e);
}
}
@AfterClass
public void tearDown() {
System.out.println("执行tearDown");
// 关闭 WebSocket 连接
if (webSocketClient != null) {
System.out.println("执行 webSocketClient.close");
webSocketClient.close();
}
}
}
package com.lemon.testng;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import com.lemon.utils.AuthorizationUtils;
import org.apache.log4j.Logger;
import org.java_websocket.client.WebSocketClient;
import org.java_websocket.handshake.ServerHandshake;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
public class WebSocketManager {
// 日志
public static Logger log = Logger.getLogger(WebSocketManager.class);
public WebSocketClient webSocketClient;
public CountDownLatch latch4Event3;
public CountDownLatch latch4Event5;
public String msgRemoteId;
public String receivedRequestId;
public String expectedRequestId;
// 创建定时任务发送心跳消息
public ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
public List<String> event5Messages = new ArrayList<>();
public Integer messageCount;
public WebSocketManager() throws URISyntaxException {
String requestWsUrl = AuthorizationUtils.env.get("request_ws_url");
requestWsUrl = StrUtil.isBlank(requestWsUrl) ? "wss://wss.raysgo.com/chat/ws" : requestWsUrl;
webSocketClient = new WebSocketClient(new URI(requestWsUrl)) {
@Override
public void onOpen(ServerHandshake handshake) {
log.info("WebSocket连接已打开");
scheduler.scheduleAtFixedRate(() -> {
String heartbeatMessage = "{\"event\":0,\"sendType\":0,\"userId\":\"143773987\",\"officialAccountsId\":23,\"messageBody\":\"\",\"origin\":\"WEB_H5\",\"bookId\":\"12597711\"}";
webSocketClient.send(heartbeatMessage);
log.info("发送心跳消息: " + heartbeatMessage);
}, 3, 5, TimeUnit.SECONDS);
}
@Override
public void onMessage(String message) {
log.info("收到消息: " + message);
JSONObject receiveJson = JSONUtil.parseObj(message);
Integer event = receiveJson.getInt("event");
if (null == event) {
log.info("event为null,消息异常不处理");
return;
}
JSONObject messageBody = receiveJson.getJSONObject("messageBody");
if (event == 3) {
// 提取并验证 requestId
receivedRequestId = receiveJson.getStr("requestId");
log.info("receivedRequestId是" + receivedRequestId + "、expectedRequestId是" + expectedRequestId);
if (receivedRequestId.equals(expectedRequestId)) {
if (null == messageBody) {
log.info("messageBody为null,消息异常不处理");
return;
}
msgRemoteId = messageBody.getStr("msgRemoteId");
latch4Event3.countDown();
}
} else if (event == 5) {
// 处理 event-5 消息
if (null == messageBody) {
log.info("messageBody为null,消息异常不处理");
return;
}
String msgRemoteId4Event5 = messageBody.getStr("msgRemoteId");
Boolean stream = messageBody.getBool("stream");
if (msgRemoteId.equals(msgRemoteId4Event5)) {
latch4Event5.countDown(); // 结束接受消息
}
if(!stream) {
event5Messages.add(messageBody.getStr("message"));
latch4Event5.countDown(); // 每条非流式消息执行一次
}
}
}
@Override
public void onClose(int code, String reason, boolean remote) {
log.info("WebSocket连接已关闭,原因: " + reason);
}
@Override
public void onError(Exception ex) {
log.info("WebSocket出错: " + ex.getMessage());
}
};
}
public void connect() {
webSocketClient.connect();
// 等待连接成功逻辑可以添加在这里
}
public void sendMessage(String message) {
webSocketClient.send(message);
}
public void close() {
webSocketClient.close();
}
}
\ No newline at end of file
...@@ -57,6 +57,29 @@ public class ExcelUtils { ...@@ -57,6 +57,29 @@ public class ExcelUtils {
return null; return null;
} }
public static <E> List<E> read(String filePath,int startSheetIndex, Class<E> clazz) {
// 定义泛型 决定E的类型
FileInputStream fis = null;
try {
// 1、创建流,加载Excel文件
fis = new FileInputStream(filePath);
// 2、导入配置,创建空对象相当于用默认配置
ImportParams params = new ImportParams();
// 3、设置sheet页
params.setStartSheetIndex(startSheetIndex);
// 4、是否需要进行excel验证,判断某个字段是否为空,若为空则过滤
params.setNeedVerify(true);
// 4、执行导入excel文件
List<E> list = ExcelImportUtil.importExcel(fis, clazz, params);
return list;
} catch (Exception e) {
e.printStackTrace();
} finally {
close(fis);
}
return null;
}
/** /**
* 流关闭方法 * 流关闭方法
* *
...@@ -162,6 +185,32 @@ public class ExcelUtils { ...@@ -162,6 +185,32 @@ public class ExcelUtils {
return datas; return datas;
} }
/*
* 从已经读取很多所有list<API>和所有list<Case>
* 两个集合中获取符合条件的数据
*/
public static Object[][] getTotalCase(String filePath) {
List<Case> caseList4Excel = read(filePath,0, Case.class);
List<Parameter> parameterList4Excel = read(filePath,1, Parameter.class);
// 匹配Case对象
for (Case aCase : caseList4Excel) {
//从parameter参数替换中将数据替换到case中
for (Parameter parameter : parameterList4Excel) {
if (aCase.getParams().contains(parameter.getParams())) {
String params = parameter.getParams();
String replace = aCase.getParams().replace(params, parameter.getData());
aCase.setParams(replace); // 替换到参数中
}
}
}
Object[][] datas = new Object[caseList4Excel.size()][1];
for (int i = 0; i < caseList4Excel.size(); i++) {
datas[i][0] = caseList4Excel.get(i);
}
return datas;
}
public static Object[][] readTwo() { public static Object[][] readTwo() {
FileInputStream fis = null; FileInputStream fis = null;
......
...@@ -166,4 +166,28 @@ public class Robot { ...@@ -166,4 +166,28 @@ public class Robot {
sendRobotMessage(); sendRobotMessage();
} }
public static void sendAlarm(String inquiry) {
/*
Long chatUserId = null;
String msgRemoteId = null;
String origin =null;
Long digitalPersonId =null;
Long bookId = null;
StringBuilder sb = new StringBuilder();
sb.append("案例书自动化测试结果异常告警").append("\n");
sb.append("<@").append("599").append(">\n");
sb.append("> 环境:").append(MessageBuilder.comment("prod")).append("\t").append(MessageBuilder.comment(null)).append("\n");
sb.append("> 用户输入:").append(MessageBuilder.comment(inquiry)).append("\n");
sb.append("> 消息到达的节点描述:").append("案例书_长江作业本").append("\n");
sb.append("> Time:").append(MessageBuilder.comment(MessageBuilder.format(new Date()))).append("\n");
String alarmKey = "7782a9ad-817a-4b7e-9745-b2b173ddc04a";
if (StringUtils.isNotBlank(alarmKey)) {
log.info("发送告警消息:" +sb.toString());
// WeworkRobotSender.asyncSend(alarmKey, MessageBuilder.buildMarkdown(sb.toString()));
}*/
}
} }
...@@ -2,5 +2,6 @@ ...@@ -2,5 +2,6 @@
${USER_LOGIN_NAME}=15927555348 ${USER_LOGIN_NAME}=15927555348
${CURRENT_PASSWORD}=5ec0b6355d9a5fdb2996c5b9950cc1c6 ${CURRENT_PASSWORD}=5ec0b6355d9a5fdb2996c5b9950cc1c6
${requeset_ws_url}=wss://wss.raysgo.com/chat/ws
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment