likes
comments
collection
share

SpringBoot2.x系列教程46--Java中的junit单元测试玩起来

作者站长头像
站长
· 阅读数 12

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第20天,点击查看活动详情

前言

在前面的文章中,壹哥 给大家讲解了各种代码效果的实现,但我们程序员平时除了需要编写代码之外,还要进行测试、编写需求文档等工作。所以今天壹哥再给大家简单介绍一下关于测试的一些内容,以及如何在SpringBoot中整合测试,希望大家可以喜欢哦。

一. 测试简介

对我们程序员来说,我们毕竟不是专业的测试人员,所以这里壹哥只是简单给大家介绍我们平时经常接触到的一些测试内容,特别专业的测试这里就不再介绍了。

1. 单元测试的概念

在计算机编程中,单元测试是一种软件测试方法,用来测试源代码的单个单元、一个或多个计算机程序模块的集合以及相关的控制数据、使用过程和操作过程,以确定它们是否适合使用。

通俗的说,我们在做单元测试时,只是测试了一个代码单元,也就是每次只测试一个方法,不包括与测试组件相交互的其他所有代码组件。

2. 集成测试的概念

集成测试(有时也称集成和测试,缩写为 I&T)是软件测试的一个阶段,在这个阶段中,各个软件模块被组合在一起来进行测试。通俗的说,我们在集成测试中是把各组件进行集成在一起测试。

二. Java中的测试

1. 概述

在一般的Java开发中,我们主要是使用JUnit进行测试功能的实现。而在Spring Boot中,则提供了很多有用的工具类和注解,用于帮助我们测试自己的应用,主要分两个模块:

  • spring-boot-test:包含核心组件;
  • spring-boot-test-autoconfigure:为测试提供自动配置。

但是我们在利用SpringBoot进行开发的时候,一般只需要引用spring-boot-starter-test-starter依赖包就可以了,它涵盖了以上两大模块,既为我们提供了Spring Boot测试模块的依赖,也提供了JUnit,AssertJ,Hamcrest等很多有用的依赖。

2. SpringBoot提供的测试库

  • JUnit - 事实上的(de-facto)标准,用于Java应用的单元测试;
  • Spring Test & Spring Boot Test  - 对Spring应用的集成测试支持;
  • AssertJ - 一个流式断言库;
  • Hamcrest - 一个匹配对象的库(也称为约束或前置条件);
  • Mockito - 一个Java模拟框架;
  • JSONassert - 一个针对JSON的断言库;
  • JsonPath - 用于JSON的XPath。

SpringBoot2.x系列教程46--Java中的junit单元测试玩起来

三. JUnit回顾

1. JUnit简介

JUnit 是一个回归测试框架,经常被Java开发者用于实施对应用程序的单元测试,加快程序编制速度,同时提高编码的质量。

而回归测试是指修改了旧代码后,重新进行测试以确认本次修改没有引入新的错误或导致其他代码产生错误,也就是要重复以前的全部或部分相同测试。

2. JUnit特性

  • 测试工具
  • 测试套件
  • 测试运行器
  • 测试分类

3. JUnit测试使用

3.1 添加依赖

<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <scope>test</scope>
    <version>4.12</version>
</dependency>

3.2 创建测试类和测试方法

  • 测试类的命名规则一般是 xxxTest.java;
  • 测试类中的测试方法一般都有前缀,比如在测试方法上带有test前缀;
  • 在测试方法上添加@Test注解。

4. JUnit中常用注解

  • @BeforeClass:针对所有测试,只执行一次,且修饰符必须为static void。
  • @Before:初始化方法,在执行当前测试类的每个测试方法前执行。
  • @Test:测试方法,在这里可以测试期望的异常和超时时间。
  • @After:释放资源,在执行当前测试类的每个测试方法后执行。
  • @AfterClass:针对所有测试,只执行一次,且必须为static void。
  • @Ignore:忽略的测试方法(只在测试类的时候生效,单独执行该测试方法无效)。
  • @RunWith: 更改测试运行器,缺省值org.junit.runner.Runner

