当前位置:   article > 正文

Spring Boot整合Swagge和压力测试_springboot 接口压力测试

springboot 接口压力测试

规范项目模块

模块说明

maven支持继承和组合

book-swagger2   #父
   --book-common     #子模块      组合方式访问domain  
   --book-domain     #子模块
   --book-bk
  • 1
  • 2
  • 3
  • 4

image-20231011185825131

Spring Boot 整合 Swagger

添加项目依赖

book-swagger2pom.xml中添加依赖

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.6.13</version>
</parent>

<dependencies>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
</dependencies>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

book-bk 模块在pom.xml中引入 book-common, book-domain 模块和相关依赖

<dependency>
    <groupId>com.yang.swagger.common</groupId>
    <artifactId>book-common</artifactId>
    <version>1.0-SNAPSHOT</version>
</dependency>

<dependency>
    <groupId>com.yang.swagger.domain</groupId>
    <artifactId>book-domain</artifactId>
    <version>1.0-SNAPSHOT</version>
</dependency>

<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <scope>test</scope>
</dependency>

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
</dependency>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
Swagger是什么

Swagger是一组围绕 OpenAPI 规范构建的开源工具,可帮助您设计、构建、记录和使用 REST API。主要的 Swagger 工具包括:Swagger Editor – 基于浏览器的编辑器,您可以在其中编写 OpenAPI 规范。Swagger UI – 将 OpenAPI 规范呈现为交互式 API 文档。swagger2于17年停止维护,现在最新的版本为 Swagger3(Open Api3)。

image-20231011190521343

knife4j(swagger的本地增强解决方案)

image-20230628112011921

knife4j与springboot的兼容性
Spring Boot版本Knife4j Swagger2规范Knife4j OpenAPI3规范
1.5.x~2.0.0<Knife4j 2.0.0>=Knife4j 4.0.0
2.0~2.2Knife4j 2.0.0 ~ 2.0.6>=Knife4j 4.0.0
2.2.x~2.4.0Knife4j 2.0.6 ~ 2.0.9>=Knife4j 4.0.0
2.4.0~2.7.x>=Knife4j 4.0.0>=Knife4j 4.0.0
>= 3.0>=Knife4j 4.0.0>=Knife4j 4.0.0
bk 模块中引入依赖
<dependency>
    <groupId>com.github.xiaoymin</groupId>
    <artifactId>knife4j-openapi2-spring-boot-starter</artifactId>
    <version>4.1.0</version>
</dependency>
  • 1
  • 2
  • 3
  • 4
  • 5
配置文件
knife4j:
  enable: true                 #此项必配置,否则knife4j运行有问题
  openapi:
    title: knife4j项目的名称
    description: knife4j项目的描述
    email: 项目邮箱
    concat: 贡献者名称
    url: 项目的地址
    license: Apache 2.0
    license-url: http://www.apache.org/licenses/LICENSE-2.0
    terms-of-service-url: https://www.bilibili.com/video/BV1tK411y7Uf/
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

tips: 配置除enable,其它测试阶段可以省略。

常用注解

在返回对象上使用

在HttpResp(用户封装返回对象的类)

序列注解作用
1@ApiModel用对象来接收参数
2@ApiModelProperty用对象接收参数时,描述对象的一个字段
在Controller类和方法上使用
序列注解作用
1@Api(tags = “Knife4jController接口类”)
2@Api修饰整个类,描述api(Controller)的作用
3@ApiOperation描述一个类的一个方法,或者说一个接口
4@ApiImplicitParam多个请求参数的描述信息
5@ApiImplicitParam(name = “name”,value=”请求的名称”,required = true)单个参数的描述信息
6@ApiIgnore使用该注解忽略这个API
7@ApiError发生错误返回的信息
@ApiImplicitParm的属性
序列属性作用
1paramType查询参数类型
path以地址形式提交数据
query直接跟参数完成映射赋值
body以流的形式提交 仅支持POST
header参数在request headers里面提交
form以form表单的形式提交,仅支持POST
2dataType参数的数据类型 只为标志说明 并没有实际验证
Long
String
3name接收参数名
4value接收参数的意义描述
5required参数是否必填
true必填
false非比填
6defaultValue默认值
项目案例
common 模块定义一个统一返回类型

