1. 概述

本文将介绍 ZeroCode 自动化测试框架。我们将通过一个 REST API 测试的例子,来学习其基本使用方式。

2. 核心设计理念

ZeroCode 框架采用了以下两种核心设计思路:

  • ✅ 多维度测试支持
  • ✅ 声明式测试风格

我们分别来看一下。

2.1. 多维度测试支持

ZeroCode 设计之初就是为了支持应用多个层面的自动化测试,包括但不限于:

  • REST 接口
  • SOAP 接口
  • 安全性测试
  • 负载/压力测试
  • 数据库操作
  • Apache Kafka 消息处理
  • GraphQL 查询
  • Open API 规范验证

这些测试都可以通过框架提供的 DSL(领域特定语言)来完成,我们稍后会详细介绍。

2.2. 声明式测试风格

ZeroCode 使用的是声明式测试方式,也就是说,你不需要编写具体的测试代码。你只需要在 JSON 或 YAML 文件中定义测试场景,框架会自动帮你执行并验证结果。这种方式能让你更专注于“要测什么”,而不是“怎么去测”。

3. 环境搭建

pom.xml 文件中添加以下依赖即可:

<dependency>
    <groupId>org.jsmart</groupId>
    <artifactId>zerocode-tdd</artifactId>
    <version>1.3.27</version>
    <scope>test</scope>
</dependency>

最新版本可以从 Maven Central 获取。

如果你使用的是 IntelliJ IDEA,还可以安装 ZeroCode 插件,提升开发体验:Jetbrains Marketplace

4. REST API 测试实战

虽然 ZeroCode 支持多种测试类型,但本文我们聚焦于 REST API 测试。为此,我们创建一个简单的 Spring Boot Web 应用,并暴露一个接口:

@PostMapping
public ResponseEntity create(@RequestBody User user) {
    if (!StringUtils.hasText(user.getFirstName())) {
        return new ResponseEntity("firstName can't be empty!", HttpStatus.BAD_REQUEST);
    }
    if (!StringUtils.hasText(user.getLastName())) {
        return new ResponseEntity("lastName can't be empty!", HttpStatus.BAD_REQUEST);
    }
    user.setId(UUID.randomUUID().toString());
    users.add(user);
    return new ResponseEntity(user, HttpStatus.CREATED);
}

对应的 User 类如下:

public class User {
    private String id;
    private String firstName;
    private String lastName;

    // standard getters and setters
}

当创建用户时,系统会自动生成一个唯一 ID,并返回完整的 User 对象。接口路径为 /api/users,为简化演示,我们将用户数据保存在内存中。

5. 编写测试场景

在 ZeroCode 中,场景(Scenario)是测试的核心单位,它由一个或多个步骤组成。我们先写一个简单的场景,用于测试用户成功创建的流程:

{
  "scenarioName": "test user creation endpoint",
  "steps": [
    {
      "name": "test_successful_creation",
      "url": "/api/users",
      "method": "POST",
      "request": {
        "body": {
          "firstName": "John",
          "lastName": "Doe"
        }
      },
      "verify": {
        "status": 201,
        "body": {
          "id": "$NOT.NULL",
          "firstName": "John",
          "lastName": "Doe"
        }
      }
    }
  ]
}

各字段含义如下:

  • scenarioName: 场景名称,可自定义
  • steps: 步骤数组,每个元素表示一个测试步骤
    • name: 步骤名称
    • url: 接口路径(支持相对路径)
    • method: HTTP 方法
    • request: 请求内容
      • body: 请求体
    • verify: 响应验证规则
      • status: 状态码
      • body: 响应体字段验证

在这个步骤中,我们验证用户创建是否成功,包括返回的 firstName、lastName 和非空的 ID。

通常,一个场景会包含多个步骤。我们再加一个验证 firstName 不能为空的测试步骤:

{
  "name": "test_firstname_validation",
  "url": "/api/users",
  "method": "POST",
  "request": {
    "body": {
      "firstName": "",
      "lastName": "Doe"
    }
  },
  "verify": {
    "status": 400,
    "rawBody": "firstName can't be empty!"
  }
}

这里由于返回的是纯文本,我们使用 rawBody 字段来验证响应内容。

⚠️ 注意:ZeroCode 本身不能直接运行 JSON 场景,还需要通过 JUnit 测试类来触发。

6. 编写测试类

为了运行上述场景,我们需要编写一个对应的测试类:

@RunWith(ZeroCodeUnitRunner.class)
@TargetEnv("rest_api.properties")
public class UserEndpointIT {

    @Test
    @Scenario("rest/user_create_test.json")
    public void test_user_creation_endpoint() {
    }
}

说明:

  • @RunWith(ZeroCodeUnitRunner.class): 指定使用 ZeroCode 的 Runner
  • @TargetEnv("rest_api.properties"): 指定配置文件
  • @Test: 标记为测试方法
  • @Scenario: 指定场景文件路径

测试方法体为空,因为我们不需要写任何 Java 测试代码,所有逻辑都在 JSON 中定义。

配置文件说明

我们在 rest_api.properties 文件中定义测试环境配置:

web.application.endpoint.host=http://localhost
web.application.endpoint.port=8080
web.application.endpoint.context=

这些配置用于拼接完整的请求 URL。

7. 执行测试

准备好场景、配置文件和测试类之后,就可以运行测试了。推荐使用 Maven 的 failsafe 插件进行集成测试:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-failsafe-plugin</artifactId>
    <version>3.1.2</version>
    <dependencies>
        <dependency>
            <groupId>org.apache.maven.surefire</groupId>
            <artifactId>surefire-junit47</artifactId>
            <version>3.1.2</version>
        </dependency>
    </dependencies>
    <executions>
        <execution>
            <goals>
                <goal>integration-test</goal>
                <goal>verify</goal>
            </goals>
        </execution>
    </executions>
</plugin>

执行命令:

mvn verify -Dskip.it=false

测试执行后,ZeroCode 会在 target 目录下生成详细的日志和报告,方便排查问题。

8. 总结

本文我们介绍了 ZeroCode 测试框架的基本用法,并以 REST API 测试为例展示了其声明式测试的优势。ZeroCode 通过 JSON 场景文件,大大简化了测试代码的编写工作,让开发者更专注于业务逻辑的验证。

✅ 适合快速构建接口自动化测试套件
✅ 支持多种协议和中间件测试
✅ 无需编写测试代码,只需定义场景

源码示例可在 GitHub 获取:https://github.com/eugenp/tutorials/tree/master/testing-modules/zerocode


原始标题:Introduction to ZeroCode | Baeldung