Skip to content
This repository has been archived by the owner on Jul 16, 2024. It is now read-only.

RSocket Testing

linux_china edited this page Apr 30, 2021 · 4 revisions

在实际的项目开发中,我们需要编写对应的单元测试,如果你的项目有和RSocket Broker集成,那么这个时候可能就需要一个好的方案来支持测试的自动化。

无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 {
}

Mock RSocket Broker

还有一种测试情况就是,你的应用中的一些服务是要访问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的Testcontainers集成

如果你测试过程需要连接RSocket Broker,然后模拟真实的服务的调用,这个时候你可能就需要一个已经启动的RSocket Broker。考虑到真实的测试场景, Alibaba RSocket Broker提供对Testcontainers的集成,也是非常简单,详情请参考:

性能测试

如果你要测试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

建议: 进行一轮预热测试,然后各测试三轮,取平均值即可

RSocket

Network Protocol

  • Binary: byte stream
  • Async message
  • Multi transports
  • Reactive Semantics

Symmetric interactions

  • request/response
  • request/stream
  • fire-and-forget
  • channel

Transports

  • TCP+TLS
  • WebSocket+TLS
  • UDP(Aeron)
  • RDMA

Polyglot

Clone this wiki locally