Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
A
askbooks
Overview
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
齐文博
askbooks
Commits
124f8e6f
Commit
124f8e6f
authored
Nov 15, 2024
by
吴博
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
feat: [none] ws_auto_test
parent
73a9ad4b
Hide whitespace changes
Inline
Side-by-side
Showing
12 changed files
with
696 additions
and
1 deletions
+696
-1
pom.xml
pom.xml
+29
-0
Rays7WSCase.java
src/test/java/com/lemon/cases/Rays7WSCase.java
+62
-0
changjiangzuoyeserveCase.java
src/test/java/com/lemon/cases/changjiangzuoyeserveCase.java
+187
-0
Constants.java
src/test/java/com/lemon/constants/Constants.java
+2
-0
Case.java
src/test/java/com/lemon/pojo/Case.java
+50
-1
WebSocketFlowTest.java
src/test/java/com/lemon/testng/WebSocketFlowTest.java
+172
-0
WebSocketManager.java
src/test/java/com/lemon/testng/WebSocketManager.java
+120
-0
ExcelUtils.java
src/test/java/com/lemon/utils/ExcelUtils.java
+49
-0
Robot.java
src/test/java/com/lemon/utils/Robot.java
+24
-0
changjiangcase.xls
src/test/resources/changjiangcase.xls
+0
-0
paramas.properties
src/test/resources/paramas.properties
+1
-0
关键字.xlsx
src/test/resources/关键字.xlsx
+0
-0
No files found.
pom.xml
View file @
124f8e6f
...
...
@@ -254,6 +254,35 @@
<artifactId>
jenkins-client
</artifactId>
<version>
0.3.7
</version>
</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>
...
...
src/test/java/com/lemon/cases/Rays7WSCase.java
0 → 100644
View file @
124f8e6f
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
;
}
}
src/test/java/com/lemon/cases/changjiangzuoyeserveCase.java
0 → 100644
View file @
124f8e6f
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
;
}
}
src/test/java/com/lemon/constants/Constants.java
View file @
124f8e6f
...
...
@@ -50,4 +50,6 @@ public class Constants {
public
static
final
String
JDBC_PASSWORD
=
"C1euBfvS"
;
}
src/test/java/com/lemon/pojo/Case.java
View file @
124f8e6f
...
...
@@ -28,11 +28,20 @@ public class Case {
private
String
checkBSQL
;
@Excel
(
name
=
"B段预期结果"
)
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
(
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
.
desc
=
desc
;
this
.
params
=
params
;
...
...
@@ -42,6 +51,10 @@ public class Case {
this
.
aExpectValue
=
aExpectValue
;
this
.
checkBSQL
=
checkBSQL
;
this
.
bExpectValue
=
bExpectValue
;
this
.
stream
=
stream
;
this
.
messageCount
=
messageCount
;
this
.
passState
=
passState
;
this
.
actualValue
=
actualValue
;
}
public
String
getId
()
{
...
...
@@ -116,6 +129,38 @@ public class Case {
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
public
String
toString
()
{
return
"Case{"
+
...
...
@@ -128,6 +173,10 @@ public class Case {
", aExpectValue='"
+
aExpectValue
+
'\''
+
", checkBSQL='"
+
checkBSQL
+
'\''
+
", bExpectValue='"
+
bExpectValue
+
'\''
+
", stream="
+
stream
+
", messageCount="
+
messageCount
+
", passState="
+
passState
+
", actualValue='"
+
actualValue
+
'\''
+
'}'
;
}
}
src/test/java/com/lemon/testng/WebSocketFlowTest.java
0 → 100644
View file @
124f8e6f
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
();
}
}
}
src/test/java/com/lemon/testng/WebSocketManager.java
0 → 100644
View file @
124f8e6f
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
src/test/java/com/lemon/utils/ExcelUtils.java
View file @
124f8e6f
...
...
@@ -57,6 +57,29 @@ public class ExcelUtils {
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 {
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
()
{
FileInputStream
fis
=
null
;
...
...
src/test/java/com/lemon/utils/Robot.java
View file @
124f8e6f
...
...
@@ -166,4 +166,28 @@ public class Robot {
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()));
}*/
}
}
src/test/resources/changjiangcase.xls
0 → 100644
View file @
124f8e6f
File added
src/test/resources/paramas.properties
View file @
124f8e6f
...
...
@@ -2,5 +2,6 @@
${USER_LOGIN_NAME}=15927555348
${CURRENT_PASSWORD}=5ec0b6355d9a5fdb2996c5b9950cc1c6
${requeset_ws_url}=
wss
:
//wss.raysgo.com/chat/ws
src/test/resources/关键字.xlsx
View file @
124f8e6f
No preview for this file type
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment