单元测试的好处

单元测试的好处

  • 为重构项目保驾护航
  • 提高代码质量:做单元测试需要隔离外部依赖,促使工程做组件拆分,减少代码耦合度。
  • 减少bug:确保各个单元逻辑正确
  • 快速定位bug

测试驱动开发(TDD):

  • 最早接触TDD理念是在伯克利的CS61B中,这门课有一个章节专门教你写单元测试,并鼓励通过TDD来推进Project和Lab的编写,整门课的Lab更是建立在评测机的基础上,令我受益匪浅。
  • TDD的原理:开发业务代码前先编写测试用例代码,然后针对测试用例编写功能代码,使其通过。
  • TDD好处:
    • 协助整理需求,理清思路。
    • 帮助设计合理的接口。
    • 减少BUG
    • 提高开发效率(熟练使用TDD的基础上)
  • TDD缺点:
    • 门槛高
    • 时间和精力投入大
    • 着眼局部,可能忽略整体设计

JUnit单元测试

依赖:spring-boot-test

常用注解

  • @BeforeAll:最先执行,必须为public static方法。
  • @AfterAll:同理。
  • @BeforeEach:每个单元测试之前执行。
  • @AfterEach:同理。
  • @Test:标识一个单元测试方法。
  • @Disabled:禁用一个单元测试。
  • @DisplayName:单元测试名字。
  • @Timeout(value=1,unit=TimeUnit.SECONDS):限定执行时间,默认单位是s
  • @RepeatedTest(value=3):重复执行多次,支持修改名字,点入源码查看格式后在name属性加入相应的即可。

断言:Assertions类常用方法

  • assertEquals(actual,expect):是否相同
  • assertSame(actual,expect):地址是否相同
  • assertTrue(表达式):是否为真
  • assertNull(obj):是否为空
  • 同理,还有Not系列,道理是一样的。

基于SpringBoot环境的单元测试

  • 类注解:@SpringBootTest
  • 命名规范:类名Test

带参单元测试

  • 第一步:将 @Test改成 @ParameterizedTest
  • 第二步:使用 @ValuesSource提供参数,支持以数组的形式,方便我们进行多个值的测试。
    • 可以用strings传入字符串数组
    • 可以用classes传入类
  • 其它注解:
    • @NullSource:提供NULL的入参
    • @EnumSource:提供枚举入参
    • @MethodSource:方法传参,要求方法返回值必须是流 Stream<>,并且设置为static
    • @CsvFileSource:csv文件作为入参,将每行作为一次参数输入,因此可以用多个参数接收。

单元测试的Maven插件

父pom文件引入:

<!-- 单元测试使用 -->  
<plugin>  
    <groupId>org.apache.maven.plugins</groupId>  
    <artifactId>maven-surefire-plugin</artifactId>  
    <version>2.22.2</version>  
    <configuration>        <argLine>-Dfile.encoding=UTF-8</argLine>  
        <!-- 根据打包环境执行对应的@Tag测试方法 -->  
        <groups>${profiles.active}</groups>  
        <!-- 排除标签 -->  
        <excludedGroups>exclude</excludedGroups>  
    </configuration>
</plugin>

标签单元测试

  • 第一步,通过 @Tag注解标记单元测试,如dev、prod、exclude等,exclude表示不执行。
  • 第二步,使用Maven,改变profiles环境,找到Lifecycle的test,就会自动执行相关测试方法。

注意:带有prod标记的测试方法不通过是无法打包的。