You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@dubbo.apache.org by al...@apache.org on 2021/09/06 14:47:10 UTC

[dubbo] branch 3.0 updated: fixes: Try to reduce the time consuming in UT (#8686)

This is an automated email from the ASF dual-hosted git repository.

albumenj pushed a commit to branch 3.0
in repository https://gitbox.apache.org/repos/asf/dubbo.git


The following commit(s) were added to refs/heads/3.0 by this push:
     new 7ffa53a  fixes: Try to reduce the time consuming in UT (#8686)
7ffa53a is described below

commit 7ffa53ad0fbd5c4c69c802a3bbe0c172cdcb9ff9
Author: Xiong, Pin <pi...@foxmail.com>
AuthorDate: Mon Sep 6 09:46:53 2021 -0500

    fixes: Try to reduce the time consuming in UT (#8686)
    
    * fixes: Try to reduce the time consuming in UT
    
    1. Replace ZookeeperServer with ZookeeperSingleRegistryCenter
    2. Split the testcase of GenericServiceTest#testGeneric
    
    * fixes: update the scope of maven dependency
    
    * fixes: Update the parameters of zookeeper
    
    * perf: Upgrade the version of curator-framework and remove Thread.sleep in UT
    
    * Recover the previous code in ArgumentCallbackTest#TestCallbackNormalWithBindPort
    
    * Recover the previous code in ArgumentCallbackTest#TestCallbackMultiInstans
---
 .../support/AbstractClusterInvokerTest.java        |   2 +-
 .../apache/dubbo/config/ReferenceConfigTest.java   |  11 +-
 .../registrycenter/AbstractRegistryCenter.java     |   2 +-
 .../consumer/PropertyConfigurerTest.java           |   5 -
 .../consumer2/PropertySourcesConfigurerTest.java   |   5 -
 .../consumer3/PropertySourcesInJavaConfigTest.java |  10 --
 .../spring/reference/localcall/LocalCallTest.java  |   3 -
 .../LocalCallMultipleReferenceAnnotationsTest.java |   3 +-
 .../registrycenter/AbstractRegistryCenter.java     |   8 +-
 .../config/spring/schema/GenericServiceTest.java   |  23 +---
 ...ava => GenericServiceWithoutInterfaceTest.java} |  46 ++-----
 ...> dubbo-generic-consumer-without-interface.xml} |   7 +-
 .../META-INF/spring/dubbo-generic-consumer.xml     |   5 -
 dubbo-dependencies-bom/pom.xml                     |   2 +-
 .../dubbo/qos/command/impl/PortTelnetTest.java     |   2 +-
 .../rpc/protocol/dubbo/DubboProtocolTest.java      |   2 +-
 dubbo-test/dubbo-test-common/pom.xml               |  11 ++
 .../dubbo/test/common/EmbeddedZooKeeper.java       |   4 +
 .../apache/dubbo/test/common/ZooKeeperServer.java  |   9 ++
 .../registrycenter/AbstractRegistryCenter.java     |   6 +-
 .../test/common/registrycenter/RegistryCenter.java |  70 ++++++++++
 .../ZookeeperMultipleRegistryCenter.java}          |  47 +++----
 .../registrycenter/ZookeeperRegistryCenter.java    | 142 +++++++++++++++++++++
 .../ZookeeperSingleRegistryCenter.java}            |  48 ++++---
 .../test/spring/SpringAnnotationBeanTest.java      |  16 ++-
 .../test/spring/SpringJavaConfigBeanTest.java      |  19 ++-
 .../dubbo/test/spring/SpringXmlConfigTest.java     |  15 ++-
 27 files changed, 351 insertions(+), 172 deletions(-)

