Springboot单元测试

Posted by Wh0ami-hy on August 4, 2024

1. 单元测试

软件测试分为多种类型,但开发人员一般只涉及单元测试和集成测试

单元测试用于验证相关的一小段代码是否正常工作。传统的单元测试,即是测试一个函数是否正确运行。单元测试可以为这个函数预先伪造一个测试环境,例如用户登录了,且已经有超管权限了,那么运行这个函数是否能够得到我们期望得到的结果

单元测试就是一部分代码,但是它

  • 不会在正常的业务流程中被执行
  • 不被打包进入最终的编译程序
  • 不会被任何其他业务代码以任何方式导入
  • 不会影响正常的代码

当然,它通常还要满足下面这些条件

  • 自动化的,不需要人工输入任何数据即可完成
  • 独立的,任何两个单元测试之间都不应该发生调用关系
  • 可重复的,单元测试可以无限重复执行且结果应该一致

2. spring-boot-starter-test

SpringBoot中有关测试的框架,主要来源于 spring-boot-starter-test。一旦依赖了spring-boot-starter-test,下面这些类库将被一同依赖进去:

  • JUnit:java测试事实上的标准。
  • Spring Test & Spring Boot Test:Spring的测试支持。
  • AssertJ:提供了流式的断言方式。
  • Hamcrest:提供了丰富的matcher。
  • Mockito:mock框架,可以按类型创建mock对象,可以根据方法参数指定特定的响应,也支持对于mock调用过程的断言。
  • JSONassert:为JSON提供了断言功能。
  • JsonPath:为JSON提供了XPATH功能。

3. 插件 Squaretest

强烈推荐这个自动生成单元测试代码的插件

在选中类右键Generate -> Generate Test 后,不光能生成测试类和方法,甚至连Mockito 数据、方法和 Assertions 等都写好了,只需要自己改一改即可。

要测试哪个类,点进当前类,右键->Go To->Test->Create New Test,在 Testing library 中选择 Junit5,则在对应目录生成测试类和方法。

4. 实践

单元测试不需要启动项目,也不会连接数据库、RPC注 册中心等,但是相应的所有数据都需要打桩 Mock

Squaretest生成的单元测试方法都是只能生成public的

生成的代码说明,以查询方法SelectGiftLis为例:如果是测试service接口,一般使用serviceImpl来写测试用例,serviceImpl中一般会引入mapper接口。

测试代码中一般都是先生成一个对象,传入mapper接口方法的参数中,并且会创建一个mapper接口的返回对象。然后在使用serviceImpl来测试查

询方法,mock一个同样的查询参数,serviceImpl查询时就会有返回值。最后比对mapper接口返回的结果和serviceImpl查询返回的结果是否一致。

一致则通过测试,不一致则测试不通过。


本站总访问量