Skip to content

使用 Groot 开发自动化测试任务需要具备 Java 编程知识。

Groot 版本要求 JDK 17+、Groovy 4.0+。

引入依赖

引入全量依赖,适合入门练习或不需要定制功能的场景。例子中的 LATEST 表示最新版本,请自行替换为具体的版本号。

xml
<dependency>
    <groupId>com.liyunx.groot</groupId>
    <artifactId>groot-all</artifactId>
    <version>LATEST</version>
</dependency>

<!-- Groot TestNG 集成 -->
<dependency>
    <groupId>com.liyunx.groot</groupId>
    <artifactId>groot-testng</artifactId>
    <version>LATEST</version>
</dependency>
<dependency>
    <groupId>com.liyunx.groot</groupId>
    <artifactId>groot-all</artifactId>
    <version>LATEST</version>
</dependency>

<!-- Groot TestNG 集成 -->
<dependency>
    <groupId>com.liyunx.groot</groupId>
    <artifactId>groot-testng</artifactId>
    <version>LATEST</version>
</dependency>
kotlin
dependencies {
    implementation("com.liyunx.groot:groot-all:LATEST")
    implementation("com.liyunx.groot:groot-testng:LATEST")
}

tasks.test {
    useTestNG()
}
dependencies {
    implementation("com.liyunx.groot:groot-all:LATEST")
    implementation("com.liyunx.groot:groot-testng:LATEST")
}

tasks.test {
    useTestNG()
}

根据需要引入依赖,其中 groot-functions、groot-http 和 groot-testng 都依赖 groot-core。

xml
<!-- Groot 核心模块 -->
<!-- <dependency>
    <groupId>com.liyunx.groot</groupId>
    <artifactId>groot-core</artifactId>
    <version>LATEST</version>
</dependency> -->

<!-- Groot 函数模块 -->
<dependency>
    <groupId>com.liyunx.groot</groupId>
    <artifactId>groot-functions</artifactId>
    <version>LATEST</version>
</dependency>

<!-- Groot HTTP 模块,用于 HTTP 请求 -->
<dependency>
    <groupId>com.liyunx.groot</groupId>
    <artifactId>groot-http</artifactId>
    <version>LATEST</version>
</dependency>

<!-- Groot TestNG 集成 -->
<dependency>
    <groupId>com.liyunx.groot</groupId>
    <artifactId>groot-testng</artifactId>
    <version>LATEST</version>
</dependency>
<!-- Groot 核心模块 -->
<!-- <dependency>
    <groupId>com.liyunx.groot</groupId>
    <artifactId>groot-core</artifactId>
    <version>LATEST</version>
</dependency> -->

<!-- Groot 函数模块 -->
<dependency>
    <groupId>com.liyunx.groot</groupId>
    <artifactId>groot-functions</artifactId>
    <version>LATEST</version>
</dependency>

<!-- Groot HTTP 模块,用于 HTTP 请求 -->
<dependency>
    <groupId>com.liyunx.groot</groupId>
    <artifactId>groot-http</artifactId>
    <version>LATEST</version>
</dependency>

<!-- Groot TestNG 集成 -->
<dependency>
    <groupId>com.liyunx.groot</groupId>
    <artifactId>groot-testng</artifactId>
    <version>LATEST</version>
</dependency>
kotlin
dependencies {
    // implementation("com.liyunx.groot:groot-core:LATEST")
    implementation("com.liyunx.groot:groot-http:LATEST")
    implementation("com.liyunx.groot:groot-functions:LATEST")
    implementation("com.liyunx.groot:groot-testng:LATEST")
}

tasks.test {
    useTestNG()
}
dependencies {
    // implementation("com.liyunx.groot:groot-core:LATEST")
    implementation("com.liyunx.groot:groot-http:LATEST")
    implementation("com.liyunx.groot:groot-functions:LATEST")
    implementation("com.liyunx.groot:groot-testng:LATEST")
}

tasks.test {
    useTestNG()
}

一个简单的 Get 请求

简单的创建一个 TestNG 用例类,调用一个 Get 接口,不需要做任何其他设置。

java
import com.liyunx.groot.testng.GrootTestNGTestCase;
import com.liyunx.groot.testng.annotation.GrootSupport;
import org.testng.annotations.Test;

import static com.liyunx.groot.protocol.http.HttpVirtualRunner.http;

public class GetTest extends GrootTestNGTestCase {

    @Test
    @GrootSupport
    public void testGet() {
        http("访问 TesterHome 首页", http -> http
            .get("https://testerhome.com/topics?page=2"));

        http("第二次访问 TesterHome 首页", http -> http
            .get("https://testerhome.com/topics")
            .queryParam("page", "2"));
    }

}
import com.liyunx.groot.testng.GrootTestNGTestCase;
import com.liyunx.groot.testng.annotation.GrootSupport;
import org.testng.annotations.Test;

import static com.liyunx.groot.protocol.http.HttpVirtualRunner.http;

public class GetTest extends GrootTestNGTestCase {

    @Test
    @GrootSupport
    public void testGet() {
        http("访问 TesterHome 首页", http -> http
            .get("https://testerhome.com/topics?page=2"));

        http("第二次访问 TesterHome 首页", http -> http
            .get("https://testerhome.com/topics")
            .queryParam("page", "2"));
    }

}

