SpringBoot中的单元测试(一)

如何开始单元测试

Posted by Autuan.Yu on June 1, 2023

测试是来表明bug的存在而不是不存在。

前方

很多小伙伴们一提起单元测试,就会说啊这个好这个好,然后又紧接着一串自动化覆盖率 等等一串名词出来……

可是到实际使用的时候,却很少使用,当然原因多种多样,比如说:

  • 代码测试用例各种细节太麻烦了
  • 没有时间、项目太多
  • 不知道怎么写
  • 公司有专门的测试
  • 在SpringMVC/SpringBoot 下运行单元测试还要启动容器,不如手动点点点,还能多测点其他功能

总之,原因是各种各样的,博主也都能理解,事实上对于很多公司来说,单元测试确实就是一个不重要的事情。

可能公司已经招了专业测试;也可能自己身兼多职,忙不过来,等等等等……

不过,关于怎么做单元测试,各位小伙伴还是要了解了解的~

准备

本文以一个 SpringBoot 项目为例,版本号为 3.0.1 。 Maven 项目。

假设你已经有了一个 SpringBoot 项目(如果没有的话可以创建一个,本文跳过创建项目的步骤)。

想要做单元测试的话,需要先检查依赖,没有的话则加入,依赖如下:

<!-- JUnit -->
<dependency>  
    <groupId>org.springframework.boot</groupId>  
    <artifactId>spring-boot-starter-test</artifactId>  
    <scope>test</scope>  
</dependency>
<!-- PowerMock -->
<!-- https://mvnrepository.com/artifact/org.powermock/powermock-api-mockito2 -->
<dependency>
    <groupId>org.powermock</groupId>
    <artifactId>powermock-api-mockito2</artifactId>
    <version>2.0.9</version>
    <scope>test</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/org.powermock/powermock-module-junit4 -->
<dependency>
    <groupId>org.powermock</groupId>
    <artifactId>powermock-module-junit4</artifactId>
    <version>2.0.9</version>
    <scope>test</scope>
</dependency>

PS
版本号可以以最新的为准

开始

新建了一个 DemoService, 如下:

public interface DemoService {  
    String queryStr();  
  
    Article queryArticle();  
}

现在我要对这个DemoService中的queryStr 进行测试,先创建测试类:

@SpringBootTest  
@ExtendWith(SpringExtension.class)  
@Slf4j  
class DemoServiceTest {  
    @Autowired  
    private DemoService demoService;  
  
    @Test  
    void  
    queryStr() {  
        String str = demoService.queryStr();  
        log.info("DemoServiceTest -> queryStr -> str -> {}",str);  
        Assert.notNull(str);  
    }  
}

一个基本、简单的单元测试就写好了

其中:

  • @SpringBootTest 注解声明此类为一个SpringBoot单元测试类
  • @ExtendWith 则是因为我们需要测试Spring框架功能,如果是Junit 4 , 则使用 @RunWith 注解
  • @Slf4j 日志注解
  • @Test 标明方法函数为测试方法函数
  • Assert#notNull 断言,没有断言的单元测试没有意义

在 Idea 中, queryStr 方法 左侧会有小图标,点击执行便可: 执行选项

一般来说,推荐使用 Run 'queryStr()' with Coverage ,会进行覆盖率测试

结果

使用 with Coverage ,就会弹出覆盖率的模态框,内容如下:
coverage

如图所示,默认展示了 Class / Method / Line 的覆盖率

至此,一个简单的单元测试就写好了