5. 单元测试类执行顺序

@BeforeClass –> @Before –> @Test –> @After –> @AfterClass

6. 测试方法的调用顺序

@Before –> @Test –> @After

7. JUnit中的异常测试

我们可以利用@Test注解和expected 参数,来测试我们的代码中是否会抛出某个可能的异常。

@Test(expected = NullPointerException.class)
public void testNullException() {
    throw new NullPointerException();
}

8. JUnit中的超时测试

我们可以利用@Test注解和timeout参数,来测试我们的代码是否比指定的毫秒数花费了更多的时间。

@Test(timeout = 1000)
public void testTimeout() throws InterruptedException {       
    TimeUnit.SECONDS.sleep(2);
    System.out.println("Success");
}

9. JUnit中的套件测试

我们可以利用@Suite.SuiteClasses注解,将多个测试类整合在一起,形成一个测试套件进行测试。

public class TaskOneTest {
    @Test
    public void test() {
        System.out.println("任务一...");
    }
}

public class TaskTwoTest {
    @Test
    public void test() {
        System.out.println("任务二...");
    }
}

public class TaskThreeTest {
    @Test
    public void test() {
        System.out.println("任务三...");
    }
}

// 1. 更改测试运行方式为 Suite
@RunWith(Suite.class) 
// 2. 将测试类传入进来
@Suite.SuiteClasses({TaskOneTest.class, TaskTwoTest.class, TaskThreeTest.class})
public class SuitTest {
    /**
     * 测试套件的入口类只是组织测试类一起进行测试,无任何特别的测试方法。
     */
}

10. JUnit中的参数化测试

从Junit 4开始,引入了一个新的参数化测试功能。参数化测试允许开发人员使用不同的值反复运行同一个测试方法。

我们可以遵循以下 5个步骤来创建参数化测试方法。

  1. 用 @RunWith(Parameterized.class)来注解 test 类;
  2. 创建一个由 @Parameters 注解的公共静态方法,返回 一个对象的集合(数组) 来作为测试参数的数据集合;
  3. 创建一个公共的构造函数,接收和测试数据相等的内容;
  4. 为每一个测试数据创建一个实例变量;
  5. 用实例变量作为测试数据的来源来创建你的测试用例。
//1.更改默认的测试运行器为RunWith(Parameterized.class)
@RunWith(Parameterized.class)
public class ParameterTest {

    // 2.声明存放预期值和测试数据的变量
    private String firstName;
    private String lastName;

    //3.声明一个返回值为Collection的公共静态方法,并使用@Parameters注解进行修饰
@Parameterized.Parameters
    public static List<Object[]> param() {
        //这里给出了两个测试用例
        return Arrays.asList(new Object[][]{{"Mike", "Black"}, {"Cilcln", "Smith"}});
    }

    //4.为测试类声明一个带有参数的公共构造函数,并在其中为之声明变量赋值
    public ParameterTest(String firstName, String lastName) {
        this.firstName = firstName;
        this.lastName = lastName;
    }
    
    // 5. 进行测试,发现它会将所有的测试用例测试一遍
    @Test
    public void test() {
        String name = firstName + " " + lastName;
        assertThat("Mike Black", is(name));
    }
}

11. JUnit中使用assertThat断言

JUnit 4.4 结合 Hamcrest 提供了一个全新的断言语法——assertThat。

#语法
assertThat( [actual], [matcher expected] );

assertThat 使用了 Hamcrest 的 Matcher 匹配符,用户可以使用匹配符规定的匹配规则,来精确的指定一些想要设定满足的条件,具有很强的易读性,而且使用起来更加灵活。

结语

在今天的这篇文章中,壹哥主要是给大家介绍了测试的一些基本知识。在下一篇文章中,壹哥会在SpringBoot中整合测试,编写一些测试脚本,实现单元测试。