作者:海向
来源:www.cnblogs.com/haixiang/p/13812363.html

为什么使用JUnit5

  • JUnit4被广泛使用,但是许多场景下使用起来语法较为繁琐,JUnit5中支持lambda表达式,语法简单且代码不冗余。

  • JUnit5易扩展,包容性强,可以接入其他的测试引擎。

  • 功能更强大提供了新的断言机制、参数化测试、重复性测试等新功能。

  • ps:开发人员为什么还要测试,单测写这么规范有必要吗?其实单测是开发人员必备技能,只不过很多开发人员开发任务太重导致调试完就不管了,没有系统化得单元测试,单元测试在系统重构时能发挥巨大的作用,可以在重构后快速测试新的接口是否与重构前有出入。

如图,JUnit5结构如下:

  • JUnit Platform :这是Junit提供的平台功能模块,通过它,其它的测试引擎都可以接入Junit实现接口和执行。

  • JUnit JUpiter :这是JUnit5的核心,是一个基于JUnit Platform的引擎实现,它包含许多丰富的新特性来使得自动化测试更加方便和强大。

  • JUnit Vintage :这个模块是兼容JUnit3、JUnit4版本的测试引擎,使得旧版本的自动化测试也可以在JUnit5下正常运行。

我们以 Spring Boot2.3.1 为例,引入如下依赖,防止使用旧的junit4相关接口我们将其依赖排除。

Spring Boot 基础就不介绍了,推荐看下面这个最新的实战教程。

https://github.com/javastacks/spring-boot-best-practice

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <scope>test</scope>
    <exclusions>
        <exclusion>
            <groupId>org.junit.vintage</groupId>
            <artifactId>junit-vintage-engine</artifactId>
        </exclusion>
    </exclusions>
</dependency>
 
  • @BeforeEach:在每个单元测试方法执行前都执行一遍

  • @BeforeAll:在每个单元测试方法执行前执行一遍(只执行一次)

  • @DisplayName("商品入库测试"):用于指定单元测试的名称

  • @Disabled:当前单元测试置为无效,即单元测试时跳过该测试

  • @RepeatedTest(n):重复性测试,即执行n次

  • @ParameterizedTest:参数化测试,

  • @ValueSource(ints = {1, 2, 3}):参数化测试提供数据

JUnit Jupiter提供了强大的断言方法用以验证结果,在使用时需要借助java8的新特性lambda表达式,均是来自org.junit.jupiter.api.Assertions包的static方法。

