SpringBootspringboot 与 单元测试经验

Posted 技术能量站

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SpringBootspringboot 与 单元测试经验相关的知识,希望对你有一定的参考价值。

1. 什么是单元测试

单元测试(unit testing):是指对软件中的最小可测试单元进行检查和验证。

这个定义有点抽象,这里举几个单元测试的特性,大家感受一下:一般是一个函数配几个单元测试、单元测试不应该依赖外部系统、单元测试运行速度很快、单元测试不应该造成测试环境的脏数据、单元测试可以重复运行。

  • TDD是测试驱动开发(Test-Driven Development)

1.1 特点

  • 可重复执行
  • 执行速度快
  • 独立无依赖
  • 结果不改变

疑惑,到底需不需要写单元测试

  • 只要程序能运行就可以了,写单元测试浪费时间
  • 代码很简单不需要单元测试
  • 我保证不会有什么问题的
  • 测试人员测试一下就可以了
  • 这次没有时间写了,下次补上吧

1.2 测试分类

单元测试->集成测试->端到端测试

各测试占比

1.3 方法测试—断言

  • 使用give when then方式命名你的测试方法名称。
  • 一个案例只写一个断言。
  • 要写注释,建议分为如下4步骤。

    1. 测试场景
    2. 准备数据
    3. 测试执行
    4. 断言

断言

常用的断言方法如下:
assertEquals(a, b)    测试a是否等于b(a和b是原始类型数值(primitive value)或者必须为实现比较而具有equal方法)

assertFalse(a)        测试a是否为false(假),a是一个Boolean数值。

assertTrue(a)         测试a是否为true(真),a是一个Boolean数值

assertNotNull(a)      测试a是否非空,a是一个对象或者null。

assertNull(a)         测试a是否为null,a是一个对象或者null。

assertNotSame(a, b)   测试a和b是否没有都引用同一个对象。

assertSame(a, b)      测试a和b是否都引用同一个对象。

fail(string)          Fail让测试失败,并给出指定信息。

assertThat(expected, Matcher)  通过Matcher断言

Hamcrest :greaterThan,greaterThanOrEqualTo,lessThan,anything,anyOf,containsString

1.4 测试热门技术—mock

mock就是在测试过程中,对于某些不容易构造或者不容易获取的对象,用一个虚拟的对象来创建以便测试的测试方法,这个虚拟的对象就是mock对象。mock对象就是真实对象在调试期间的代替品。

  • Java常用Mock、EasyMock、JMock、PowerMock、Mockit等

(1)Mock工具的原理

 mock工具工作的原理大都如下:

  1. record阶段:录制期望。也可以理解为数据准备阶段。创建依赖的class 或interface或method ,模拟返回的数据,及调用的次数等。
  2. replay阶段:通过调用被测代码,执行测试。期间会invoke 到 第一阶段record的mock对象或方法。
  3. verify阶段:验证。可以验证调用返回是否正确。及mock的方法调用次数,顺序等。

(2)Mockito使用介绍

通过代码创建
       public class UserServiceTest   
           private UserService userService;  
           private UserDao mockUserDao;  
           @Before  
           public void setUp() 
               mockUserDao = mock(UserDao.class);  
               userService = new UserServiceImpl();  
               userService.setUserDao(mockUserDao);  
           
通过注解
        public class UserServiceTest   
        
           @InjectMocks
           private UserServiceImpl userService;  
         
           @Mock  
           private UserDao mockUserDao;  
         
           @Before  
            public void setUp()   
                MockitoAnnotations.initMocks(this);  
            

Mockito常用方法

verify
    verify(mock, never()).add("twice");        验证add方法没有被调用
    verify(mock, times(2)).add("twice");       验证add方法被调用了2次
    verify(mock, atLeast(n)).someMethod();     方法至少被调用n次
    verify(mock, atMost(n)).someMethod();      方法最多被调用n次
when
    when(mock.someMethod()).thenReturn(value1).thenReturn(value2);
    when(mock.get(0)).thenReturn("first"); 
    when(mock.get(1)).thenThrow(new RuntimeException());
    when(mock.get(anyInt())).thenReturn("element"); 
spy
    List spy = spy(new LinkedList());
    when(spy.get(0)).thenReturn(“foo");
    doReturn("foo").when(spy).get(0);

2. Spring项目中的单元测试实践

 

3. 为什么要做单元测试

3.1 为什么要写单元测试

  • 使我们更了解需求
  • 快速验证
  • 使重构更容易
  • 更早了解程序问题
  • 目标明确,使我们更有信心

3.2 优点

单元测试使得我们可以放心修改、重构业务代码,而不用担心修改某处代码后带来的副作用。

单元测试可以帮助我们反思模块划分的合理性,如果一个单元测试写得逻辑非常复杂、或者说一个函数复杂到无法写单测,那就说明模块的抽象有问题。

单元测试使得系统具备更好的可维护性、具备更好的可读性;对于团队的新人来说,阅读系统代码可以从单元测试入手,一点点开始后熟悉系统的逻辑

 

4. 单元测试总结

4.1 单元测试的三个步骤

  • 准备数据、行为
  • 测试目标模块
  • 验证测试结果

总之

  1. 在Java Web项目中,controller层一般不写业务逻辑,也就没有必要写单元测试,但是如果要写,也有办法,可以参考文章:在Spring Boot项目中使用Spock框架
  2. 单元测试代码也是线上代码,要和业务代码一样认真对待,也需要注意代码和测试数据的复用。

相关文章

  1. SpringBoot 单元测试详解(Mockito、MockBean)
  2. Java后端单元测试经验
  3. Java单元测试入门
  4. Mockito
  5. Junit 5

以上是关于SpringBootspringboot 与 单元测试经验的主要内容,如果未能解决你的问题,请参考以下文章

SpringBootspringboot中的单元测试

SpringBootspringboot中的单元测试

SpringBootSpringBoot 与JPA整合(十四)

SpringBootSpringBoot 与 Swagger整合(三十)

SpringBootspringboot 与 Email 邮箱

SpringBootSpringBoot Web开发