feat (接口自动化): 完成用例和场景调试部分功能 #1001749
This commit is contained in:
parent
e6bffa7436
commit
87d6833400
|
@ -429,6 +429,11 @@
|
||||||
<artifactId>json-path</artifactId>
|
<artifactId>json-path</artifactId>
|
||||||
<version>2.4.0</version>
|
<version>2.4.0</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.java-websocket</groupId>
|
||||||
|
<artifactId>Java-WebSocket</artifactId>
|
||||||
|
<version>1.3.5</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
</dependencies>
|
</dependencies>
|
||||||
|
|
||||||
|
|
|
@ -17,10 +17,13 @@
|
||||||
|
|
||||||
package io.metersphere.api.jmeter;
|
package io.metersphere.api.jmeter;
|
||||||
|
|
||||||
|
import com.alibaba.fastjson.JSON;
|
||||||
import io.metersphere.api.dto.RunningParamKeys;
|
import io.metersphere.api.dto.RunningParamKeys;
|
||||||
import io.metersphere.api.service.MsResultService;
|
import io.metersphere.api.service.MsResultService;
|
||||||
import io.metersphere.commons.utils.CommonBeanFactory;
|
import io.metersphere.commons.utils.CommonBeanFactory;
|
||||||
import io.metersphere.commons.utils.LogUtil;
|
import io.metersphere.commons.utils.LogUtil;
|
||||||
|
import io.metersphere.websocket.c.to.c.MsWebSocketClient;
|
||||||
|
import io.metersphere.websocket.c.to.c.util.MsgDto;
|
||||||
import org.apache.commons.collections4.CollectionUtils;
|
import org.apache.commons.collections4.CollectionUtils;
|
||||||
import org.apache.commons.lang3.StringUtils;
|
import org.apache.commons.lang3.StringUtils;
|
||||||
import org.apache.jmeter.engine.util.NoThreadClone;
|
import org.apache.jmeter.engine.util.NoThreadClone;
|
||||||
|
@ -49,6 +52,8 @@ public class MsResultCollector extends AbstractListenerElement implements Sample
|
||||||
|
|
||||||
private MsResultService msResultService;
|
private MsResultService msResultService;
|
||||||
|
|
||||||
|
private MsWebSocketClient client;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Object clone() {
|
public Object clone() {
|
||||||
MsResultCollector clone = (MsResultCollector) super.clone();
|
MsResultCollector clone = (MsResultCollector) super.clone();
|
||||||
|
@ -95,6 +100,11 @@ public class MsResultCollector extends AbstractListenerElement implements Sample
|
||||||
SampleResult result = new SampleResult();
|
SampleResult result = new SampleResult();
|
||||||
result.setResponseCode(TEST_END);
|
result.setResponseCode(TEST_END);
|
||||||
msResultService.setCache(this.getName(), result);
|
msResultService.setCache(this.getName(), result);
|
||||||
|
try {
|
||||||
|
client.close();
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -104,6 +114,12 @@ public class MsResultCollector extends AbstractListenerElement implements Sample
|
||||||
if (msResultService == null) {
|
if (msResultService == null) {
|
||||||
LogUtil.error("testResultService is required");
|
LogUtil.error("testResultService is required");
|
||||||
}
|
}
|
||||||
|
try {
|
||||||
|
client = new MsWebSocketClient("ws://127.0.0.1:8081/ws/" + "send." + this.getName());
|
||||||
|
client.connect();
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -118,6 +134,16 @@ public class MsResultCollector extends AbstractListenerElement implements Sample
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void sampleStarted(SampleEvent e) {
|
public void sampleStarted(SampleEvent e) {
|
||||||
|
System.out.println("start ====");
|
||||||
|
try {
|
||||||
|
MsgDto dto = new MsgDto();
|
||||||
|
dto.setContent(e.getThreadGroup());
|
||||||
|
dto.setReportId("send." + this.getName());
|
||||||
|
dto.setToReport(this.getName());
|
||||||
|
client.send(JSON.toJSONString(dto));
|
||||||
|
} catch (Exception ex) {
|
||||||
|
ex.printStackTrace();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -57,6 +57,8 @@ public class ShiroUtils {
|
||||||
filterChainDefinitionMap.put("/v1/health/**", "anon");
|
filterChainDefinitionMap.put("/v1/health/**", "anon");
|
||||||
//mock接口
|
//mock接口
|
||||||
filterChainDefinitionMap.put("/mock/**", "anon");
|
filterChainDefinitionMap.put("/mock/**", "anon");
|
||||||
|
filterChainDefinitionMap.put("/ws/**", "anon");
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void ignoreCsrfFilter(Map<String, String> filterChainDefinitionMap) {
|
public static void ignoreCsrfFilter(Map<String, String> filterChainDefinitionMap) {
|
||||||
|
|
|
@ -0,0 +1,59 @@
|
||||||
|
package io.metersphere.websocket.c.to.c;
|
||||||
|
|
||||||
|
import com.alibaba.fastjson.JSON;
|
||||||
|
import io.metersphere.websocket.c.to.c.util.MsgDto;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
import javax.websocket.*;
|
||||||
|
import javax.websocket.server.PathParam;
|
||||||
|
import javax.websocket.server.ServerEndpoint;
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
|
@Slf4j
|
||||||
|
@Component // 注册到spring
|
||||||
|
@ServerEndpoint("/ws/{reportId}") // 创建websocket服务
|
||||||
|
public class IndexWebSocket {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 连接成功响应
|
||||||
|
*/
|
||||||
|
@OnOpen
|
||||||
|
public void openSession(@PathParam("reportId") String reportId, Session session) {
|
||||||
|
WebSocketUtils.ONLINE_USER_SESSIONS.put(reportId, session);
|
||||||
|
log.info("客户端: [" + reportId + "] : 连接成功!");
|
||||||
|
WebSocketUtils.sendMessageAll("客户端: [" + reportId + "] : 连接成功!");
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 收到消息响应
|
||||||
|
*/
|
||||||
|
@OnMessage
|
||||||
|
public void onMessage(@PathParam("reportId") String reportId, String message) {
|
||||||
|
log.info("服务器收到:[" + reportId + "] : " + message);
|
||||||
|
MsgDto dto = JSON.parseObject(message, MsgDto.class);
|
||||||
|
dto.setContent(dto.getContent());
|
||||||
|
WebSocketUtils.sendMessageSingle(dto);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 连接关闭响应
|
||||||
|
*/
|
||||||
|
@OnClose
|
||||||
|
public void onClose(@PathParam("reportId") String reportId, Session session) throws IOException {
|
||||||
|
//当前的Session 移除
|
||||||
|
WebSocketUtils.ONLINE_USER_SESSIONS.remove(reportId);
|
||||||
|
log.info("[" + reportId + "] : 断开连接!");
|
||||||
|
//并且通知其他人当前用户已经断开连接了
|
||||||
|
WebSocketUtils.sendMessageAll("[" + reportId + "] : 断开连接!");
|
||||||
|
session.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 连接异常响应
|
||||||
|
*/
|
||||||
|
@OnError
|
||||||
|
public void onError(Session session, Throwable throwable) throws IOException {
|
||||||
|
session.close();
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,54 @@
|
||||||
|
package io.metersphere.websocket.c.to.c;
|
||||||
|
|
||||||
|
import com.alibaba.fastjson.JSON;
|
||||||
|
import io.metersphere.websocket.c.to.c.util.MsgDto;
|
||||||
|
import org.java_websocket.client.WebSocketClient;
|
||||||
|
import org.java_websocket.handshake.ServerHandshake;
|
||||||
|
|
||||||
|
import java.net.URI;
|
||||||
|
import java.net.URISyntaxException;
|
||||||
|
import java.util.Iterator;
|
||||||
|
|
||||||
|
public class MsWebSocketClient extends WebSocketClient{
|
||||||
|
public MsWebSocketClient(String url) throws URISyntaxException {
|
||||||
|
super(new URI(url));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onOpen(ServerHandshake shake) {
|
||||||
|
System.out.println("握手...");
|
||||||
|
for(Iterator<String> it=shake.iterateHttpFields();it.hasNext();) {
|
||||||
|
String key = it.next();
|
||||||
|
System.out.println(key+":"+shake.getFieldValue(key));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onMessage(String paramString) {
|
||||||
|
System.out.println("接收到消息:"+paramString);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onClose(int paramInt, String paramString, boolean paramBoolean) {
|
||||||
|
System.out.println("关闭...");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onError(Exception e) {
|
||||||
|
System.out.println("异常"+e);
|
||||||
|
}
|
||||||
|
public static void main(String[] args) {
|
||||||
|
try {
|
||||||
|
MsWebSocketClient client = new MsWebSocketClient("ws://127.0.0.1:8081/ws/22222");
|
||||||
|
client.connect();
|
||||||
|
System.out.println("建立websocket连接");
|
||||||
|
MsgDto dto = new MsgDto();
|
||||||
|
dto.setContent("099991023123123");
|
||||||
|
dto.setReportId("123123123");
|
||||||
|
dto.setToReport("3933abd9");
|
||||||
|
client.send(JSON.toJSONString(dto));
|
||||||
|
} catch (URISyntaxException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,33 @@
|
||||||
|
package io.metersphere.websocket.c.to.c;
|
||||||
|
|
||||||
|
import io.metersphere.websocket.c.to.c.util.MsgDto;
|
||||||
|
|
||||||
|
import javax.websocket.RemoteEndpoint;
|
||||||
|
import javax.websocket.Session;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.concurrent.ConcurrentHashMap;
|
||||||
|
|
||||||
|
public class WebSocketUtils {
|
||||||
|
public static final Map<String, Session> ONLINE_USER_SESSIONS = new ConcurrentHashMap<>();
|
||||||
|
|
||||||
|
// 单用户推送
|
||||||
|
public static void sendMessage(Session session, String message) {
|
||||||
|
if (session == null) { return; }
|
||||||
|
RemoteEndpoint.Async async = session.getAsyncRemote();
|
||||||
|
if (async == null) { return; }
|
||||||
|
async.sendText(message);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 单用户推送
|
||||||
|
public static void sendMessageSingle(MsgDto dto) {
|
||||||
|
sendMessage(ONLINE_USER_SESSIONS.get(dto.getReportId()), dto.getContent());
|
||||||
|
sendMessage(ONLINE_USER_SESSIONS.get(dto.getToReport()), dto.getContent());
|
||||||
|
}
|
||||||
|
|
||||||
|
// 全用户推送
|
||||||
|
public static void sendMessageAll(String message) {
|
||||||
|
ONLINE_USER_SESSIONS.forEach((sessionId, session) -> {
|
||||||
|
sendMessage(session, message);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,18 @@
|
||||||
|
package io.metersphere.websocket.c.to.c.util;
|
||||||
|
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
|
import lombok.Builder;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.NoArgsConstructor;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*/
|
||||||
|
@AllArgsConstructor
|
||||||
|
@NoArgsConstructor
|
||||||
|
@Builder
|
||||||
|
@Data
|
||||||
|
public class MsgDto {
|
||||||
|
private String reportId;
|
||||||
|
private String toReport;
|
||||||
|
private String content;
|
||||||
|
}
|
|
@ -0,0 +1,19 @@
|
||||||
|
package io.metersphere.websocket.c.to.c.util;
|
||||||
|
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
|
import lombok.Builder;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.NoArgsConstructor;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author: jason
|
||||||
|
* @Date: 2020-12-23
|
||||||
|
*/
|
||||||
|
@AllArgsConstructor
|
||||||
|
@NoArgsConstructor
|
||||||
|
@Builder
|
||||||
|
@Data
|
||||||
|
public class SocketClient {
|
||||||
|
private Integer userId;
|
||||||
|
private String username;
|
||||||
|
}
|
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue