你真的会写 单元测试吗?TDD初体验

发表于:2019-11-18来源:cnblogs作者:李佳霖i点击数: 标签:
昨天读到了一篇文章,讲的是TDD,即Test-Driven Development,测试驱动开发。大体意思是,它要求在编写某个功能的代码之前先编写测试代码,然后只编写使测试通过的功能代码,通过测试
前言:
  昨天读到了一篇文章,讲的是TDD,即Test-Driven Development,测试驱动开发。大体意思是,它要求在编写某个功能的代码之前先编写测试代码,然后只编写使测试通过的功能代码,通过测试来推动整个开发的进行。这有助于编写简洁可用和高质量的代码,并加速开发过程。
  初读之时,瞬间感受到了震撼,感觉和自己之前的开发流程全都不一样,之前是由始至终,而这种思想确实以终为始。后来一查这种思想早在前几年甚至前几十年就被提出了,进而被广泛运用到了敏捷开发中。看来是自己孤落寡闻了,于是我准备将这种思想用到今后的开发中,要做的第一件事,就是温习如何写用例
为什么是温习?
  早在实习的时候,我们研发组就有写用例的习惯,但是随着开发逐渐熟悉,这种习惯不知不觉就被丢弃了,有页面的点点点,没页面的看逻辑。相信有很多人也像我一样,不知不觉就把这项技能丢弃了,接下来就让我们一起,去重新捡起这项技能。
工具选择
Junit
对于一个Java开发工程师来说,一提到写单测,我们最先想到的,一定是Junit。下面是maven坐标
<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.11</version>
    <scope>test</scope>
</dependency>



用Junit我们可以快速的,简洁的用注解进行单元测试
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath:conf/core/*.xml")
public class ObjTest {

  @Test
  public void testFunc(){
     //todo test         
  }
}



这里要注意的是@ContextConfiguration注解中的路径是Spring配置文件的位置。测试的方法必须是public的,且没有返回值。
mockito
mockito是一个用于模拟对象的工具,我认为他也是测试工作中必不可少的一部分,详细的介绍我推荐可以看一下:
人生苦短,我用Mockito https://zhuanlan.zhihu.com/p/59275373
比较不错的入门案例,它的maven坐标地址为:
<dependency>
    <groupId>org.mockito</groupId>
    <artifactId>mockito-all</artifactId>
    <version>1.9.5</version>
    <scope>test</scope>
</dependency>



Mock这种测试方法, 对比传统的Junit测试,有如下好处:
不用每次测试的是时候,都初始化Spring容器,采用Mock的方式模拟对象,效率高
对象间的依赖关系,可以用Mock去表达,同时,我们不关心的部分,我们都可以用Mock的方式代替(比如对象A引用对象B的某某方法,但是我们不关系对象B方法实现,只想借助方法,这个时候就可以Mock)
可以应对复杂的测试环境,比如方法调用顺序、方法调用次数等等。
以下是Mock的一个小案例:
@RunWith(MockitoJUnitRunner.class)
public class MockitoTest {
    /**
     * mock对象
     */
    @Mock
    List<String> mockedList;

    @Before
    public void setUp() {
        MockitoAnnotations.initMocks(this);
    }

    @Test
    public void testMock() {
        // mock对象行为
        Mockito.when(mockedList.get(0)).thenReturn("one");
        Assert.assertEquals("one", mockedList.get(0));
        // 仅仅是mock了对象的行为,实际上列表还是空的
        Assert.assertEquals(0, mockedList.size());

        //验证mock对象的get方法被调用过,且调用时的参数是0
        Mockito.verify(mockedList).get(0);
    }
}

这里在使用@Mock的时候,必须事先调用MockitoAnnotations.initMocks(this),且使用@RunWith(MockitoJUnitRunner.class)
Jacoco
JaCoCo是一个开源的覆盖率工具,支持多种覆盖率的统计,其中包括:
行覆盖率:度量被测程序的每行代码是否被执行,判断标准行中是否至少有一个指令被执行。

原文转自:https://www.cnblogs.com/nedulee/p/11863605.html