Table of Contents

一、单元测试介绍

1. 单元测试定义

来自维基百科

计算机编程中,单元测试(英语:Unit Testing)又称为模块测试,是针对程序模块软件设计的最小单位)来进行正确性检验的测试工作。程序单元是应用的最小可测试部件。在过程化编程中,一个单元就是单个程序、函数、过程等;对于面向对象编程,最小单元就是方法,包括基类(超类)、抽象类、或者派生类(子类)中的方法。

通常来说,程序员每修改一次程序就会进行最少一次单元测试,在编写程序的过程中前后很可能要进行多次单元测试,以证实程序达到软件规格书要求的工作目标,没有程序错误;虽然单元测试不是必须的,但也不坏,这牵涉到项目管理的政策决定。

2. 单元测试的收益

  • 适应变更,一旦变更导致错误发生,借助于单元测试可以快速定位并修复错误。
  • 简化集成,单元测试消除程序单元的不可靠,采用自底向上的测试路径。通过先测试程序部件再测试部件组装,使集成测试变得更加简单。
  • 文档记录,单元测试提供了系统的一种文档记录。
  • 表达设计,在测试驱动开发的软件实践中,单元测试可以取代正式的设计。每一个单元测试案例均可以视为一项类、方法和待观察行为等设计元素。(驱动设计时,单元测试先于程序设计)

3. 单元测试的编写时机

  • 一是在具体实现代码之前,这是测试驱动开发(TDD)所提倡的;
  • 二是与具体实现代码同步进行。先写少量功能代码,紧接着写单元测试(重复这两个过程,直到完成功能代码开发)。
  • 三是编写完功能代码再写单元测试。(可能会导致单元测试的“粒度”都比较粗)

二、JUnit4 详解

1. 什么是JUnit

JUnit 是 java 编程语言的单元测试框架,用于编写和运行可重复的自动化测试。相比于使用原始方法:print 打印观察,更加方便和高效。

2. JUnit4 常用注解与断言

注解

image-20211020110744636

断言

image-20211020110901757

3. JUnit4 使用

  1. Maven 构建项目,并引入 Maven 包

    1
    2
    3
    4
    5
    6
    
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.13.2</version>
        <scope>test</scope>
    </dependency>
    
  2. 测试 Hello World

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    
    package com.qixianxian.junit4;
    
    import org.junit.Test;
    
    import static org.junit.Assert.assertEquals;
    
    public class HelloWorldTest {
    
        @Test
        public void firstTest() {
            assertEquals(2, 1 + 1);
        }
    }
    

    image-20211020113752264

  3. 测试生命周期

    • @BeforeClass:通常用来为后面测试方法的准备工作,如加载配置、进行数据库的连接等。父类的@BeforeClass注解方法会在子类的@BeforeClass注解方法执行前执行。需要使用static 来修饰方法。
    • @AfterClass:通常用来对资源进行释放,比如数据库连接的关闭等。
    • @After、@Before 参考上文
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    
    package com.qixianxian.junit4;
    
    import org.junit.*;
    
    public class StandardTest {
    
        @BeforeClass
        public static void beforeClass() {
            System.out.println("in before class");
        }
    
        @AfterClass
        public static void afterClass() {
            System.out.println("in after class");
        }
    
        @Before
        public void before() {
            System.out.println("in before");
        }
    
        @After
        public void after() {
            System.out.println("in after");
        }
    
        @Test
        public void testCase1() {
            System.out.println("in test case 1");
        }
    
        @Test
        public void testCase2() {
            System.out.println("in test case 2");
        }
    }
    

    image-20211020114513417

  4. 断言测试

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    
    package com.qixianxian.junit4;
    
    import org.junit.*;
    import org.junit.Test;
    
    public class AssertionTest {
    
        @Test
        public void test() {
            String obj1 = "junit";
            String obj2 = "junit";
            String obj3 = "test";
            String obj4 = "test";
            String obj5 = null;
    
            int var1 = 1;
            int var2 = 2;
    
            int[] array1 = {1, 2, 3};
            int[] array2 = {1, 2, 3};
    
            Assert.assertEquals(obj1, obj2);
    
            Assert.assertSame(obj3, obj4);
            Assert.assertNotSame(obj2, obj4);
    
            Assert.assertNotNull(obj1);
            Assert.assertNull(obj5);
    
            Assert.assertTrue(var1 < var2);
            Assert.assertFalse(var1 > var2);
    
            Assert.assertArrayEquals(array1, array2);
    
        }
    }
    

    image-20211020114814389

三、参考内容

全栈知识体系-单元测试