数据, 时间, 代码, 信息

code, msg, data,time

@Data
@NoArgsConstructor
@AllArgsConstructor
public class HttpResult<T> {
    private int code;
    private String msg;
    private T result;
    private LocalDate time;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

这是简易版,一般这些信息需要通过 Enum 枚举类定义响应状态码, HttpResult获取响应状态码,然后把时间和信息封装后返回

domain 模块定义一个测试实体类简单件
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Type {
    private Integer id;
    private String name;
    private String createBy;
    private Date createTime;
    private Date updateTime;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
bk 模块实现一个Controller接口
@Api(tags = "图书类型接口")
@RestController
@RequestMapping("/api/type")
@Slf4j
public class TypeController {

    @Autowired
    private IBookService ibs;
    private int total = 0;

    @ApiOperation(value = "findAll", notes = "对所有图书类型查询")
    @GetMapping("/findAll")
    public HttpResult<Integer> findAll() {
        total += 1;
        log.debug("total:{}", total);
        return new HttpResult<>(200, "success", total, LocalDate.now());
        // public HttpResult<List<Type>> findAll() {
        //     List<Type> list = new ArrayList<>(20);
        //     for (int i = 1; i <= 100; i++) {
        //         list.add(new Type(i, "type_" + i, "admin", new Date(), new Date()));
        //     }
        //     log.debug("查询所有图书类型数量{}", list.size());
        //     return new HttpResult<>(200, "success", list, LocalDate.now());
    }

    @ApiOperation(value = "addType", notes = "添加新图书类型接口")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "name", value = "请输入新图书类型名称", required = true)
    })
    @PostMapping("/addType")
    public HttpResult<String> addType(String name) {
        log.debug("添加新的类型:{}", name);
        return new HttpResult<>(200, "success", name, LocalDate.now());
    }

    @ApiOperation(value = "uploadExcel", notes = "上传excel文件进行解析")
    @ApiImplicitParams({
            @ApiImplicitParam(value = "上传文件", required = true)
    })
    @PostMapping("/uploadExcel")
    public HttpResult<String> uploadExcel(@RequestPart @RequestParam("excel") MultipartFile excel) {
        String originalFilename = excel.getOriginalFilename();
        log.debug("上传文件名称:{}", originalFilename);
        return new HttpResult<>(200, "success", originalFilename + "上传成功", LocalDate.now());
    }

    @ApiOperation(value = "qiang", notes = "抢购图书")
    @PutMapping("/qiang")
    public HttpResult<Integer> qiang() {
        int retValue;
        try {
            retValue = ibs.qiangGou();
            log.debug("retValue:{}", retValue);
        } catch (Exception e) {
            return new HttpResult<>(500, e.getMessage(), -1, LocalDate.now());
        }
        return new HttpResult<>(200, "抢购成功", retValue, LocalDate.now());
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
测试

http://localhost:<端口>/doc.html

主页

image-20230628120930193

Model

image-20230628121007489

image-20230628121039830

image-20230628121101266

API测试

image-20230628121224269

产生离线文档

image-20230628121607935

压力测试(JMeter)

添加线程组

image-20231011192129596

image-20231011192321281

上述图表示 1s请求100次 执行1次

添加http请求

image-20231011192401510

image-20231011192626612

http请求填写如图所示,内容编码可不填写

添加结果树

image-20231011192501443

开始测试

image-20231011192758364

查看结果

image-20231011192828707

image-20231011192842451

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/442547
推荐阅读
相关标签
  

闽ICP备14008679号