diff --git a/.codecov.yml b/.codecov.yml
new file mode 100644
index 0000000..5ce536d
--- /dev/null
+++ b/.codecov.yml
@@ -0,0 +1,18 @@
+# Documentation: https://docs.codecov.io/docs/codecov-yaml
+
+codecov:
+  branch: develop
+
+coverage:
+  status:
+    project:
+      default:
+        branches:
+          - develop
+
+comment:
+  layout: "reach,diff,flags,files,footer"
+  behavior: default
+  require_changes: no
+  branches:
+    - develop
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index 730bc8e..8cc2801 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -19,4 +19,5 @@
         run: ./mvnw clean install --batch-mode -DskipTests=false -Dcheckstyle.skip=false -Drat.skip=false -Dmaven.javadoc.skip=true
       - name: Upload coverage to codecov
         uses: codecov/codecov-action@v1
-
+        with:
+          flags: unit
diff --git a/.github/workflows/integration.yml b/.github/workflows/integration.yml
index 54c2ab6..9d74ffa 100644
--- a/.github/workflows/integration.yml
+++ b/.github/workflows/integration.yml
@@ -12,13 +12,34 @@
         run: cp docker/latest/** ./
       - name: Docker build
         run: docker build -t apache/dubbo-admin-integration:latest .
+      - name: Prepare agent
+        run: mkdir jacoco && wget https://repo1.maven.org/maven2/org/jacoco/org.jacoco.agent/0.8.6/org.jacoco.agent-0.8.6-runtime.jar -O jacoco/jacoco.jar && wget https://repo1.maven.org/maven2/org/jacoco/org.jacoco.cli/0.8.6/org.jacoco.cli-0.8.6-nodeps.jar -O jacoco/jacoco-cli.jar
       - name: Build provider and consumer image
         run: ./mvnw --batch-mode --projects dubbo-admin-test --activate-profiles build-provider package && ./mvnw --batch-mode --projects dubbo-admin-test --activate-profiles build-consumer package
       - name: Setup xvfb
-        run: sudo apt-get install xvfb
+        run: sudo apt-get install xvfb ttf-wqy-zenhei -y && fc-cache -v
       - name: Run integration test
         run: xvfb-run --server-args="-screen 0, 1024x768x24" ./mvnw --batch-mode --projects dubbo-admin-test --activate-profiles dubbo-admin-integration-test -Ddocker.showLogs=true docker:stop docker:remove verify
+      - name: Save failure screenshots
+        if: ${{ failure() }}
+        uses: actions/upload-artifact@v2
+        with:
+          name: failure-screenshots
+          path: dubbo-admin-test/target/screens/
       - uses: actions/upload-artifact@v2
         with:
           name: screenshots
-          path: dubbo-admin-test/target/screens/
\ No newline at end of file
+          path: dubbo-admin-test/target/screens/
+      - name: Set up JDK
+        uses: actions/setup-java@v1
+        with:
+          java-version: 8
+      - name: Compile server project
+        run: ./mvnw clean package -DskipTests=true -pl dubbo-admin-server
+      - name: Generate report
+        run: java -jar jacoco/jacoco-cli.jar report jacoco/jacoco.exec --classfiles dubbo-admin-server/target/classes/ --sourcefiles dubbo-admin-server/src --xml jacoco/jacoco.xml
+      - name: Upload coverage to codecov
+        uses: codecov/codecov-action@v1
+        with:
+          flags: integration
+          directory: ./jacoco
diff --git a/README.md b/README.md
index 4e84154..37be75b 100644
--- a/README.md
+++ b/README.md
@@ -1,7 +1,7 @@
 # Dubbo Admin
 
 ![GitHub Workflow Status](https://img.shields.io/github/workflow/status/apache/dubbo-admin/CI)
-[![codecov](https://codecov.io/gh/apache/dubbo-admin/branch/develop/graph/badge.svg)](https://codecov.io/gh/apache/dubbo-admin)
+[![codecov](https://codecov.io/gh/apache/dubbo-admin/branch/develop/graph/badge.svg)](https://codecov.io/gh/apache/dubbo-admin/branches/develop)
 ![license](https://img.shields.io/github/license/apache/dubbo-admin.svg)
 [![Average time to resolve an issue](http://isitmaintained.com/badge/resolution/apache/dubbo-admin.svg)](http://isitmaintained.com/project/apache/dubbo-admin "Average time to resolve an issue")
 [![Percentage of issues still open](http://isitmaintained.com/badge/open/apache/dubbo-admin.svg)](http://isitmaintained.com/project/apache/dubbo-admin "Percentage of issues still open")
diff --git a/README_ZH.md b/README_ZH.md
index c49700a..f4f0d90 100644
--- a/README_ZH.md
+++ b/README_ZH.md
@@ -1,7 +1,7 @@
 # Dubbo控制台
 
 [![Build Status](https://travis-ci.org/apache/dubbo-admin.svg?branch=develop)](https://travis-ci.org/apache/dubbo-admin)
-[![codecov](https://codecov.io/gh/apache/dubbo-admin/branch/develop/graph/badge.svg)](https://codecov.io/gh/apache/dubbo-admin)
+[![codecov](https://codecov.io/gh/apache/dubbo-admin/branch/develop/graph/badge.svg)](https://codecov.io/gh/apache/dubbo-admin/branches/develop)
 ![license](https://img.shields.io/github/license/apache/dubbo-admin.svg)
 
 [English version](README.md).
diff --git a/docker/latest/Dockerfile b/docker/latest/Dockerfile
index 7fa2f81..d45040a 100644
--- a/docker/latest/Dockerfile
+++ b/docker/latest/Dockerfile
@@ -23,5 +23,9 @@
 LABEL maintainer="dev@dubbo.apache.org"
 RUN apt-get update && apt-get install -y tini
 COPY --from=0 /source/dubbo-admin-snapshot/dubbo-admin-distribution/target/dubbo-admin-0.3.0-SNAPSHOT.jar /app.jar
-ENTRYPOINT ["tini","--","java","-XX:+UnlockExperimentalVMOptions","-XX:+UseCGroupMemoryLimitForHeap","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
+COPY entrypoint.sh /usr/local/bin/entrypoint.sh
+
+ENV JAVA_OPTS = ""
+
+ENTRYPOINT ["tini", "--", "/usr/local/bin/entrypoint.sh"]
 EXPOSE 8080
diff --git a/docker/latest/entrypoint.sh b/docker/latest/entrypoint.sh
new file mode 100755
index 0000000..36cadde
--- /dev/null
+++ b/docker/latest/entrypoint.sh
@@ -0,0 +1,4 @@
+#!/bin/bash
+set -e
+
+exec java $JAVA_OPTS -Djava.security.egd=file:/dev/./urandom -jar /app.jar
diff --git a/dubbo-admin-server/src/main/resources/application-test.properties b/dubbo-admin-server/src/main/resources/application-test.properties
index dce770a..b2dca26 100644
--- a/dubbo-admin-server/src/main/resources/application-test.properties
+++ b/dubbo-admin-server/src/main/resources/application-test.properties
@@ -16,7 +16,7 @@
 #
 
 # centers in dubbo2.7
-admin.registry.address=zookeeper://127.0.0.1:2183
-admin.config-center=zookeeper://127.0.0.1:2183
-admin.metadata.address=zookeeper://127.0.0.1:2183
+admin.registry.address=zookeeper://127.0.0.1:2181
+admin.config-center=zookeeper://127.0.0.1:2181
+admin.metadata.address=zookeeper://127.0.0.1:2181
 admin.check.authority=false
diff --git a/dubbo-admin-server/src/main/resources/application.properties b/dubbo-admin-server/src/main/resources/application.properties
index 01e2943..38abde6 100644
--- a/dubbo-admin-server/src/main/resources/application.properties
+++ b/dubbo-admin-server/src/main/resources/application.properties
@@ -16,9 +16,9 @@
 #
 
 # centers in dubbo2.7
-admin.registry.address=zookeeper://127.0.0.1:2183
-admin.config-center=zookeeper://127.0.0.1:2183
-admin.metadata-report.address=zookeeper://127.0.0.1:2183
+admin.registry.address=zookeeper://127.0.0.1:2181
+admin.config-center=zookeeper://127.0.0.1:2181
+admin.metadata-report.address=zookeeper://127.0.0.1:2181
 
 #admin.registry.address=nacos://127.0.0.1:8848
 #admin.config-center=nacos://127.0.0.1:8848
diff --git a/dubbo-admin-server/src/test/java/org/apache/dubbo/admin/utils/LocalDateTimeUtilTest.java b/dubbo-admin-server/src/test/java/org/apache/dubbo/admin/utils/LocalDateTimeUtilTest.java
new file mode 100644
index 0000000..6df1bf1
--- /dev/null
+++ b/dubbo-admin-server/src/test/java/org/apache/dubbo/admin/utils/LocalDateTimeUtilTest.java
@@ -0,0 +1,49 @@
+/*
+ * 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.admin.utils;
+
+import org.junit.Test;
+
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+
+import static org.hamcrest.CoreMatchers.is;
+import static org.junit.Assert.assertThat;
+
+public class LocalDateTimeUtilTest {
+    @Test
+    public void shouldGetLocalDateTime() {
+        LocalDateTime localDateTime = LocalDateTimeUtil.formatToLDT("2020-01-02 10:11:12");
+
+        assertThat(localDateTime.getYear(), is(2020));
+        assertThat(localDateTime.getMonthValue(), is(1));
+        assertThat(localDateTime.getDayOfMonth(), is(2));
+
+        assertThat(localDateTime.getHour(), is(10));
+        assertThat(localDateTime.getMinute(), is(11));
+        assertThat(localDateTime.getSecond(), is(12));
+    }
+
+    @Test
+    public void shouldGetLocalDate() {
+        LocalDate localDate = LocalDateTimeUtil.formatToLD("2020-01-02");
+
+        assertThat(localDate.getYear(), is(2020));
+        assertThat(localDate.getMonthValue(), is(1));
+        assertThat(localDate.getDayOfMonth(), is(2));
+    }
+}
diff --git a/dubbo-admin-test/pom.xml b/dubbo-admin-test/pom.xml
index ccd111a..ab76dae 100644
--- a/dubbo-admin-test/pom.xml
+++ b/dubbo-admin-test/pom.xml
@@ -122,9 +122,9 @@
         </dependency>
 
         <dependency>
-            <groupId>org.seleniumhq.selenium.fluent</groupId>
-            <artifactId>fluent-selenium</artifactId>
-            <version>1.17</version>
+            <groupId>org.fluentlenium</groupId>
+            <artifactId>fluentlenium-junit</artifactId>
+            <version>3.9.1</version>
             <scope>test</scope>
         </dependency>
 
@@ -235,7 +235,13 @@
                                             </admin.config-center>
                                             <admin.metadata-report.address>zookeeper://zookeeper:2181
                                             </admin.metadata-report.address>
+                                            <JAVA_OPTS>-javaagent:/jacoco/jacoco.jar=destfile=/jacoco/jacoco.exec</JAVA_OPTS>
                                         </env>
+                                        <volumes>
+                                            <bind>
+                                                <volume>${project.basedir}/../jacoco:/jacoco</volume>
+                                            </bind>
+                                        </volumes>
                                         <links>
                                             <link>zookeeper:zookeeper</link>
                                         </links>
@@ -246,6 +252,7 @@
                                                 <method>GET</method>
                                                 <status>200</status>
                                             </http>
+                                            <time>20000</time>
                                         </wait>
                                     </run>
                                 </image>
diff --git a/dubbo-admin-test/src/test/java/org/apache/dubbo/admin/BaseIT.java b/dubbo-admin-test/src/test/java/org/apache/dubbo/admin/BaseIT.java
index cfe11c3..7ab56b7 100644
--- a/dubbo-admin-test/src/test/java/org/apache/dubbo/admin/BaseIT.java
+++ b/dubbo-admin-test/src/test/java/org/apache/dubbo/admin/BaseIT.java
@@ -18,30 +18,53 @@
  */
 package org.apache.dubbo.admin;
 
