springboot从零入门之接口测试!

接口测试

接口测试就是测试系统组件间的接口,检测外部系统与系统之间以及内部各个子系统之间的交互点,重点是检查数据的交换、传递和控制管理过程以及系统间的相互逻辑依赖关系等。对于Web开发来说,接口测试主要是测试对外暴露的接口,测试不同情况下的入参对应的出参信息,从而判断接口是否符合或满足相应的功能性和安全性要求。开发人员在完成接口的功能之后需要进行自测,自测完成后,测试人员再对接口进行自动化测试,包括白盒测试、黑盒测试和压力测试等。

目前,开发人员常用的接口测试工具有很多种,客户端的有Postman、jMeter、RestClient和SoapUI等,Web端的有Postwoman。本书推荐的工具是Postman和Postwoman。Postman使用起来非常简单,支持团队测试用例协同管理,支持GET、POST、PUT和DELETE等多种请求方式,支持文件上传、响应验证、变量管理和环境参数管理等功能,还可以批量运行接口测试,并支持用例导出和导入功能,是一款非常实用的免费软件;Postwoman是Postman的Web版,不需要安装即可使用。

实战:使用Postman测试接口

请读者自行前往Postman官方网站下载最新版本,并将其安装到自己的计算机上。本书采用的Postman版本为8.0.7。在本地安装完成Postman后将其打开,初始化界面如图2.7所示。

图2.7 Postman初始化界面

在图2.7中,序号1为新建一个接口测试的标签页,序号2为导入测试案例,序号3为保存当前接口测试的例子,序号4为所有接口测试的历史记录。

现在创建一个请求,使用Postman发送请求到服务器,并获取返回值。单击"+"跳转到新建接口测试页面,按照如图2.8所示填充请求的参数,单击Send按钮即可完成请求的发送,并返回hello lihuacheng。

如图2.8所示,创建一个HTTP请求一共有以下几个步骤:

图2.8 Postman创建一个请求参数

(1)选择HTTP请求,GET或POST。

(2)添加请求的URL地址。

(3)添加请求的参数。

(4)单击Send按钮,发送请求到服务器,查看返回值。

下面举例说明使用Postman测试不同接口请求的过程。

  1. GET请求

请求接口的地址为localhost:9090/helloGet?userName=lihuacheng。

可以得到的返回值为hello lihuacheng,过程如图2.8所示。

  1. POST请求

POST请求有两种参数提交的方式,即Form和JSON。(1)Form表单提交参数。POST请求和GET请求的区别只是把GET请求换成了POST请求,创建的请求页面如图2.9所示。

图2.9 Postman发送POST请求方式1

(2)JSON提交参数。与使用Form表单提交参数请求相比,JSON提交的参数放置在Body中,现在企业开发通常使用这种方式进行前后端的数据交互,创建的请求如图2.10所示。

图2.10 Postman发送POST请求方式2

  1. PUT请求

PUT请求和POST中JSON请求方式的区别在于,它将POST请求换成了PUT请求,请求的页面如图2.11所示。

图2.11 Postman发送PUT请求

以上即完成了Postman发送HTTP的基本请求,包含GET、POST和PUT,以及参数的设置和结果的查看,这类接口测试在本地的开发中非常实用(测试代码请参考源代码)。

认识Swagger2 UI

Swagger2 UI是Swagger中用于显示Restful接口文档的项目。在项目中由HTML、JavaScript和CSS文件组成一个接口文档,没有其他的外部依赖。

Swagger2 UI可以根据业务代码中的注解生成相应的API文档,方便开发人员阅读。

在项目开发中使用Swagger2 UI的好处有以下几点:

生成的界面比Java doc生成的界面更加美观;

可以实时同步API文档(修改代码后,文档同步修改);解析速度快,效率高;

能很好地支持现有Spring MVC框架;

可以充当前后端交流的重要桥梁,方便、快捷。

Swagger2 UI允许项目中生产、显示和消费Restful服务,不需要代理和第三方服务;Swagger2 UI是一个依赖自由的资源集合,它能通过Swagger2API动态地生成漂亮的文档;Swagger2 UI还可以部署到任意服务器的开发环境中。

实战:项目集成Swagger2实现可视化接口

如果要在项目中使用Swagger2 UI,需要以下几个步骤:

(1)添加Swagger2 UI依赖到Spring Boot项目的pom.xml中,本书使用的Swagger2 UI版本号为2.9.2。Swagger2 UI的依赖代码如下:

<!-- 添加Swagger2 UI的依赖 -->

<dependency>

<groupId>io.springfox</groupId>

<artifactId>springfox-swagger-ui</artifactId>

<version>2.9.2</version>

</dependency>

<dependency>

<groupId>io.springfox</groupId>

<artifactId>springfox-swagger2</artifactId>

<version>2.9.2</version>

</dependency>

(2)在项目中启用Swagger2 UI,需在Spring Boot的启动类中加注解@EnableSwagger2,以开启Swagger2 UI接口文档,并引入需要的包,代码如下:import

springfox.documentation.swagger2.annotations.EnableSwagger2;

(3)添加一个端口用来测试,在application.properties文件中添加以下代码:

server.port=9090

(4)打开浏览器访问本地链接

http://localhost:9090/swaggerui.html,显示Swagger2 UI的初始化页面,如图2.12所示。因为暂时没有添加API文档,所以页面为空。

