1.概述
在本文中,我们将介绍ZeroCode自动化测试框架。我们将通过一个REST API测试示例来学习基础知识。
2.方法
ZeroCode框架采用以下方法:
- 多方面的测试支持
- 声明式测试
让我们一起讨论它们。
2.1。多方面的测试支持
该框架旨在支持对我们应用程序的多个方面进行自动化测试。除其他外,它使我们能够测试:
- REST
- SOAP
- 安全
- 压力测试
- 数据库
- Apache Kafka
- GraphQL
- Open API规范
测试是通过框架的DSL完成的,我们将在稍后进行讨论。
2.2。声明式
ZeroCode使用一种声明式的测试样式,这意味着我们不必编写实际的测试代码。我们在JSON / YAML文件中声明场景,然后框架会将它们“翻译”为幕后测试代码。这有助于我们将精力集中在要测试的内容上,而不是如何进行测试。
3.依赖项
pom.xml
文件中添加Maven依赖项:
<dependency>
<groupId>org.jsmart</groupId>
<artifactId>zerocode-tdd</artifactId>
<version>1.3.27</version>
<scope>test</scope>
</dependency>
最新版本在Maven Central上可用。我们也可以使用Gradle。如果使用的是IntelliJ,则可以从Jetbrains Marketplace下载ZeroCode插件。
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中起着核心作用。它由一个或多个步骤组成,这是我们要测试的实际内容。让我们用一个步骤编写一个场景,以测试用户创建的成功路径:
{
"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
– JSON对像数组,我们在其中描述要测试的内容-
name
-我们为步骤指定的名称 -
url
–端点的相对URL;我们也可以输入一个绝对URL,但是通常这不是一个好主意 -
method
– HTTP方法 request
– HTTP请求-
body
– HTTP请求正文
-
verify
–在这里,我们验证/确认服务器返回的响应-
status
– HTTP响应状态代码 -
body
(在verify属性内)– HTTP响应正文
-
-
在此步骤中,我们检查用户创建是否成功。我们检查服务器返回firstName
和lastName
另外,我们使用ZeroCode的断言令牌来验证id是否不为null
通常,在方案中我们要完成多个步骤。让我们在场景的steps
数组中添加另一个步骤:
{
"name": "test_firstname_validation",
"url": "/api/users",
"method": "POST",
"request": {
"body": {
"firstName": "",
"lastName": "Doe"
}
},
"verify": {
"status": 400,
"rawBody": "firstName can't be empty!"
}
}
在此步骤中,我们提供了一个空的名字,这将导致错误的请求。在这里,响应主体将不是JSON格式,因此我们使用rawbody
属性将其称为纯字符串。
ZeroCode无法直接运行该场景-为此,我们需要一个相应的测试用例。
6.编写测试用例
为了执行我们的场景,让我们编写一个相应的测试用例:
@RunWith(ZeroCodeUnitRunner.class)
@TargetEnv("rest_api.properties")
public class UserEndpointIT {
@Test
@Scenario("rest/user_create_test.json")
public void test_user_creation_endpoint() {
}
}
在这里,我们声明一个方法,并使用@Test
批注将其标记为测试。我们可以将JUnit 5与ZeroCode一起使用,仅用于负载测试。
@Scenario
注释指定了脚本的位置,该注释来自ZeroCode框架。方法主体为空。正如我们所说,我们没有编写实际的测试代码。我们的场景中描述了我们要测试的内容。我们只是在测试案例方法中引用该场景。我们的UserEndpointIT
类具有两个注释:
-
@RunWith
–在这里,我们指定哪个ZeroCode类负责运行我们的方案 -
@TargetEnv
–这指向在我们的方案运行时将使用的属性文件
当我们在url
属性时,我们指定了相对路径。显然,ZeroCode框架需要一个绝对路径,因此我们创建了一个rest_api.properties
文件,其中包含一些用于定义测试运行方式的属性:
-
web.application.endpoint.host
– REST API的主机;在我们的例子中,它是http://localhost
-
web.application.endpoint.port
–公开我们的REST API的应用程序服务器的端口;在我们的例子中是8080 -
web.application.endpoint.context
– API的上下文;在我们的情况下,它是空的
我们在属性文件中声明的属性取决于我们正在执行的测试类型。例如,如果我们要测试Kafka生产者/消费者,我们将具有不同的属性。
7.执行测试
我们已经创建了一个场景,属性文件和测试用例。现在,我们准备运行测试。由于ZeroCode是一个集成测试工具,因此我们可以利用Maven的failsafe
插件:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-failsafe-plugin</artifactId>
<version>3.0.0-M5</version>
<dependencies>
<dependency>
<groupId>org.apache.maven.surefire</groupId>
<artifactId>surefire-junit47</artifactId>
<version>3.0.0-M5</version>
</dependency>
</dependencies>
<executions>
<execution>
<goals>
<goal>integration-test</goal>
<goal>verify</goal>
</goals>
</execution>
</executions>
</plugin>
要运行测试,我们可以使用以下命令:
mvn verify -Dskip.it=false
ZeroCode创建了多种类型的日志,我们可以在${project.basedir}/target
文件夹中签出。
8.结论
在本文中,我们研究了ZeroCode自动化测试框架。我们以REST API测试为例展示了该框架如何工作。我们还了解到ZeroCode DSL消除了编写实际测试代码的需要。
0 评论