-
Notifications
You must be signed in to change notification settings - Fork 167
RSocket Testing
在实际的项目开发中,我们需要编写对应的单元测试,如果你的项目有和RSocket Broker集成,那么这个时候可能就需要一个好的方案来支持测试的自动化。
在一些项目的测试中,如果这些测试并不涉及到和RSocket Broker之间的通讯,如你单纯测试服务Bean的实现逻辑,我们通常不会在测试阶段去连接RSocket Broker
这样可以保证测试的速度,另外我们也不需要为测试准备特定的RSocket Broker服务器。
这个时候你只需要添加rsocket.disabled=true
这一配置项即可。 你可以在src/test/resources/application.properties
文件中添加,也可以如以下代码:
@SpringBootTest
@TestPropertySource(properties = {"rsocket.disabled=true"})
public abstract class SpringBootBaseTest {
}
还有一种测试情况就是,你的应用中的一些服务是要访问RSocket Broker的,或者第三方开发包或spring-boot-starter有对RSocket Broker引用初始化对应的服务Bean, 这个时候我们需要初始化一个UpstreamManager,因为所有和RSocket Broker通讯的服务bean都是基于UpstreamManager进行初始化的,这样一个MockBean就可以完成RSocket Broker的模拟,代码如下:
@SpringBootTest
@Import(SpringBootBaseTest.RSocketTestConfig.class)
@TestPropertySource(properties = {"rsocket.disabled=true"})
public abstract class SpringBootBaseTest {
@TestConfiguration
static class RSocketTestConfig {
@Bean
public UpstreamManager upstreamManager() {
return new UpstreamManagerMock();
}
}
}
如果你测试过程需要连接RSocket Broker,然后模拟真实的服务的调用,这个时候你可能就需要一个已经启动的RSocket Broker。考虑到真实的测试场景, Alibaba RSocket Broker提供对Testcontainers的集成,也是非常简单,详情请参考:
- Testcontainers RSocket Broker module: https://github.com/alibaba-rsocket-broker/testcontainers-rsocket-broker-module
- Embedded RSocket Broker for Spring Boot testing: https://github.com/alibaba-rsocket-broker/embedded-rsocket-broker
如果你要测试RSocket直连和RSocket Broker的性能差异,你只需要在example/rsocket-requester
应用的application.properties文件添加对应服务接口的直连地址,如下:
rsocket.routes[0].service=com.alibaba.user.UserService2
rsocket.routes[0].uris=tcp://localhost:42252
然后启动rsocket-requester应用, 然后你可以使用以下两个命令分别对应请求次数的测试,测试的结果就会返回给curl请求:
$ curl http://localhost:8181/bench/serviceByBroker/1000
$ curl http://localhost:8181/bench/serviceByDirect/1000
如果你想使用wrk进行性能测试,可以通过HTTP请求方式进行:
$ wrk -t5 -c50 -d30s --latency http://localhost:8181/user/1
$ wrk -t5 -c50 -d30s --latency http://localhost:8181/user2/1
建议: 进行一轮预热测试,然后各测试三轮,取平均值即可
- Binary: byte stream
- Async message
- Multi transports
- Reactive Semantics
- request/response
- request/stream
- fire-and-forget
- channel
- TCP+TLS
- WebSocket+TLS
- UDP(Aeron)
- RDMA