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