-import org.apache.commons.io.FileUtils;
-import org.openqa.selenium.OutputType;
-import org.openqa.selenium.TakesScreenshot;
+import io.github.bonigarcia.wdm.WebDriverManager;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.dubbo.admin.pages.LoginPage;
+import org.fluentlenium.adapter.junit.FluentTest;
+import org.fluentlenium.core.annotation.Page;
+import org.junit.BeforeClass;
 import org.openqa.selenium.WebDriver;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import java.io.File;
-import java.io.IOException;
-
-public class BaseIT {
+public class BaseIT extends FluentTest {
     private Logger logger = LoggerFactory.getLogger(this.getClass());
 
-    public void takeShot(WebDriver webDriver, String name) {
-        TakesScreenshot scrShot = ((TakesScreenshot) webDriver);
+    protected static WebDriver driver;
+    protected static String BASE_URL;
 
-        File SrcFile = scrShot.getScreenshotAs(OutputType.FILE);
+    @Page
+    LoginPage loginPage;
 
-        File DestFile = new File("target/screens/" + name + ".png");
+    public BaseIT() {
+        setWebDriver("chrome");
+        setScreenshotPath("target/screens/");
+        setScreenshotMode(TriggerMode.AUTOMATIC_ON_FAIL);
+    }
+
+    @BeforeClass
+    public static void beforeClass() {
+        WebDriverManager.chromedriver().setup();
+
+        BASE_URL = StringUtils.defaultString(System.getenv("BASEURL"), "http://localhost:8082");
+    }
+
+    @Override
+    public String getBaseUrl() {
+        return BASE_URL;
+    }
+
+
+    public void autoLogin() {
+        goTo(loginPage);
 
         try {
-            FileUtils.copyFile(SrcFile, DestFile);
-        } catch (IOException e) {
-            logger.info("#takeShot# take shot fail", e);
+            await().untilPredicate(fluentControl -> loginPage.url().contains("login"));
+
+            loginPage.loginWithRoot();
+        } catch (Exception ignore) {
+            logger.info("already log in");
         }
     }
 }
diff --git a/dubbo-admin-test/src/test/java/org/apache/dubbo/admin/LoginIT.java b/dubbo-admin-test/src/test/java/org/apache/dubbo/admin/LoginIT.java
index 62be596..d4bfccc 100644
--- a/dubbo-admin-test/src/test/java/org/apache/dubbo/admin/LoginIT.java
+++ b/dubbo-admin-test/src/test/java/org/apache/dubbo/admin/LoginIT.java
@@ -18,51 +18,18 @@
  */
 package org.apache.dubbo.admin;
 
-import io.github.bonigarcia.wdm.WebDriverManager;
-import org.apache.commons.lang3.StringUtils;
-import org.junit.AfterClass;
-import org.junit.BeforeClass;
+import org.apache.dubbo.admin.pages.LoginPage;
+import org.fluentlenium.core.annotation.Page;
 import org.junit.Test;
-import org.openqa.selenium.By;
-import org.openqa.selenium.WebDriver;
-import org.openqa.selenium.firefox.FirefoxDriver;
-import org.seleniumhq.selenium.fluent.FluentWebDriver;
-
-import java.util.concurrent.TimeUnit;
 
 public class LoginIT extends BaseIT {
-    private static WebDriver driver;
-    private static FluentWebDriver fwd;
-    private static String BASE_URL;
-
-    @BeforeClass
-    public static void beforeClass() {
-        WebDriverManager.firefoxdriver().setup();
-
-        driver = new FirefoxDriver();
-
-        driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
-        fwd = new FluentWebDriver(driver);
-
-        BASE_URL = StringUtils.defaultString(System.getenv("BASEURL"), "http://localhost:8082");
-    }
-
-    @AfterClass
-    public static void afterClass() {
-        driver.quit();
-    }
-
+    @Page
+    private LoginPage loginPage;
 
     @Test
-    public void shouldOpenLogin() {
-        driver.get(BASE_URL + "/#/login");
+    public void shouldLogin() {
+        goTo(loginPage).loginWithRoot();
 
-        fwd.input(By.name("username")).sendKeys("root");
-        fwd.input(By.cssSelector("input[type='password']")).sendKeys("root");
-
-        this.takeShot(driver, "login");
-
-
-        fwd.button(By.tagName("button")).click();
+        loginPage.takeScreenshot("login.png");
     }
 }
diff --git a/dubbo-admin-test/src/test/java/org/apache/dubbo/admin/ManageIT.java b/dubbo-admin-test/src/test/java/org/apache/dubbo/admin/ManageIT.java
new file mode 100644
index 0000000..89ce81f
--- /dev/null
+++ b/dubbo-admin-test/src/test/java/org/apache/dubbo/admin/ManageIT.java
@@ -0,0 +1,42 @@
+/*
+ *
+ *   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.admin;
+
+import org.apache.dubbo.admin.pages.ManagePage;
+import org.fluentlenium.core.annotation.Page;
+import org.junit.Test;
+
+import static org.hamcrest.CoreMatchers.containsString;
+import static org.hamcrest.MatcherAssert.assertThat;
+
+public class ManageIT extends BaseIT {
+    @Page
+    private ManagePage managePage;
+
+    @Test
+    public void shouldViewConfig() {
+        autoLogin();
+
+        goTo(managePage).showConfigDetailFor("global");
+
+        assertThat(managePage.getConfigDetail(), containsString("dubbo.registry.address"));
+
+        managePage.takeScreenshot("manage-config.png");
+    }
+}
diff --git a/dubbo-admin-test/src/test/java/org/apache/dubbo/admin/MetricIT.java b/dubbo-admin-test/src/test/java/org/apache/dubbo/admin/MetricIT.java
new file mode 100644
index 0000000..b5d6bc1
--- /dev/null
+++ b/dubbo-admin-test/src/test/java/org/apache/dubbo/admin/MetricIT.java
@@ -0,0 +1,37 @@
+/*
+ *
+ *   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.admin;
+
+import org.apache.dubbo.admin.pages.MetricRelationPage;
+import org.fluentlenium.core.annotation.Page;
+import org.junit.Test;
+
+public class MetricIT extends BaseIT {
+    @Page
+    private MetricRelationPage relationPage;
+
+    @Test
+    public void shouldShowRelation() {
+        autoLogin();
+
+        goTo(relationPage).showRelation();
+
+        relationPage.takeScreenshot("metric-relation.png");
+    }
+}
diff --git a/dubbo-admin-test/src/test/java/org/apache/dubbo/admin/ServiceIT.java b/dubbo-admin-test/src/test/java/org/apache/dubbo/admin/ServiceIT.java
new file mode 100644
index 0000000..43d59d3
--- /dev/null
+++ b/dubbo-admin-test/src/test/java/org/apache/dubbo/admin/ServiceIT.java
@@ -0,0 +1,57 @@
+/*
+ *
+ *   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.admin;
+
+import org.apache.dubbo.admin.pages.ServicePage;
+import org.fluentlenium.core.annotation.Page;
+import org.junit.Test;
+
+import static org.hamcrest.CoreMatchers.containsString;
+import static org.hamcrest.MatcherAssert.assertThat;
+
+public class ServiceIT extends BaseIT {
+    @Page
+    private ServicePage servicePage;
+
+    @Test
+    public void shouldCheckServiceInfo() {
+        autoLogin();
+
+        goTo(servicePage);
+
+        servicePage.takeScreenshot("service-page.png");
+
+        servicePage.checkDetailForService("org.apache.dubbo.admin.api.GreetingService:1.0.0");
+
+        servicePage.takeScreenshot("service-detail.png");
+    }
+
+    @Test
+    public void shouldTestService() {
+        autoLogin();
+
+        goTo(servicePage).checkTestDetailForService("org.apache.dubbo.admin.api.GreetingService:1.0.0")
+                .takeScreenshot("service-test-list.png");
+
+        servicePage.openTestDialogForMethod("sayHello").executeTestMethodWithParam("world")
+                .takeScreenshot("service-test-detail.png");
+
+        assertThat(servicePage.getTestMethodResult(), containsString("hello, world"));
+    }
+}
diff --git a/dubbo-admin-test/src/test/java/org/apache/dubbo/admin/pages/BasePage.java b/dubbo-admin-test/src/test/java/org/apache/dubbo/admin/pages/BasePage.java
new file mode 100644
index 0000000..32a716f
--- /dev/null
+++ b/dubbo-admin-test/src/test/java/org/apache/dubbo/admin/pages/BasePage.java
@@ -0,0 +1,25 @@
+/*
+ *
+ *   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.admin.pages;
+
+import org.fluentlenium.core.FluentPage;
+
+public class BasePage extends FluentPage {
+
+}
diff --git a/dubbo-admin-test/src/test/java/org/apache/dubbo/admin/pages/LoginPage.java b/dubbo-admin-test/src/test/java/org/apache/dubbo/admin/pages/LoginPage.java
new file mode 100644
index 0000000..7e2eb53
--- /dev/null
+++ b/dubbo-admin-test/src/test/java/org/apache/dubbo/admin/pages/LoginPage.java
@@ -0,0 +1,57 @@
+/*
+ *
+ *   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.admin.pages;
+
+import org.fluentlenium.core.annotation.PageUrl;
+import org.fluentlenium.core.domain.FluentWebElement;
+import org.openqa.selenium.support.FindBy;
+
+@PageUrl("/")
+public class LoginPage extends BasePage {
+
+    @FindBy(css = "input[name='username']")
+    private FluentWebElement usernameInput;
+
+    @FindBy(css = "input[type='password']")
+    private FluentWebElement passwordInput;
+
+    @FindBy(css = "button.primary")
+    private FluentWebElement loginButton;
+
+    @FindBy(css = "div.v-avatar")
+    private FluentWebElement avatarButton;
+
+    public LoginPage loginWithRoot() {
+        await().until(usernameInput).displayed();
+
+        usernameInput.fill().with("root");
+        passwordInput.fill().with("root");
+
+        loginButton.scrollToCenter();
+        loginButton.click();
+
+        return this;
+    }
+
+    public LoginPage logout() {
+        await().until(avatarButton).clickable();
+
+        return this;
+    }
+}
diff --git a/dubbo-admin-test/src/test/java/org/apache/dubbo/admin/pages/ManagePage.java b/dubbo-admin-test/src/test/java/org/apache/dubbo/admin/pages/ManagePage.java
new file mode 100644
index 0000000..131fd1a
--- /dev/null
+++ b/dubbo-admin-test/src/test/java/org/apache/dubbo/admin/pages/ManagePage.java
@@ -0,0 +1,57 @@
+/*
+ *
+ *   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.admin.pages;
+
+import org.fluentlenium.core.annotation.PageUrl;
+import org.fluentlenium.core.domain.FluentWebElement;
+import org.openqa.selenium.By;
+import org.openqa.selenium.support.FindBy;
+
+@PageUrl("/#/management")
+public class ManagePage extends BasePage {
+    @FindBy(css = "table.v-datatable tbody tr")
+    private FluentWebElement configList;
+
+    @FindBy(css = "div.ace_content")
+    private FluentWebElement configCard;
+
+    public String getConfigDetail() {
+        return configCard.text();
+    }
+
+    public ManagePage showConfigDetailFor(String name) {
+        await().untilPredicate(p -> configList.asList().size() > 0);
+
+        for (FluentWebElement row : configList.asList()) {
+            for (FluentWebElement td : row.find(By.cssSelector("td"))) {
+                if (td.text().equalsIgnoreCase(name)) {
+                    for (FluentWebElement i : row.find(By.tagName("i"))) {
+                        if (i.text().equalsIgnoreCase("visibility")) {
+                            i.click();
+                            await().until(configCard).displayed();
+                            return this;
+                        }
+                    }
+
+                }
+            }
+        }
+        throw new RuntimeException("can't load detail");
+    }
+}
diff --git a/dubbo-admin-test/src/test/java/org/apache/dubbo/admin/pages/MetricRelationPage.java b/dubbo-admin-test/src/test/java/org/apache/dubbo/admin/pages/MetricRelationPage.java
new file mode 100644
index 0000000..c2c7a30
--- /dev/null
+++ b/dubbo-admin-test/src/test/java/org/apache/dubbo/admin/pages/MetricRelationPage.java
@@ -0,0 +1,29 @@
+/*
+ *
+ *   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.admin.pages;
+
+import org.fluentlenium.core.annotation.PageUrl;
+
+@PageUrl("/#/metrics/relation")
+public class MetricRelationPage extends BasePage {
+    public MetricRelationPage showRelation() {
+        isAt();
+        return this;
+    }
+}
diff --git a/dubbo-admin-test/src/test/java/org/apache/dubbo/admin/pages/ServicePage.java b/dubbo-admin-test/src/test/java/org/apache/dubbo/admin/pages/ServicePage.java
new file mode 100644
index 0000000..b9e8293
--- /dev/null
+++ b/dubbo-admin-test/src/test/java/org/apache/dubbo/admin/pages/ServicePage.java
@@ -0,0 +1,152 @@
+/*
+ *
+ *   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.admin.pages;
+
+import com.google.common.base.Preconditions;
+import org.apache.commons.collections.CollectionUtils;
+import org.codehaus.plexus.util.StringUtils;
+import org.fluentlenium.core.annotation.PageUrl;
+import org.fluentlenium.core.domain.FluentList;
+import org.fluentlenium.core.domain.FluentWebElement;
+import org.openqa.selenium.By;
+import org.openqa.selenium.support.FindBy;
+
+import java.util.concurrent.TimeUnit;
+
+@PageUrl("/#/service")
+public class ServicePage extends BasePage {
+    @FindBy(css = "input#serviceSearch")
+    private FluentWebElement serviceSearchInput;
+
+    @FindBy(css = "button.primary")
+    private FluentWebElement serviceSearchButton;
+
+    @FindBy(css = "table.v-datatable tbody tr")
+    private FluentWebElement serviceList;
+
+    @FindBy(css = "div.v-content__wrap")
+    private FluentWebElement basicContainer;
+
+    @FindBy(css = "table.v-datatable tbody tr")
+    private FluentWebElement testMethodList;
+
+    @FindBy(css = "button#execute")
+    private FluentWebElement testExecButton;
+
+    @FindBy(css = "div[contenteditable='true']")
+    private FluentWebElement testExecInputs;
+
+    @FindBy(css = "div.it-test-method-result-container")
+    private FluentWebElement testResultContainer;
+
+    public ServicePage checkDetailForService(String fullName) {
+        await().until(serviceSearchInput).displayed();
+
+        serviceSearchInput.fill().with(fullName);
+
+        serviceSearchButton.click();
+
+        await().untilPredicate(p -> serviceList.asList().size() > 0);
+
+        for (FluentWebElement row : serviceList.asList()) {
+            for (FluentWebElement td : row.find(By.cssSelector("td"))) {
+                if (StringUtils.contains(fullName, td.text())) {
+                    row.find(By.cssSelector("a.success")).first().click();
+                    break;
+                }
+            }
+        }
+
+        await().untilPredicate(p -> basicContainer.text().contains("dubbo-admin-integration-provider"));
+
+        return this;
+    }
+
+    public ServicePage checkTestDetailForService(String fullName) {
+        await().until(serviceSearchInput).displayed();
+
+        serviceSearchInput.fill().with(fullName);
+
+        serviceSearchButton.click();
+
+        await().untilPredicate(p -> serviceList.asList().size() > 0);
+
+        for (FluentWebElement row : serviceList.asList()) {
+            for (FluentWebElement td : row.find(By.cssSelector("td"))) {
+                if (StringUtils.contains(fullName, td.text())) {
+                    row.find(By.cssSelector("a.v-btn--depressed")).first().click();
+                    break;
+                }
+            }
+        }
+
+        await().untilPredicate(p -> testMethodList.asList().size() > 0);
+
+        return this;
+    }
+
+    public ServicePage openTestDialogForMethod(String methodName) {
+        for (FluentWebElement method : testMethodList.asList()) {
+            FluentList<FluentWebElement> tds = method.find(By.tagName("td"));
+            if (CollectionUtils.isNotEmpty(tds) && StringUtils.equalsIgnoreCase(tds.get(0).text(), methodName)) {
+                method.find(By.cssSelector("span i")).click();
+                break;
+            }
+        }
+
+        await().until(testExecButton).clickable();
+
+        return this;
+    }
+
+    public ServicePage executeTestMethodWithParam(String... params) {
+        await().until(testExecInputs).displayed();
+
+        Preconditions.checkArgument(params.length == testExecInputs.asList().size(), "params not match input list");
+
+        for (int i = 0; i < testExecInputs.asList().size(); i++) {
+            testExecInputs.asList().get(i).fill().withText(params[i]);
+        }
+
+        testResultContainer.click();
+
+        try {
+            //sleep for a few seconds to make input works
+            TimeUnit.SECONDS.sleep(3);
+        } catch (InterruptedException e) {
+            //ignored
+        }
+
+        testExecButton.click();
+
+        await().atMost(10,TimeUnit.SECONDS).untilPredicate(p-> !getTestMethodResult().contains("{0}"));
+
+        return this;
+    }
+
+    public String getTestMethodResult() {
+        for (FluentWebElement resultRow : testResultContainer.find(By.cssSelector("table.jsoneditor-values tr"))) {
+            String resultAsString = resultRow.text().replace("\n", "");
+            if (StringUtils.contains(resultAsString, "Result")) {
+                return StringUtils.replaceOnce(resultAsString, "Result:", "");
+            }
+        }
+        throw new RuntimeException("can't get test method result");
+    }
+}
diff --git a/dubbo-admin-ui/src/components/test/TestMethod.vue b/dubbo-admin-ui/src/components/test/TestMethod.vue
index 8f6efa7..7372e1f 100644
--- a/dubbo-admin-ui/src/components/test/TestMethod.vue
+++ b/dubbo-admin-ui/src/components/test/TestMethod.vue
@@ -40,7 +40,7 @@
             <span class="red--text" v-if="success===false">{{ $t('fail')}}</span>
           </v-card-title>
           <v-card-text>
-            <json-editor v-model="result" name="Result" readonly></json-editor>
+            <json-editor v-model="result" name="Result" class="it-test-method-result-container" readonly></json-editor>
           </v-card-text>
         </v-card>
       </v-flex>
