单元测试之 - Review一个微服务的单元测试

这里以github上一个microservice的demo代码为例,来看看如何为一个完整的服务编写单元测试。具体代码如下所示,我们重点查看一下catalog和customer,order中的单元测试有哪些。

首先来看catalog服务的单元测试,这个服务下面主要编写了CatalogWebIntegrationTest.java和RepositoryTest.java。下图是CatlogWebIntegrationTest的代码,左边是@RunWith,@SpringBootTest等注解,@ActiveProfile的作用时指定使用application-test.properties配置文件中的值。setup()中初始化了RestTemplate,查询了一个iPodNano。

右边是具体的两个集成测试,集成测试本质是通过restTemplate调用应用接口,验证接口返回的内容。默认情况下,Spring Boot 使用 H2 数据库配置 DataSource bean,具体配置可以在 application.properties 或 application.yml 文件中设置。通常,集成测试的配置文件会使用 H2 数据库配置来进行测试,以确保测试是快速且独立的。理论上来说,如果使用H2数据库,因为是内存数据库,每次运行测试前都需要自动准备测试数据,以下面的的代码为例,在@Before中应该先往H2数据库中插入数据,这样才能保证@Test中调用Get请求的时候,能获取到期望的数据。所以,下面的自动化测试理论上还需要优化,不能直接在setup()部分通过查询获取测试数据,因为可能数据库中并没有name=iPod nano的数据。

接着再看看RepositoryTest.java.这也是个集成测试,调用实例化的itemRepository对象获取数据,并校验结果,这个测试的问题也是没有在@Before阶段准备测试数据,即提前往数据库中插入数据进行测试。

Customer服务中包含集成测试和契约测试,集成测试和上面Catalog服务基本相似,不再重复说明,对于契约测试,现在spring框架提供了专门生成契约测试的包,所以,老的编写契约测试的方式也不再review,忽略掉。接下来看看Eureka-server服务的测试。如下所示:

可以看到,也是一个集成测试,@LocalServerPort注解是用于获取应用启动时生成的随机端口,如果port设置了值,则用自定义port值。测试中,用restTemplate调用了服务的两个接口,查看返回的response是否是200.201等。这里因为测试的是eureka server,集成测试保证服务能正常启动即可。

order服务中的集成测试和catalog服务中集成测试基本一致,所以,也不用再次review。可以看到,对于一个完整的应用,编写单元或者集成测试基本就是常用的几个注解。运用前面介绍的知识,完成可以为真实项目服务编写完成的单元测试或者集成测试。

单元测试、集成测试、契约测试传送门:

单元测试之- mock工具mockito_taoli-qiao的博客-CSDN博客单元测试之 - Spring框架提供的单元/集成测试注解_taoli-qiao的博客-CSDN博客

契约测试之 - 使用Pact-JS编写契约测试_taoli-qiao的博客-CSDN博客

相关推荐
安冬的码畜日常3 小时前
【JUnit实战3_29】第十八章:REST API 接口测试(上)——RESTful 风格的后端 API 的搭建
测试工具·单元测试·restful·rest api·junit 5
安冬的码畜日常7 小时前
【JUnit实战3_30】第十八章:REST API 接口测试(下)—— REST API 接口的 MockMvc + JUnit 5 测试实战
测试工具·junit·单元测试·restful·rest api·junit5
慧都小项11 小时前
Parasoft C/C++test如何使用桩函数替代MFC窗口类顺利执行单元测试
单元测试·parasoft·桩函数·mfc窗口类
慧都小项20 小时前
Parasoft C/C++test中Trace32调试器的配置与单元测试执行
单元测试·parasoft·trace32调试器
JosieBook2 天前
【SpringBoot】31 核心功能 - 单元测试 - JUnit5 单元测试中的断言机制——验证你的代码是否按预期执行了
spring boot·单元测试·log4j
l1t2 天前
编译SQLite 3.51源码并体验新功能
单元测试·sqlite·duckdb
川石课堂软件测试2 天前
Python | 高阶函数基本应用及Decorator装饰器
android·开发语言·数据库·python·功能测试·mysql·单元测试
Filotimo_2 天前
springboot的单元测试功能有什么用
spring boot·单元测试·log4j
不光头强2 天前
Spring整合单元测试
spring·单元测试·log4j
慧都小项2 天前
Parasoft C/C++test如何在CCS3环境下进行F2812项目的单元测试
单元测试·parasoft·ccs3