assertTrue`与`assertFalse`用来判断条件是否为`true`或`false
@Test
@DisplayName("测试断言equals")
void testEquals() {
 assertTrue(3 < 4);
 

assertNullassertNotNull用来判断条件是否为·null

@Test
@DisplayName("测试断言NotNull")
void testNotNull() {
 assertNotNull(new Object());
 

assertThrows用来判断执行抛出的异常是否符合预期,并可以使用异常类型接收返回值进行其他操作

@Test
@DisplayName("测试断言抛异常")
void testThrows() {
    ArithmeticException arithExcep = assertThrows(ArithmeticException.class, () -> {
        int m = 5/0;
    assertEquals("/ by zero", arithExcep.getMessage());
 

assertTimeout用来判断执行过程是否超时

@Test
@DisplayName("测试断言超时")
void testTimeOut() {
    String actualResult = assertTimeout(ofSeconds(2), () -> {
        Thread.sleep(1000);
        return "a result";
    System.out.println(actualResult);
 

assertAll是组合断言,当它内部所有断言正确执行完才算通过。Spring Boot 系列面试题和答案我都整理好了,关注公众号Java技术栈,回复:面试,可以免费获取。

@Test
@DisplayName("测试组合断言")
void testAll() {
    assertAll("测试item商品下单",
              () -> {
                  //模拟用户余额扣减
                  assertTrue(1 < 2, "余额不足");
              () -> {
                  //模拟item数据库扣减库存
                  assertTrue(3 < 4);
              () -> {
                  //模拟交易流水落库
                  assertNotNull(new Object());
 

重复性测试

在许多场景中我们需要对同一个接口方法进行重复测试,例如对幂等性接口的测试。

JUnit Jupiter通过使用@RepeatedTest(n)指定需要重复的次数

@RepeatedTest(3)
@DisplayName("重复测试")
void repeatedTest() {
    System.out.println("调用");
 

参数化测试

参数化测试可以按照多个参数分别运行多次单元测试这里有点类似于重复性测试,只不过每次运行传入的参数不用。需

要使用到@ParameterizedTest,同时也需要@ValueSource提供一组数据,它支持八种基本类型以及String和自定义对象类型,使用极其方便。

@ParameterizedTest
@ValueSource(ints = {1, 2, 3})
@DisplayName("参数化测试")
void paramTest(int a) {
    assertTrue(a > 0 && a < 4);
 

JUnit5提供了嵌套单元测试的功能,可以更好展示测试类之间的业务逻辑关系,我们通常是一个业务对应一个测试类,有业务关系的类其实可以写在一起。

这样有利于进行测试。而且内联的写法可以大大减少不必要的类,精简项目,防止类爆炸等一系列问题。

@SpringBootTest
@AutoConfigureMockMvc
@DisplayName("Junit5单元测试")
public class MockTest {
    //....
    @Nested
    @DisplayName("内嵌订单测试")
    class OrderTestClas {
        @Test
        @DisplayName("取消订单")
        void cancelOrder() {
            int status = -1;
            System.out.println("取消订单成功,订单状态为:"+status);
 

最后,关注公众号Java技术栈,在后台回复:面试,可以获取我整理的 Spring Boot 系列面试题和答案,非常齐全。

Java技术栈www.javastack.cn关注阅读更多优质文章作者:海向来源:www.cnblogs.com/haixiang/p/13812363.html为什么使用JUnit5J... Junit 5扩展 Spring Boot Starter在应用程序启动之前启动模拟服务器MockSmppBootstrapConfiguration 核心SMPP服务器对象的AssertJ断言 smpp-server-mock-core包含两个主要类: MockSmppServer和MockSmppServerHolder 。 MockSmppServer代表smpp服务器,它侦听连接,接收请求,产生响应并将请求保留在内存队列QueueSmppSessionHandler 。 使用JUnit 5扩展 添加JUnit 5测试依赖项: Maven: <dependency> <groupId>org.junit.jupite 该存储库具有不同的标签,每个JUnit 5的次要版本一个。当前,可用的标签如下: 5.0 :使用JUnit 5.0.3的示例。 基于一书的示例均基于该版本。 5.1 :使用JUnit 5.1.1的示例 5.2 :使用JUnit
Spring Boot,Elasticsearch,Testcontainers和JUnit5集成测试 一个简单的示例,演示测试容器,Elasticsearch和JUnit 5如何一起玩。 Spring Boot 2.4.3 Kotlin1.4.31 带有Elasticsearch 7.10.1 测试容器1.15.2 JUnit 5.7.1 Java 11 Maven> = 3.2.1(Kotlin是Maven依赖项) Docker> = 3.0(用于集成测试) 克隆存储库并构建项目 集成测试TweetControllerIT将在Maven阶段启动verify 。 $ git clone https://github.com/larmic/testcontainers-junit5 $ mvn clean verify # start lo
标题目录一、UnitTest原理二、UnitTest概念三、UniTtest断言四、最后 一、UnitTest原理 UnitTest是Python自带的测试框架,还有一个框架是:Pytest,这里简单介绍下UnitTest模块的简单应用。 UnitTest是Python的标准测试库,相比于其他测试框架是Python目前使用最广的测试框架。 二、UnitTest概念 1、test fixture:测试固件,简单来说就是做一些测试过程中需要准备的东西,比如创建临时的数据库,文件和目录等,其中 setUp() 和
前面讲到unittest里面setUp可以在每次执行用例前执行,这样有效的减少了代码量,但是有个弊端,比如打开浏览器操作,每次执行用例时候都会重新打开,这样就会浪费很多时间。 于是就想是不是可以只打开一次浏览器,执行完用例再关闭呢?这就需要用到装饰器(@classmethod)来解决了。 2、@classmethod 装饰器中的 setUpClass() 和 tearDownClass() 与 setUp() 和 tearDown() 的区别 setUp():每个测试 case 运行之前运行 tearDown():每个测试 case 运行完之后执行 setUpClass(
### 回答1: 很高兴听到您对Spring Boot 2的学习感兴趣。Spring Boot是一个基于Spring框架的快速开发应用程序的工具,它提供了一种简单的方式来创建和配置Spring应用程序。以下是一些学习Spring Boot 2的笔记: 1. Spring Boot 2的新特性:Spring Boot 2相对于Spring Boot 1.x版本来说,有许多新的特性和改进。例如,它支持Java 9和10,提供了更好的响应式编程支持,以及更好的安全性和监控功能。 2. Spring Boot 2的核心组件:Spring Boot 2的核心组件包括Spring Framework、Spring MVC、Spring Data和Spring Security等。这些组件提供了一系列的功能和工具,使得开发人员可以更加轻松地构建和管理应用程序。 3. Spring Boot 2的配置:Spring Boot 2的配置非常简单,它提供了一种基于注解的方式来配置应用程序。开发人员可以使用@Configuration和@Bean注解来定义配置类和Bean。 4. Spring Boot 2的启动器:Spring Boot 2提供了一系列的启动器,这些启动器可以帮助开发人员快速地集成各种常用的框架和库,例如Spring Data JPA、Spring Security、Thymeleaf等。 5. Spring Boot 2的测试:Spring Boot 2提供了一系列的测试工具,例如Spring Boot Test、Mockito、JUnit等。这些工具可以帮助开发人员编写高质量的单元测试集成测试。 希望这些笔记对您学习Spring Boot 2有所帮助。如果您有任何问题或疑问,请随时联系我。 ### 回答2: Spring Boot 是一个非常流行的开源框架,它的目的是使 Spring 应用程序的开发过程更加简单、快速和高效。Spring Boot 2 是 Spring Boot 框架的第二个版本,已经成为了当今业界最流行的 Java 开发框架之一。 Spring Boot 2 的新特性: 1. 支持 JDK 9。Spring Boot 2 已经支持 JDK 9 所带来的新特性和功能。 2. 基于 Reactive Streams 的编程模型。Spring Boot 2 增加了对 Reactive Streams 的支持,可以开发响应式应用程序,从而提高了系统的吞吐量和性能。 3. 异步服务器支持。Spring Boot 2 已经支持多种异步服务器,包括 Netty、Undertow 和 Tomcat。 4. 更全面的 Actuator 组件。Actuator 是 Spring Boot 的监控和管理组件,Spring Boot 2 在 Actuator 组件上增加了更多的指标、健康检查和应用程序信息。 5. 更好的自定义配置。Spring Boot 2 简化了自定义配置的流程,使得用户可以更快速地配置应用程序。 学习 Spring Boot 2 的步骤如下: 1. 掌握 Spring 基础知识。学习 Spring Boot 2 前需要掌握 Spring MVC、Spring Data 等相关的知识。 2. 下载安装 Spring BootSpring Boot 2 可以在官网上下载。 3. 学习 Spring Boot 核心组件。包括 Spring IoC、Spring AOP、Spring MVC 等核心组件。 4. 开发一个 Spring Boot 应用程序。可以从一个简单的 Hello World 开始,逐渐增加功能,学习和理解 Spring Boot 的各种特性和功能。 5. 掌握 Spring Boot 的自动配置。Spring Boot 的自动配置可以大大减少开发人员的工作量,学习和掌握自动配置非常重要。 总之,学习 Spring Boot 2 需要不断地实践和探索,只有通过实际的开发经验才能真正掌握和学会这个框架。 ### 回答3: Spring Boot是一款基于Spring框架的快速应用开发框架。在应用开发的过程中,Spring Boot可以自动配置一个相对完整的Spring应用程序,从而大大减少了开发者的工作量,提高了开发效率。显然,它的学习是很有必要的。 Spring Boot 2.x版本相比于1.x版本在很多方面都进行了升级和改进。在学习的过程中,需要关注的重点在以下几点: 1. 新建Spring Boot项目 Spring Boot提供了Spring Initializr来快速创建新的Spring Boot项目。在构建项目的过程中,我们可以自定义项目的基本信息、项目类型、依赖关系等,可以根据需求灵活选择。 2. Spring Boot自动配置 Spring Boot借助于自动配置功能,可以为开发者免去大量的配置工作。Spring Boot把一些常用的配置提取为Starter,开发者只需要引入这些Starter即可实现自动配置,大大降低了开发成本。 3. Spring Boot集成 Spring Boot集成了众多流行的框架,如MyBatis、Hibernate、JPA、Thymeleaf等,只需要简单的配置就可以实现对这些框架的集成,使得在开发中更加方便。 4. Spring Boot监控管理 Spring Boot通过Actuator提供了一系列配置和管理服务,可以实现对Spring Boot应用程序的监控和管理。开发者可以通过这些服务来监控应用程序的运行状态、访问量、资源使用情况等。 5. Spring Boot测试 Spring Boot天生适合进行单元测试集成测试,可以使用JUnit、Mockito、Spring Test等框架进行测试。同样可以利用Spring Boot提供的Test Starter进行自动配置,减少测试的开发成本。 以上就是Spring Boot 2的一些学习笔记,它的结构简洁,代码清晰,便于开发者使用。无疑,Spring Boot 2是一个非常适合作为开发者日常工作的框架。