图2.12 Swagger2 UI初始化页面

提示:在Spring Boot项目中,集成插件或者框架有个很重要的特性,使用@EnableXXX注解就能启用当前注解。例如,@EnableCaching启用缓存,@EnableAsync启用多线程,@EnableDubbo启用Dubbo。

(5)为了让Swagger2 UI文档显得更有条理性,需要对Swagger2 UI进行设置。在com.onyx.springbootdemo包中增加一个Swagger2 UI的配置类Swagger2Config,同时把启动类的@EnableSwagger2转移到配置类中,以保证配置的完整性。配置类的代码如下:

import io.swagger.annotations.ApiOperation;

import org.springframework.context.annotation.Bean;

import org.springframework.context.annotation.Configuration;

import springfox.documentation.builders.ApiInfoBuilder;

import springfox.documentation.builders.PathSelectors;

import springfox.documentation.builders.RequestHandlerSelectors;

import springfox.documentation.service.ApiInfo;

import springfox.documentation.service.ApiKey;

import springfox.documentation.spi.DocumentationType;

import springfox.documentation.spring.web.plugins.Docket;

import springfox.documentation.swagger2.annotations.EnableSwagger2;

import java.util.ArrayList;

import java.util.List;

@Configuration

@EnableSwagger2

public class Swagger2Config {

@Bean

public Docket createRestApi() {

return new Docket(DocumentationType.SWAGGER_2)

.select()

// 方法需要有ApiOperation注解才能生成接口文档

.apis(RequestHandlerSelectors.withMethodAnnotation

(ApiOperation.class))

// 路径使用any风格

.paths(PathSelectors.any())

.build()

// 如何保护API,有3种验证,即ApiKey、BasicAuth和OAuth

// 这里的保护为可选

.securitySchemes(security())

// 接口文档的基本信息

.apiInfo(apiInfo());

}

/**

* 接口文档的详细信息

*

* @return

*/ private ApiInfo apiInfo() {

return new ApiInfoBuilder()

.title("swagger2 UI API文档")

.description("api文档")

.termsOfServiceUrl("http://localhost:9090/swagger

ui.html#/")

.version("1.0.0")

.build();

}

/**

* 安全信息

* @return

*/

private List<ApiKey> security() {

ArrayList<ApiKey> apiKeys = new ArrayList<>();

apiKeys.add(new ApiKey("root","root","123456"));

return apiKeys;

}

}

(6)添加完配置代码,然后重启Spring Boot项目,再次访问

http://localhost:9090/swagger-ui.html,会返回具体的API信息,如图2.13所示。

图2.13 配置后的Swagger2 UI页面

(7)使用Swagger2 UI的注解生成API文档,在Controller包中新建UserController类,代码如下:

import io.swagger.annotations.*;

import org.springframework.web.bind.annotation.*;

@Api("用户模块")

@RestController

public class UserController {

@ApiOperation("helloGet方法")

@ApiImplicitParams({

@ApiImplicitParam(name = "username",value = "名字",required

= true)

})

@GetMapping("/helloGet")

public String helloGet(@RequestParam("userName") @ApiParam("请求的

名字")String username) {

return "hello " + username;

}

@ApiOperation("helloPostJSON方法")

@PostMapping("/helloPostJSON")

public String helloPostJSON(@RequestBody UserVO userVO) {

return "hello " + userVO.getUserName();

}

}

@ApiModel(description = "用户实体类")

class UserVO {

@ApiModelProperty("userVo的用户名")

private String userName;

public String getUserName() {

return userName;

}

public void setUserName(String userName) {

this.userName = userName;

}

}

(8)重启当前项目之后再次访问

http://localhost:9090/swaggerui.html,就能看到GET请求和POST请求的API文档,如图2.14所示。

图2.14 API文档列表

(9)选择POST命令,查看POST请求的具体入参。如图2.15所示为POST请求的具体文档,因为当前的POST方法是JSON形式,所以请求的参数是JSON。

图2.15 POST请求

以上代码简单地设置了Swagger2 UI,它还有其他一些注解,参见表2.4。

表2.4 Swagger2 UI注解

说明:在项目中使用Swagger2 UI注解即可完成项目API文档的编写。在代码开发完成后,不再需要单独写一份接口文档,而且修改代码后能第一时间修改接口文档,不会造成接口文档和实际接口不一致的问题。

相关推荐
葫芦和十三3 小时前
图解 MongoDB 21|选举与 failover:Primary 是怎么选出来的
后端·mongodb·agent
GetcharZp3 小时前
26k Star 开源内网穿透神器 NetBird,一分钟实现全球设备互联!
后端
考虑考虑4 小时前
Mybatis实现批量插入
java·后端·mybatis
咖啡八杯4 小时前
GoF设计模式——中介者模式
java·后端·spring·设计模式
lizhongxuan7 小时前
多Agent之间的区别
后端
青石路8 小时前
记一次多JDK版本问题的排查,一坑套一坑,差点没爬上来
java
杨充9 小时前
1.面向对象设计思想
后端
IT_陈寒9 小时前
Java的Date类又坑了我一次,改用时间戳真香
前端·人工智能·后端
systemPro10 小时前
2.6亿条设备数据,历史查询从超时到50ms,我做了什么
后端
要阿尔卑斯吗10 小时前
提示词优化启示:为什么“按顺序输出“比“关键度评分“更有效
后端