diff --git a/dubbo-cluster/src/test/java/org/apache/dubbo/rpc/cluster/support/AbstractClusterInvokerTest.java b/dubbo-cluster/src/test/java/org/apache/dubbo/rpc/cluster/support/AbstractClusterInvokerTest.java
index df3a47c..98a3c2f 100644
--- a/dubbo-cluster/src/test/java/org/apache/dubbo/rpc/cluster/support/AbstractClusterInvokerTest.java
+++ b/dubbo-cluster/src/test/java/org/apache/dubbo/rpc/cluster/support/AbstractClusterInvokerTest.java
@@ -386,7 +386,7 @@ public class AbstractClusterInvokerTest {
 
     public void testSelect_multiInvokers(String lbname) throws Exception {
 
-        int min = 1000, max = 5000;
+        int min = 100, max = 500;
         Double d = (Math.random() * (max - min + 1) + min);
         int runs = d.intValue();
         Assertions.assertTrue(runs > min);
diff --git a/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/ReferenceConfigTest.java b/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/ReferenceConfigTest.java
index b0fc95e..b6ec83e 100644
--- a/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/ReferenceConfigTest.java
+++ b/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/ReferenceConfigTest.java
@@ -29,6 +29,8 @@ import org.apache.dubbo.config.api.DemoService;
 import org.apache.dubbo.config.bootstrap.DubboBootstrap;
 import org.apache.dubbo.config.provider.impl.DemoServiceImpl;
 import org.apache.dubbo.registry.client.migration.MigrationInvoker;
+import org.apache.dubbo.registrycenter.RegistryCenter;
+import org.apache.dubbo.registrycenter.ZookeeperSingleRegistryCenter;
 import org.apache.dubbo.rpc.Exporter;
 import org.apache.dubbo.rpc.ProxyFactory;
 import org.apache.dubbo.rpc.listener.ListenerInvokerWrapper;
@@ -39,7 +41,6 @@ import org.apache.dubbo.rpc.model.ServiceMetadata;
 import org.apache.dubbo.rpc.protocol.injvm.InjvmInvoker;
 import org.apache.dubbo.rpc.protocol.injvm.InjvmProtocol;
 
-import org.apache.curator.test.TestingServer;
 import org.junit.jupiter.api.AfterEach;
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.BeforeEach;
@@ -104,16 +105,16 @@ import static org.apache.dubbo.rpc.Constants.SCOPE_LOCAL;
 import static org.apache.dubbo.rpc.Constants.SCOPE_REMOTE;
 
 public class ReferenceConfigTest {
-    private TestingServer zkServer;
     private String zkUrl;
     private String registryUrl;
+    private RegistryCenter registryCenter;
 
     @BeforeEach
     public void setUp() throws Exception {
         DubboBootstrap.reset();
         int zkServerPort = NetUtils.getAvailablePort(NetUtils.getRandomPort());
-        this.zkServer = new TestingServer(zkServerPort, true);
-        this.zkServer.start();
+        registryCenter = new ZookeeperSingleRegistryCenter(zkServerPort);
+        registryCenter.startup();
         this.zkUrl = "zookeeper://localhost:" + zkServerPort;
         this.registryUrl = "registry://localhost:" + zkServerPort + "?registry=zookeeper";
 
@@ -126,7 +127,7 @@ public class ReferenceConfigTest {
     @AfterEach
     public void tearDown() throws IOException {
         DubboBootstrap.reset();
-        zkServer.stop();
+        registryCenter.shutdown();
         Mockito.framework().clearInlineMocks();
 
     }
diff --git a/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/registrycenter/AbstractRegistryCenter.java b/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/registrycenter/AbstractRegistryCenter.java
index 3846c94..3ef9e58 100644
--- a/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/registrycenter/AbstractRegistryCenter.java
+++ b/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/registrycenter/AbstractRegistryCenter.java
@@ -60,7 +60,7 @@ abstract class AbstractRegistryCenter implements RegistryCenter {
     /**
      * The default value is -1.
      */
-    private static final int DEFAULT_MAX_CLIENT_CNXNS = -1;
+    private static final int DEFAULT_MAX_CLIENT_CNXNS = 200;
 
     /**
      * The minimum session timeout.
diff --git a/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/propertyconfigurer/consumer/PropertyConfigurerTest.java b/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/propertyconfigurer/consumer/PropertyConfigurerTest.java
index 37a677d..c2ba2c4 100644
--- a/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/propertyconfigurer/consumer/PropertyConfigurerTest.java
+++ b/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/propertyconfigurer/consumer/PropertyConfigurerTest.java
@@ -61,11 +61,6 @@ public class PropertyConfigurerTest {
             // reset ConfigManager of provider context
             ApplicationModel.defaultModel().getApplicationConfigManager().destroy();
 
-            try {
-                Thread.sleep(1000);
-            } catch (InterruptedException e) {
-            }
-
             // Resolve placeholder by PropertyPlaceholderConfigurer in dubbo-consumer.xml, without import property source.
             AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(ConsumerConfiguration.class);
             context.start();
diff --git a/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/propertyconfigurer/consumer2/PropertySourcesConfigurerTest.java b/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/propertyconfigurer/consumer2/PropertySourcesConfigurerTest.java
index 8054311..08c3a04 100644
--- a/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/propertyconfigurer/consumer2/PropertySourcesConfigurerTest.java
+++ b/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/propertyconfigurer/consumer2/PropertySourcesConfigurerTest.java
@@ -59,11 +59,6 @@ public class PropertySourcesConfigurerTest {
         try {
             providerContext.start();
 
-            try {
-                Thread.sleep(1000);
-            } catch (InterruptedException e) {
-            }
-
             // reset ConfigManager of provider context
             ApplicationModel.defaultModel().getApplicationConfigManager().destroy();
 
diff --git a/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/propertyconfigurer/consumer3/PropertySourcesInJavaConfigTest.java b/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/propertyconfigurer/consumer3/PropertySourcesInJavaConfigTest.java
index afdbf25..bc28201 100644
--- a/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/propertyconfigurer/consumer3/PropertySourcesInJavaConfigTest.java
+++ b/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/propertyconfigurer/consumer3/PropertySourcesInJavaConfigTest.java
@@ -72,11 +72,6 @@ public class PropertySourcesInJavaConfigTest {
         try {
             providerContext.start();
 
-            try {
-                Thread.sleep(1000);
-            } catch (InterruptedException e) {
-            }
-
             // reset ConfigManager of provider context
             ApplicationModel.defaultModel().getApplicationConfigManager().destroy();
             //ApplicationModel.defaultModel().getApplicationServiceRepository().setProviderUrlsWithoutGroup(tmp);
@@ -109,11 +104,6 @@ public class PropertySourcesInJavaConfigTest {
         try {
             providerContext.start();
 
-            try {
-                Thread.sleep(1000);
-            } catch (InterruptedException e) {
-            }
-
             // reset ConfigManager of provider context
             ApplicationModel.defaultModel().getApplicationConfigManager().destroy();
 
diff --git a/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/reference/localcall/LocalCallTest.java b/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/reference/localcall/LocalCallTest.java
index 4f5424a..25fee33 100644
--- a/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/reference/localcall/LocalCallTest.java
+++ b/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/reference/localcall/LocalCallTest.java
@@ -61,9 +61,6 @@ public class LocalCallTest {
     //@Qualifier("localHelloService")
     private HelloService localHelloService;
 
-    @Autowired
-    private ApplicationContext applicationContext;
-
     @Test
     public void testLocalCall() {
         // see also: org.apache.dubbo.rpc.protocol.injvm.InjvmInvoker.doInvoke
diff --git a/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/reference/localcallam/LocalCallMultipleReferenceAnnotationsTest.java b/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/reference/localcallam/LocalCallMultipleReferenceAnnotationsTest.java
index 241ed75..2da3732 100644
--- a/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/reference/localcallam/LocalCallMultipleReferenceAnnotationsTest.java
+++ b/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/reference/localcallam/LocalCallMultipleReferenceAnnotationsTest.java
@@ -22,6 +22,7 @@ import org.apache.dubbo.config.bootstrap.DubboBootstrap;
 import org.apache.dubbo.config.spring.ReferenceBean;
 import org.apache.dubbo.config.spring.api.HelloService;
 import org.apache.dubbo.config.spring.context.annotation.EnableDubbo;
+import org.apache.dubbo.config.spring.registrycenter.RegistryCenter;
 import org.apache.dubbo.config.spring.registrycenter.ZookeeperSingleRegistryCenter;
 import org.apache.dubbo.rpc.RpcContext;
 import org.junit.jupiter.api.AfterAll;
@@ -48,7 +49,7 @@ import static org.springframework.test.annotation.DirtiesContext.ClassMode.AFTER
 @DirtiesContext(classMode = AFTER_EACH_TEST_METHOD)
 public class LocalCallMultipleReferenceAnnotationsTest {
 
-    private static ZookeeperSingleRegistryCenter registryCenter;
+    private static RegistryCenter registryCenter;
 
     @BeforeAll
     public static void setUp() {
diff --git a/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/registrycenter/AbstractRegistryCenter.java b/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/registrycenter/AbstractRegistryCenter.java
index b898c93..c4ae5ca 100644
--- a/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/registrycenter/AbstractRegistryCenter.java
+++ b/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/registrycenter/AbstractRegistryCenter.java
@@ -53,14 +53,14 @@ abstract class AbstractRegistryCenter implements RegistryCenter {
     private static final int DEFAULT_SERVER_ID = -1;
 
     /**
-     * The default tick time is 10000
+     * The default tick time is 5000
      */
-    private static final int DEFAULT_TICK_TIME = 100 * 1000;
+    private static final int DEFAULT_TICK_TIME = 5 * 1000;
 
     /**
-     * The default value is -1.
+     * The default value is 60.
      */
-    private static final int DEFAULT_MAX_CLIENT_CNXNS = -1;
+    private static final int DEFAULT_MAX_CLIENT_CNXNS = 200;
 
     /**
      * The minimum session timeout.
diff --git a/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/schema/GenericServiceTest.java b/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/schema/GenericServiceTest.java
index 57c0b83..988919c 100644
--- a/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/schema/GenericServiceTest.java
+++ b/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/schema/GenericServiceTest.java
@@ -16,8 +16,6 @@
  */
 package org.apache.dubbo.config.spring.schema;
 
-import org.apache.dubbo.common.utils.ClassUtils;
-import org.apache.dubbo.config.ReferenceConfigBase;
 import org.apache.dubbo.config.ServiceConfigBase;
 import org.apache.dubbo.config.bootstrap.DubboBootstrap;
 import org.apache.dubbo.config.context.ConfigManager;
@@ -27,7 +25,6 @@ import org.apache.dubbo.config.spring.registrycenter.ZookeeperSingleRegistryCent
 import org.apache.dubbo.config.spring.registrycenter.RegistryCenter;
 import org.apache.dubbo.rpc.service.GenericService;
 import org.junit.jupiter.api.BeforeAll;
-import org.junit.jupiter.api.AfterEach;
 import org.junit.jupiter.api.AfterAll;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.Assertions;
@@ -59,12 +56,8 @@ public class GenericServiceTest {
 
     @AfterAll
     public static void afterAll() {
-        singleRegistryCenter.shutdown();
-    }
-
-    @AfterEach
-    public void tearDown() {
         DubboBootstrap.reset();
+        singleRegistryCenter.shutdown();
     }
 
     @Autowired
@@ -72,10 +65,6 @@ public class GenericServiceTest {
     private GenericService demoServiceRef;
 
     @Autowired
-    @Qualifier("genericServiceWithoutInterfaceRef")
-    private GenericService genericServiceWithoutInterfaceRef;
-
-    @Autowired
     @Qualifier("demoService")
     private ServiceBean serviceBean;
 
@@ -92,15 +81,5 @@ public class GenericServiceTest {
         Object result = demoServiceRef.$invoke("sayHello", new String[]{"java.lang.String"}, new Object[]{"dubbo"});
         Assertions.assertEquals("Welcome dubbo", result);
 
-
-        // Test generic service without interface class locally
-        result = genericServiceWithoutInterfaceRef.$invoke("sayHello", new String[]{"java.lang.String"}, new Object[]{"generic"});
-        Assertions.assertEquals("Welcome generic", result);
-
-        ReferenceConfigBase<Object> reference = configManager.getReference("genericServiceWithoutInterfaceRef");
-        Assertions.assertNull(reference.getServiceInterfaceClass());
-        Assertions.assertEquals("org.apache.dubbo.config.spring.api.LocalMissClass", reference.getInterface());
-        Assertions.assertThrows(ClassNotFoundException.class, () -> ClassUtils.forName(reference.getInterface()));
-
     }
 }
diff --git a/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/schema/GenericServiceTest.java b/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/schema/GenericServiceWithoutInterfaceTest.java
similarity index 66%
copy from dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/schema/GenericServiceTest.java
copy to dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/schema/GenericServiceWithoutInterfaceTest.java
index 57c0b83..f45fa00 100644
--- a/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/schema/GenericServiceTest.java
+++ b/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/schema/GenericServiceWithoutInterfaceTest.java
@@ -18,16 +18,11 @@ package org.apache.dubbo.config.spring.schema;
 
 import org.apache.dubbo.common.utils.ClassUtils;
 import org.apache.dubbo.config.ReferenceConfigBase;
-import org.apache.dubbo.config.ServiceConfigBase;
 import org.apache.dubbo.config.bootstrap.DubboBootstrap;
-import org.apache.dubbo.config.context.ConfigManager;
-import org.apache.dubbo.config.spring.ServiceBean;
-import org.apache.dubbo.config.spring.api.DemoService;
-import org.apache.dubbo.config.spring.registrycenter.ZookeeperSingleRegistryCenter;
 import org.apache.dubbo.config.spring.registrycenter.RegistryCenter;
+import org.apache.dubbo.config.spring.registrycenter.ZookeeperSingleRegistryCenter;
 import org.apache.dubbo.rpc.service.GenericService;
 import org.junit.jupiter.api.BeforeAll;
-import org.junit.jupiter.api.AfterEach;
 import org.junit.jupiter.api.AfterAll;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.Assertions;
@@ -39,14 +34,13 @@ import org.springframework.test.annotation.DirtiesContext;
 import org.springframework.test.context.ContextConfiguration;
 import org.springframework.test.context.junit.jupiter.SpringExtension;
 
-import static org.junit.jupiter.api.Assertions.assertNotNull;
 import static org.springframework.test.annotation.DirtiesContext.ClassMode.AFTER_EACH_TEST_METHOD;
 
 @ExtendWith(SpringExtension.class)
-@ContextConfiguration(classes = GenericServiceTest.class)
+@ContextConfiguration(classes = GenericServiceWithoutInterfaceTest.class)
 @DirtiesContext(classMode = AFTER_EACH_TEST_METHOD)
-@ImportResource(locations = "classpath:/META-INF/spring/dubbo-generic-consumer.xml")
-public class GenericServiceTest {
+@ImportResource(locations = "classpath:/META-INF/spring/dubbo-generic-consumer-without-interface.xml")
+public class GenericServiceWithoutInterfaceTest {
 
     private static RegistryCenter singleRegistryCenter;
 
@@ -59,48 +53,24 @@ public class GenericServiceTest {
 
     @AfterAll
     public static void afterAll() {
-        singleRegistryCenter.shutdown();
-    }
-
-    @AfterEach
-    public void tearDown() {
         DubboBootstrap.reset();
+        singleRegistryCenter.shutdown();
     }
 
     @Autowired
-    @Qualifier("demoServiceRef")
-    private GenericService demoServiceRef;
-
-    @Autowired
     @Qualifier("genericServiceWithoutInterfaceRef")
     private GenericService genericServiceWithoutInterfaceRef;
 
-    @Autowired
-    @Qualifier("demoService")
-    private ServiceBean serviceBean;
-
     @Test
-    public void testGeneric() {
-        assertNotNull(demoServiceRef);
-        assertNotNull(serviceBean);
-
-        ConfigManager configManager = DubboBootstrap.getInstance().getConfigManager();
-        ServiceConfigBase<Object> serviceConfig = configManager.getService("demoService");
-        Assertions.assertEquals(DemoService.class.getName(), serviceConfig.getInterface());
-        Assertions.assertEquals(true, serviceConfig.isExported());
-
-        Object result = demoServiceRef.$invoke("sayHello", new String[]{"java.lang.String"}, new Object[]{"dubbo"});
-        Assertions.assertEquals("Welcome dubbo", result);
-
+    public void testGenericWithoutInterface() {
 
         // Test generic service without interface class locally
-        result = genericServiceWithoutInterfaceRef.$invoke("sayHello", new String[]{"java.lang.String"}, new Object[]{"generic"});
+        Object result = genericServiceWithoutInterfaceRef.$invoke("sayHello", new String[]{"java.lang.String"}, new Object[]{"generic"});
         Assertions.assertEquals("Welcome generic", result);
 
-        ReferenceConfigBase<Object> reference = configManager.getReference("genericServiceWithoutInterfaceRef");
+        ReferenceConfigBase<Object> reference = DubboBootstrap.getInstance().getConfigManager().getReference("genericServiceWithoutInterfaceRef");
         Assertions.assertNull(reference.getServiceInterfaceClass());
         Assertions.assertEquals("org.apache.dubbo.config.spring.api.LocalMissClass", reference.getInterface());
         Assertions.assertThrows(ClassNotFoundException.class, () -> ClassUtils.forName(reference.getInterface()));
-
     }
 }
diff --git a/dubbo-config/dubbo-config-spring/src/test/resources/META-INF/spring/dubbo-generic-consumer.xml b/dubbo-config/dubbo-config-spring/src/test/resources/META-INF/spring/dubbo-generic-consumer-without-interface.xml
similarity index 84%
copy from dubbo-config/dubbo-config-spring/src/test/resources/META-INF/spring/dubbo-generic-consumer.xml
copy to dubbo-config/dubbo-config-spring/src/test/resources/META-INF/spring/dubbo-generic-consumer-without-interface.xml
index fd5dde5..002f8f6 100644
--- a/dubbo-config/dubbo-config-spring/src/test/resources/META-INF/spring/dubbo-generic-consumer.xml
+++ b/dubbo-config/dubbo-config-spring/src/test/resources/META-INF/spring/dubbo-generic-consumer-without-interface.xml
@@ -22,18 +22,13 @@
        http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd">
 
     <!-- 当前应用信息配置 -->
-    <dubbo:application name="dubbo-generic-consumer"/>
+    <dubbo:application name="dubbo-generic-consumer-without-interface"/>
 
     <!-- 连接注册中心配置 -->
     <dubbo:registry address="zookeeper://127.0.0.1:2181"/>
 
-    <dubbo:reference id="demoServiceRef" interface="org.apache.dubbo.config.spring.api.DemoService" generic="true" init="false"/>
-
     <bean id="genericService" class="org.apache.dubbo.config.spring.schema.MyGenericService"/>
 
-    <dubbo:service id="demoService" interface="org.apache.dubbo.config.spring.api.DemoService" generic="true"
-                   ref="genericService"/>
-
     <!-- generic service without interface class -->
     <dubbo:reference id="genericServiceWithoutInterfaceRef" interface="org.apache.dubbo.config.spring.api.LocalMissClass" generic="true" init="false"/>
     <dubbo:service id="genericServiceWithoutInterface" interface="org.apache.dubbo.config.spring.api.LocalMissClass" generic="true"
diff --git a/dubbo-config/dubbo-config-spring/src/test/resources/META-INF/spring/dubbo-generic-consumer.xml b/dubbo-config/dubbo-config-spring/src/test/resources/META-INF/spring/dubbo-generic-consumer.xml
index fd5dde5..e426e22 100644
--- a/dubbo-config/dubbo-config-spring/src/test/resources/META-INF/spring/dubbo-generic-consumer.xml
+++ b/dubbo-config/dubbo-config-spring/src/test/resources/META-INF/spring/dubbo-generic-consumer.xml
@@ -33,9 +33,4 @@
 
     <dubbo:service id="demoService" interface="org.apache.dubbo.config.spring.api.DemoService" generic="true"
                    ref="genericService"/>
-
-    <!-- generic service without interface class -->
-    <dubbo:reference id="genericServiceWithoutInterfaceRef" interface="org.apache.dubbo.config.spring.api.LocalMissClass" generic="true" init="false"/>
-    <dubbo:service id="genericServiceWithoutInterface" interface="org.apache.dubbo.config.spring.api.LocalMissClass" generic="true"
-                   ref="genericService"/>
 </beans>
diff --git a/dubbo-dependencies-bom/pom.xml b/dubbo-dependencies-bom/pom.xml
index a62797b..3594718 100644
--- a/dubbo-dependencies-bom/pom.xml
+++ b/dubbo-dependencies-bom/pom.xml
@@ -100,7 +100,7 @@
         <httpcore_version>4.4.6</httpcore_version>
         <fastjson_version>1.2.70</fastjson_version>
         <zookeeper_version>3.4.13</zookeeper_version>
-        <curator_version>4.0.1</curator_version>
+        <curator_version>4.1.0</curator_version>
         <curator_test_version>2.12.0</curator_test_version>
         <jedis_version>3.6.0</jedis_version>
         <consul_version>1.4.2</consul_version>
diff --git a/dubbo-plugin/dubbo-qos/src/test/java/org/apache/dubbo/qos/command/impl/PortTelnetTest.java b/dubbo-plugin/dubbo-qos/src/test/java/org/apache/dubbo/qos/command/impl/PortTelnetTest.java
index 2a268d9..dbbc476 100644
--- a/dubbo-plugin/dubbo-qos/src/test/java/org/apache/dubbo/qos/command/impl/PortTelnetTest.java
+++ b/dubbo-plugin/dubbo-qos/src/test/java/org/apache/dubbo/qos/command/impl/PortTelnetTest.java
@@ -73,7 +73,7 @@ public class PortTelnetTest {
     public void testListClient() throws Exception {
         ExchangeClient client1 = Exchangers.connect("dubbo://127.0.0.1:" + availablePort + "/demo");
         ExchangeClient client2 = Exchangers.connect("dubbo://127.0.0.1:" + availablePort + "/demo");
-        Thread.sleep(5000);
+        Thread.sleep(100);
         String result = port.execute(mockCommandContext, new String[]{"-l", availablePort + ""});
         String client1Addr = client1.getLocalAddress().toString();
         String client2Addr = client2.getLocalAddress().toString();
diff --git a/dubbo-rpc/dubbo-rpc-dubbo/src/test/java/org/apache/dubbo/rpc/protocol/dubbo/DubboProtocolTest.java b/dubbo-rpc/dubbo-rpc-dubbo/src/test/java/org/apache/dubbo/rpc/protocol/dubbo/DubboProtocolTest.java
index 0779bb1..99a8da2 100644
--- a/dubbo-rpc/dubbo-rpc-dubbo/src/test/java/org/apache/dubbo/rpc/protocol/dubbo/DubboProtocolTest.java
+++ b/dubbo-rpc/dubbo-rpc-dubbo/src/test/java/org/apache/dubbo/rpc/protocol/dubbo/DubboProtocolTest.java
@@ -190,7 +190,7 @@ public class DubboProtocolTest {
         service = proxy.getProxy(protocol.refer(DemoService.class, URL.valueOf("dubbo://127.0.0.1:" + port + "/" + DemoService.class.getName() + "?codec=exchange").addParameter("timeout",
                 3000L)));
         long start = System.currentTimeMillis();
-        for (int i = 0; i < 1000; i++)
+        for (int i = 0; i < 100; i++)
             service.getSize(new String[]{"", "", ""});
         System.out.println("take:" + (System.currentTimeMillis() - start));
     }
diff --git a/dubbo-test/dubbo-test-common/pom.xml b/dubbo-test/dubbo-test-common/pom.xml
index 9c52951..0cbfa34 100644
--- a/dubbo-test/dubbo-test-common/pom.xml
+++ b/dubbo-test/dubbo-test-common/pom.xml
@@ -57,5 +57,16 @@
             <groupId>org.apache.dubbo</groupId>
             <artifactId>dubbo-rpc-rest</artifactId>
         </dependency>
+        <dependency>
+            <groupId>org.apache.curator</groupId>
+            <artifactId>curator-test</artifactId>
+            <scope>compile</scope>
+            <exclusions>
+                <exclusion>
+                    <groupId>com.google.guava</groupId>
+                    <artifactId>guava</artifactId>
+                </exclusion>
+            </exclusions>
+        </dependency>
     </dependencies>
 </project>
diff --git a/dubbo-test/dubbo-test-common/src/main/java/org/apache/dubbo/test/common/EmbeddedZooKeeper.java b/dubbo-test/dubbo-test-common/src/main/java/org/apache/dubbo/test/common/EmbeddedZooKeeper.java
index e91755a..c96f06f 100644
--- a/dubbo-test/dubbo-test-common/src/main/java/org/apache/dubbo/test/common/EmbeddedZooKeeper.java
+++ b/dubbo-test/dubbo-test-common/src/main/java/org/apache/dubbo/test/common/EmbeddedZooKeeper.java
@@ -39,7 +39,11 @@ import java.util.UUID;
  * @author Patrick Peralta
  * @author Mark Fisher
  * @author David Turanski
+ * @deprecated
+ * @see org.apache.dubbo.test.common.registrycenter.ZookeeperSingleRegistryCenter
+ * @see org.apache.dubbo.test.common.registrycenter.ZookeeperMultipleRegistryCenter
  */
+@Deprecated
 public class EmbeddedZooKeeper {
 
     /**
diff --git a/dubbo-test/dubbo-test-common/src/main/java/org/apache/dubbo/test/common/ZooKeeperServer.java b/dubbo-test/dubbo-test-common/src/main/java/org/apache/dubbo/test/common/ZooKeeperServer.java
index 115510a..846c2ac 100644
--- a/dubbo-test/dubbo-test-common/src/main/java/org/apache/dubbo/test/common/ZooKeeperServer.java
+++ b/dubbo-test/dubbo-test-common/src/main/java/org/apache/dubbo/test/common/ZooKeeperServer.java
@@ -16,6 +16,15 @@
  */
 package org.apache.dubbo.test.common;
 
+/**
+ * Using this class as registry center is not very well because of time-consuming.
+ * <p>The alternative is to use {@link org.apache.dubbo.test.common.registrycenter.ZookeeperSingleRegistryCenter}</p> or
+ * {@link org.apache.dubbo.test.common.registrycenter.ZookeeperMultipleRegistryCenter}
+ * @deprecated
+ * @see org.apache.dubbo.test.common.registrycenter.ZookeeperSingleRegistryCenter
+ * @see org.apache.dubbo.test.common.registrycenter.ZookeeperMultipleRegistryCenter
+ */
+@Deprecated
 public class ZooKeeperServer {
 
     private static EmbeddedZooKeeper zookeeper1;
diff --git a/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/registrycenter/AbstractRegistryCenter.java b/dubbo-test/dubbo-test-common/src/main/java/org/apache/dubbo/test/common/registrycenter/AbstractRegistryCenter.java
similarity index 95%
copy from dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/registrycenter/AbstractRegistryCenter.java
copy to dubbo-test/dubbo-test-common/src/main/java/org/apache/dubbo/test/common/registrycenter/AbstractRegistryCenter.java
index 3846c94..cbf637a 100644
--- a/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/registrycenter/AbstractRegistryCenter.java
+++ b/dubbo-test/dubbo-test-common/src/main/java/org/apache/dubbo/test/common/registrycenter/AbstractRegistryCenter.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.dubbo.registrycenter;
+package org.apache.dubbo.test.common.registrycenter;
 
 import org.apache.curator.test.InstanceSpec;
 
@@ -58,9 +58,9 @@ abstract class AbstractRegistryCenter implements RegistryCenter {
     private static final int DEFAULT_TICK_TIME = 5 * 1000;
 
     /**
-     * The default value is -1.
+     * The default value is 60.
      */
-    private static final int DEFAULT_MAX_CLIENT_CNXNS = -1;
+    private static final int DEFAULT_MAX_CLIENT_CNXNS = 200;
 
     /**
      * The minimum session timeout.
diff --git a/dubbo-test/dubbo-test-common/src/main/java/org/apache/dubbo/test/common/registrycenter/RegistryCenter.java b/dubbo-test/dubbo-test-common/src/main/java/org/apache/dubbo/test/common/registrycenter/RegistryCenter.java
new file mode 100644
index 0000000..8e9c569
--- /dev/null
+++ b/dubbo-test/dubbo-test-common/src/main/java/org/apache/dubbo/test/common/registrycenter/RegistryCenter.java
@@ -0,0 +1,70 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.dubbo.test.common.registrycenter;
+
+import org.apache.dubbo.rpc.RpcException;
+
+import java.util.List;
+
+/**
+ * The mock registry center.
+ */
+public interface RegistryCenter {
+
+    /**
+     * Start the registry center.
+     *
+     * @throws RpcException when an exception occurred
+     */
+    void startup() throws RpcException;
+
+    /**
+     * Returns the registry center instance.
+     * <p>This method can be called only after {@link #startup()} is called</p>
+     *
+     * @throws RpcException when an exception occurred
+     */
+    List<Instance> getRegistryCenterInstance() throws RpcException;
+
+    /**
+     * Stop the registry center.
+     *
+     * @throws RpcException when an exception occurred
+     */
+    void shutdown() throws RpcException;
+
+    /**
+     * The registry center instance.
+     */
+    interface Instance {
+
+        /**
+         * Returns the registry center type.
+         */
+        String getType();
+
+        /**
+         * Returns the hostname of registry center.
+         */
+        String getHostname();
+
+        /**
+         * Returns the port of registry center.
+         */
+        int getPort();
+    }
+}
diff --git a/dubbo-test/dubbo-test-common/src/main/java/org/apache/dubbo/test/common/ZooKeeperServer.java b/dubbo-test/dubbo-test-common/src/main/java/org/apache/dubbo/test/common/registrycenter/ZookeeperMultipleRegistryCenter.java
similarity index 51%
copy from dubbo-test/dubbo-test-common/src/main/java/org/apache/dubbo/test/common/ZooKeeperServer.java
copy to dubbo-test/dubbo-test-common/src/main/java/org/apache/dubbo/test/common/registrycenter/ZookeeperMultipleRegistryCenter.java
index 115510a..761558a 100644
--- a/dubbo-test/dubbo-test-common/src/main/java/org/apache/dubbo/test/common/ZooKeeperServer.java
+++ b/dubbo-test/dubbo-test-common/src/main/java/org/apache/dubbo/test/common/registrycenter/ZookeeperMultipleRegistryCenter.java
@@ -14,35 +14,30 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.dubbo.test.common;
+package org.apache.dubbo.test.common.registrycenter;
 
-public class ZooKeeperServer {
-
-    private static EmbeddedZooKeeper zookeeper1;
-    private static EmbeddedZooKeeper zookeeper2;
+/**
+ * The default zookeeper multiple registry center.
+ */
+public class ZookeeperMultipleRegistryCenter extends ZookeeperRegistryCenter {
 
-    public static void start() {
-        if (zookeeper1 == null) {
-            zookeeper1 = new EmbeddedZooKeeper(2181, true);
-            zookeeper1.start();
-        }
-        if (zookeeper2 == null) {
-            zookeeper2 = new EmbeddedZooKeeper(2182, true);
-            zookeeper2.start();
-        }
+    /**
+     * Initialize {@link ZookeeperMultipleRegistryCenter} instance.
+     *
+     * @param port1 the zookeeper server's port.
+     * @param port2 the zookeeper server's port.
+     */
+    public ZookeeperMultipleRegistryCenter(int port1, int port2) {
+        super(port1, port2);
     }
 
-    public static void stop() {
-        try {
-            if (zookeeper1 != null) {
-                zookeeper1.stop();
-            }
-            if (zookeeper2 != null) {
-                zookeeper2.stop();
-            }
-        } finally {
-            zookeeper1 = null;
-            zookeeper2 = null;
-        }
+    /**
+     * Initialize {@link ZookeeperMultipleRegistryCenter} instance.
+     */
+    public ZookeeperMultipleRegistryCenter() {
+        this(DEFAULT_PORT1, DEFAULT_PORT2);
     }
+
+    private static final int DEFAULT_PORT1 = 2181;
+    private static final int DEFAULT_PORT2 = 2182;
 }
diff --git a/dubbo-test/dubbo-test-common/src/main/java/org/apache/dubbo/test/common/registrycenter/ZookeeperRegistryCenter.java b/dubbo-test/dubbo-test-common/src/main/java/org/apache/dubbo/test/common/registrycenter/ZookeeperRegistryCenter.java
new file mode 100644
index 0000000..4b2e3b6
--- /dev/null
+++ b/dubbo-test/dubbo-test-common/src/main/java/org/apache/dubbo/test/common/registrycenter/ZookeeperRegistryCenter.java
@@ -0,0 +1,142 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.dubbo.test.common.registrycenter;
+
+import org.apache.curator.test.InstanceSpec;
+import org.apache.curator.test.TestingServer;
+import org.apache.dubbo.common.logger.Logger;
+import org.apache.dubbo.common.logger.LoggerFactory;
+import org.apache.dubbo.rpc.RpcException;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.atomic.AtomicBoolean;
+
+/**
+ * The default implementation of registry center can support single and multiple registry center.
+ * <p>Each port represents an instance. You can provide multiple ports to build multiple registry center,
+ * if you want to create multiple registry center
+ */
+class ZookeeperRegistryCenter extends AbstractRegistryCenter {
+
+    /**
+     * Initialize the default registry center.
+     *
+     * @param ports the registry center's ports.
+     */
+    public ZookeeperRegistryCenter(int... ports) {
+        this.ports = ports;
+        this.instanceSpecs = new ArrayList<>(this.ports.length);
+        this.zookeeperServers = new ArrayList<>(this.ports.length);
+    }
+
+    private static final Logger logger = LoggerFactory.getLogger(ZookeeperRegistryCenter.class);
+
+    /**
+     * The type of the registry center.
+     */
+    private static final String DEFAULT_REGISTRY_CENTER_TYPE = "zookeeper";
+
+    private int[] ports;
+
+    private List<InstanceSpec> instanceSpecs;
+
+    private List<TestingServer> zookeeperServers;
+
+    private AtomicBoolean started = new AtomicBoolean(false);
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public void startup() throws RpcException {
+        try {
+            if (started.compareAndSet(false, true)) {
+                logger.info("The ZookeeperRegistryCenter is starting...");
+                for (int port : this.ports) {
+                    InstanceSpec instanceSpec = this.createInstanceSpec(port);
+                    this.instanceSpecs.add(instanceSpec);
+                    this.zookeeperServers.add(new TestingServer(instanceSpec, true));
+                }
+                logger.info("The ZookeeperRegistryCenter is started successfully");
+            }
+        } catch (Exception exception) {
+            started.set(false);
+            throw new RpcException("Failed to initialize ZookeeperRegistryCenter instance", exception);
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public List<Instance> getRegistryCenterInstance() throws RpcException {
+        this.startup();
+        List<Instance> instances = new ArrayList<>(this.instanceSpecs.size());
+        for (InstanceSpec instanceSpec : this.instanceSpecs) {
+            instances.add(new Instance() {
+                @Override
+                public String getType() {
+                    return DEFAULT_REGISTRY_CENTER_TYPE;
+                }
+
+                @Override
+                public String getHostname() {
+                    return instanceSpec.getHostname();
+                }
+
+                @Override
+                public int getPort() {
+                    return instanceSpec.getPort();
+                }
+            });
+        }
+        return instances;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public void shutdown() throws RpcException {
+        logger.info("The ZookeeperRegistryCenter is stopping...");
+        List<RpcException> exceptions = new ArrayList<>(this.zookeeperServers.size());
+        for (TestingServer testingServer : this.zookeeperServers) {
+            try {
+                testingServer.close();
+                logger.info(String.format("The zookeeper instance of %s is shutdown successfully",
+                    testingServer.getConnectString()));
+            } catch (IOException exception) {
+                RpcException rpcException = new RpcException(String.format("Failed to close zookeeper instance of %s",
+                    testingServer.getConnectString()),
+                    exception);
+                exceptions.add(rpcException);
+                logger.error(rpcException);
+            }
+        }
+        this.instanceSpecs.clear();
+        this.zookeeperServers.clear();
+        if (!exceptions.isEmpty()) {
+            logger.info("The ZookeeperRegistryCenter failed to close.");
+            // throw any one of exceptions
+            throw exceptions.get(0);
+        } else {
+            logger.info("The ZookeeperRegistryCenter close successfully.");
+        }
+    }
+}
diff --git a/dubbo-test/dubbo-test-common/src/main/java/org/apache/dubbo/test/common/ZooKeeperServer.java b/dubbo-test/dubbo-test-common/src/main/java/org/apache/dubbo/test/common/registrycenter/ZookeeperSingleRegistryCenter.java
similarity index 51%
copy from dubbo-test/dubbo-test-common/src/main/java/org/apache/dubbo/test/common/ZooKeeperServer.java
copy to dubbo-test/dubbo-test-common/src/main/java/org/apache/dubbo/test/common/registrycenter/ZookeeperSingleRegistryCenter.java
index 115510a..9f0e010 100644
--- a/dubbo-test/dubbo-test-common/src/main/java/org/apache/dubbo/test/common/ZooKeeperServer.java
+++ b/dubbo-test/dubbo-test-common/src/main/java/org/apache/dubbo/test/common/registrycenter/ZookeeperSingleRegistryCenter.java
@@ -14,35 +14,31 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.dubbo.test.common;
+package org.apache.dubbo.test.common.registrycenter;
 
-public class ZooKeeperServer {
-
-    private static EmbeddedZooKeeper zookeeper1;
-    private static EmbeddedZooKeeper zookeeper2;
+/**
+ * The default zookeeper single registry center.
+ */
+public class ZookeeperSingleRegistryCenter extends ZookeeperRegistryCenter {
 
-    public static void start() {
-        if (zookeeper1 == null) {
-            zookeeper1 = new EmbeddedZooKeeper(2181, true);
-            zookeeper1.start();
-        }
-        if (zookeeper2 == null) {
-            zookeeper2 = new EmbeddedZooKeeper(2182, true);
-            zookeeper2.start();
-        }
+    /**
+     * Initialize {@link ZookeeperSingleRegistryCenter} instance.
+     */
+    public ZookeeperSingleRegistryCenter() {
+        this(DEFAULT_PORT);
     }
 
-    public static void stop() {
-        try {
-            if (zookeeper1 != null) {
-                zookeeper1.stop();
-            }
-            if (zookeeper2 != null) {
-                zookeeper2.stop();
-            }
-        } finally {
-            zookeeper1 = null;
-            zookeeper2 = null;
-        }
+    /**
+     * Initialize {@link RegistryCenter} instance.
+     *
+     * @param port the zookeeper server's port.
+     */
+    public ZookeeperSingleRegistryCenter(int port) {
+        super(port);
     }
+
+    /**
+     * The zookeeper server's default port.
+     */
+    private static final int DEFAULT_PORT = 2181;
 }
diff --git a/dubbo-test/dubbo-test-spring/src/main/java/org/apache/dubbo/test/spring/SpringAnnotationBeanTest.java b/dubbo-test/dubbo-test-spring/src/main/java/org/apache/dubbo/test/spring/SpringAnnotationBeanTest.java
index 9398865..e06b8f3 100644
--- a/dubbo-test/dubbo-test-spring/src/main/java/org/apache/dubbo/test/spring/SpringAnnotationBeanTest.java
+++ b/dubbo-test/dubbo-test-spring/src/main/java/org/apache/dubbo/test/spring/SpringAnnotationBeanTest.java
@@ -19,11 +19,13 @@ package org.apache.dubbo.test.spring;
 import org.apache.dubbo.config.annotation.DubboReference;
 import org.apache.dubbo.config.bootstrap.DubboBootstrap;
 import org.apache.dubbo.config.spring.context.annotation.EnableDubbo;
-import org.apache.dubbo.test.common.ZooKeeperServer;
 import org.apache.dubbo.test.common.api.DemoService;
+import org.apache.dubbo.test.common.registrycenter.RegistryCenter;
+import org.apache.dubbo.test.common.registrycenter.ZookeeperSingleRegistryCenter;
 import org.apache.dubbo.test.spring.context.MockSpringInitializationCustomizer;
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.AfterAll;
 import org.junit.jupiter.api.Test;
 import org.springframework.context.annotation.AnnotationConfigApplicationContext;
 import org.springframework.context.annotation.Bean;
@@ -31,10 +33,20 @@ import org.springframework.context.annotation.Configuration;
 import org.springframework.context.annotation.PropertySource;
 
 public class SpringAnnotationBeanTest {
+
+    private static RegistryCenter registryCenter;
+
     @BeforeAll
     public static void beforeAll() {
-        ZooKeeperServer.start();
+        registryCenter = new ZookeeperSingleRegistryCenter();
+        registryCenter.startup();
+        DubboBootstrap.reset();
+    }
+
+    @AfterAll
+    public static void afterAll(){
         DubboBootstrap.reset();
+        registryCenter.shutdown();
     }
 
     @Test
diff --git a/dubbo-test/dubbo-test-spring/src/main/java/org/apache/dubbo/test/spring/SpringJavaConfigBeanTest.java b/dubbo-test/dubbo-test-spring/src/main/java/org/apache/dubbo/test/spring/SpringJavaConfigBeanTest.java
index fbff776..79392d8 100644
--- a/dubbo-test/dubbo-test-spring/src/main/java/org/apache/dubbo/test/spring/SpringJavaConfigBeanTest.java
+++ b/dubbo-test/dubbo-test-spring/src/main/java/org/apache/dubbo/test/spring/SpringJavaConfigBeanTest.java
@@ -30,15 +30,17 @@ import org.apache.dubbo.config.spring.context.annotation.EnableDubbo;
 import org.apache.dubbo.rpc.Constants;
 import org.apache.dubbo.rpc.model.ApplicationModel;
 import org.apache.dubbo.test.common.SysProps;
-import org.apache.dubbo.test.common.ZooKeeperServer;
 import org.apache.dubbo.test.common.api.DemoService;
 import org.apache.dubbo.test.common.impl.DemoServiceImpl;
+import org.apache.dubbo.test.common.registrycenter.RegistryCenter;
+import org.apache.dubbo.test.common.registrycenter.ZookeeperSingleRegistryCenter;
 import org.apache.dubbo.test.spring.context.MockSpringInitializationCustomizer;
 
-import org.junit.jupiter.api.AfterEach;
 import org.junit.jupiter.api.Assertions;
-import org.junit.jupiter.api.BeforeAll;
 import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.AfterAll;
 import org.junit.jupiter.api.Test;
 import org.springframework.context.annotation.AnnotationConfigApplicationContext;
 import org.springframework.context.annotation.Bean;
@@ -52,10 +54,19 @@ public class SpringJavaConfigBeanTest {
     private static final String MY_PROTOCOL_ID = "myProtocol";
     private static final String MY_REGISTRY_ID = "my-registry";
 
+    private static RegistryCenter registryCenter;
+
     @BeforeAll
     public static void beforeAll() {
-        ZooKeeperServer.start();
+        registryCenter = new ZookeeperSingleRegistryCenter();
+        registryCenter.startup();
+        DubboBootstrap.reset();
+    }
+
+    @AfterAll
+    public static void afterAll(){
         DubboBootstrap.reset();
+        registryCenter.shutdown();
     }
 
     @BeforeEach
diff --git a/dubbo-test/dubbo-test-spring/src/main/java/org/apache/dubbo/test/spring/SpringXmlConfigTest.java b/dubbo-test/dubbo-test-spring/src/main/java/org/apache/dubbo/test/spring/SpringXmlConfigTest.java
index d600ca2..ace14ec 100644
--- a/dubbo-test/dubbo-test-spring/src/main/java/org/apache/dubbo/test/spring/SpringXmlConfigTest.java
+++ b/dubbo-test/dubbo-test-spring/src/main/java/org/apache/dubbo/test/spring/SpringXmlConfigTest.java
@@ -18,11 +18,13 @@ package org.apache.dubbo.test.spring;
 
 import org.apache.dubbo.config.bootstrap.DubboBootstrap;
 import org.apache.dubbo.test.common.SysProps;
-import org.apache.dubbo.test.common.ZooKeeperServer;
 import org.apache.dubbo.test.common.api.DemoService;
 import org.apache.dubbo.test.common.api.GreetingService;
 import org.apache.dubbo.test.common.api.RestDemoService;
+import org.apache.dubbo.test.common.registrycenter.RegistryCenter;
+import org.apache.dubbo.test.common.registrycenter.ZookeeperSingleRegistryCenter;
 import org.apache.dubbo.test.spring.context.MockSpringInitializationCustomizer;
+import org.junit.jupiter.api.AfterAll;
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.BeforeAll;
 import org.junit.jupiter.api.Test;
@@ -32,10 +34,19 @@ import static org.apache.dubbo.common.constants.CommonConstants.SHUTDOWN_WAIT_KE
 
 public class SpringXmlConfigTest {
 
+    private static RegistryCenter registryCenter;
+
     @BeforeAll
     public static void beforeAll() {
-        ZooKeeperServer.start();
+        registryCenter = new ZookeeperSingleRegistryCenter();
+        registryCenter.startup();
+        DubboBootstrap.reset();
+    }
+
+    @AfterAll
+    public static void afterAll(){
         DubboBootstrap.reset();
+        registryCenter.shutdown();
     }
 
     @Test