配置环境数据

通常我们不希望将 baseUrl 硬编码在业务测试逻辑中,这里将它们提取到环境配置文件。

创建环境配置文件 src/test/resources/env-test.yml,配置一个名称为 test 的环境。下面的内容表示针对 HTTP 组件配置,对任何 HTTP 请求设置默认 baseUrl 为 https://testerhome.com/

yaml
http:
  any:
    baseUrl: https://testerhome.com/
http:
  any:
    baseUrl: https://testerhome.com/

创建执行引擎配置文件 src/test/resources/groot-test.yml(这里的 test 不是环境名称,是个固定值),默认激活 test 环境。

yaml
environment:
  active: test
environment:
  active: test

修改上面的用例,去掉 baseUrl 前缀:

java
@Test
@GrootSupport
public void testGet() {
    http("访问 TesterHome 首页", http -> http
        .get("/topics?page=2"));

    http("第二次访问 TesterHome 首页", http -> http
        .get("/topics")
        .queryParam("page", "2"));
}
@Test
@GrootSupport
public void testGet() {
    http("访问 TesterHome 首页", http -> http
        .get("/topics?page=2"));

    http("第二次访问 TesterHome 首页", http -> http
        .get("/topics")
        .queryParam("page", "2"));
}

低代码用例

基于上面的环境配置,编写和上面 Java 用例等价的 Yaml 用例。

java
import com.liyunx.groot.testng.GrootTestNGTestCase;
import com.liyunx.groot.testng.annotation.GrootSupport;
import org.testng.annotations.Test;

import static com.liyunx.groot.SessionRunner.getSession;

public class GetTest extends GrootTestNGTestCase {

    @Test
    @GrootSupport
    public void testGet2() {
        getSession().run("testcases/get.yml");
    }

}
import com.liyunx.groot.testng.GrootTestNGTestCase;
import com.liyunx.groot.testng.annotation.GrootSupport;
import org.testng.annotations.Test;

import static com.liyunx.groot.SessionRunner.getSession;

public class GetTest extends GrootTestNGTestCase {

    @Test
    @GrootSupport
    public void testGet2() {
        getSession().run("testcases/get.yml");
    }

}

Yaml 用例 src/test/resources/testcases/get.yml

yml
name: 第一个低代码用例
steps:
  - name: 访问 TesterHome 首页
    http:
      url: /topics?page=2
      method: GET
  - name: 第二次访问 TesterHome 首页
    http:
      url: /topics
      method: GET
      params:
        page: 2
name: 第一个低代码用例
steps:
  - name: 访问 TesterHome 首页
    http:
      url: /topics?page=2
      method: GET
  - name: 第二次访问 TesterHome 首页
    http:
      url: /topics
      method: GET
      params:
        page: 2

Groovy 用例

如果你熟悉 Groovy 语法,使用 Groovy 用例会让用例书写更简洁。

引入 Groovy 插件支持(用于 Groovy 编译):

xml
<build>
    <plugins>
            <plugin>
                <groupId>org.codehaus.gmavenplus</groupId>
                <artifactId>gmavenplus-plugin</artifactId>
                <version>3.0.2</version>
                    <executions>
                        <execution>
                            <goals>
                                <goal>compile</goal>
                                <goal>compileTests</goal>
                            </goals>
                        </execution>
                    </executions>
            </plugin>
    </plugins>
</build>
<build>
    <plugins>
            <plugin>
                <groupId>org.codehaus.gmavenplus</groupId>
                <artifactId>gmavenplus-plugin</artifactId>
                <version>3.0.2</version>
                    <executions>
                        <execution>
                            <goals>
                                <goal>compile</goal>
                                <goal>compileTests</goal>
                            </goals>
                        </execution>
                    </executions>
            </plugin>
    </plugins>
</build>
kotlin
plugins {
    id("groovy")
}
plugins {
    id("groovy")
}

src/test/groovy 目录下创建 Groovy 类,如下所示。

groovy
import com.liyunx.groot.testng.GrootTestNGTestCase
import com.liyunx.groot.testng.annotation.GrootSupport
import org.testng.annotations.Test

import static com.liyunx.groot.protocol.http.HttpVirtualRunner.http

class GroovyGetTest extends GrootTestNGTestCase{

    @Test
    @GrootSupport
    public void testGet() {
        http("访问 TesterHome 首页") {
            get("/topics?page=2")
        }

        http("第二次访问 TesterHome 首页") {
            get("/topics")
            queryParam("page", "2")
        }
    }

}
import com.liyunx.groot.testng.GrootTestNGTestCase
import com.liyunx.groot.testng.annotation.GrootSupport
import org.testng.annotations.Test

import static com.liyunx.groot.protocol.http.HttpVirtualRunner.http

class GroovyGetTest extends GrootTestNGTestCase{

    @Test
    @GrootSupport
    public void testGet() {
        http("访问 TesterHome 首页") {
            get("/topics?page=2")
        }

        http("第二次访问 TesterHome 首页") {
            get("/topics")
            queryParam("page", "2")
        }
    }

}