JUnit测试

0 阅读4分钟

测试

  • 测试:是一种用来促进鉴定软件的正确性、完整性、安全性和质量的过程。
  • 阶段划分:单元测试(白盒)、集成测试(灰盒)、系统测试(黑盒)、验收测试(黑盒)。

image.png 单元测试:就是针对最小的功能单元(方法),编写测试代码对其正确性进行测试。

JUnit:最流行的 Java 测试框架之一,提供了一些功能,方便程序进行单元测试(第三方公司提供)。

mian方法测试和JUnit单元测试的对比:

image.png image.png

下面演示一下JUnit测试,引入一个简单的测试类UserService.java:

package org.example;

import java.time.LocalDate;
import java.time.Period;
import java.time.format.DateTimeFormatter;

public class UserService {

    /**
     * 给定一个身份证号,计算出该用户的年龄
     * @param idCard 身份证号
     */
    public Integer getAge(String idCard){
        if (idCard == null || idCard.length() != 18) {
            throw new IllegalArgumentException("无效的身份证号码");
        }
        String birthday = idCard.substring(6, 14);
        LocalDate parse = LocalDate.parse(birthday, DateTimeFormatter.ofPattern("yyyyMMdd"));
        return Period.between(parse, LocalDate.now()).getYears();
    }

    /**
     * 给定一个身份证号,计算出该用户的性别
     * @param idCard 身份证号
     */
    public String getGender(String idCard){
        if (idCard == null || idCard.length() != 18) {
            throw new IllegalArgumentException("无效的身份证号码");
        }
        return Integer.parseInt(idCard.substring(16,17)) % 2 == 1 ? "男" : "女";
    }

}

准备工作:在pom.xml中引入JUnit依赖:

<dependency>
    <groupId>org.junit.jupiter</groupId>
    <artifactId>junit-jupiter</artifactId>
    <version>5.9.1</version>
</dependency>

然后在test目录下编写一个测试类UserServiceTest.java:

package com.itheima;

import org.example.UserService;
import org.junit.jupiter.api.Test;

/**
 * 测试类 UserserviceTest
 */
public class UserServiceTest {

    @Test      //@Test标记表示这是一个单元测试方法,运行测试时,JUnit会自动执行这个方法。
    public void testGetAge(){
        UserService userService=new UserService();
        Integer age=userService.getAge("573910200009101038");
        System.out.println(age);
    }

}

运行结果:

image.png

断言:

当然,JUnit 提供了一些辅助方法,用来帮我们确定被测试的方法是否按照预期的效果正常工作,这种方式称为断言。

断言方法描述
Assertions.assertEquals(Object exp, Object act, String msg)检查两个值是否相等,不相等就报错。
Assertions.assertNotEquals(Object unexp, Object act, String msg)检查两个值是否不相等,相等就报错。
Assertions.assertNull(Object act, String msg)检查对象是否为 null,不为 null,就报错。
Assertions.assertNotNull(Object act, String msg)检查对象是否不为 null,为 null,就报错。
Assertions.assertTrue(boolean condition, String msg)检查条件是否为 true,不为 true,就报错。
Assertions.assertFalse(boolean condition, String msg)检查条件是否为 false,不为 false,就报错。
Assertions.assertThrows(Class expType, Executable exec, String msg)检查程序运行抛出的异常,是否符合预期。

注意:上述方法形参中的最后一个参数msg,表示错误提示信息,可以不指定(有对应的重载方法)。

Assertions.assertEquals()断言测试:

@Test
public void testGenderWithAssert(){
    UserService userService= new UserService();
    String gender = userService.getGender("573910200009101038");
    Assertions.assertEquals("男",gender); //Assertions.assertEquals(期望值,实际值,错误提示信息)
}

运行结果:

image.png

Junit常见注解:

在 JUnit 中还提供了一些注解,还增强其功能,常见的注解有以下几个:

注解说明备注
@Test测试类中的方法用它修饰才能成为测试方法,才能启动执行单元测试
@ParameterizedTest参数化测试的注解(可以让单个测试运行多次,每次运行时仅参数不同)用了该注解,就不需要 @Test 注解了
@ValueSource参数化测试的参数来源,赋予测试方法参数与参数化测试注解配合使用
@DisplayName指定测试类、测试方法显示的名称(默认为类名、方法名)
@BeforeEach用来修饰一个实例方法,该方法会在每一个测试方法执行之前执行一次。初始化资源(准备工作)
@AfterEach用来修饰一个实例方法,该方法会在每一个测试方法执行之后执行一次。释放资源(清理工作)
@BeforeAll用来修饰一个静态方法,该方法会在所有测试方法之前只执行一次。初始化资源(准备工作)
@AfterAll用来修饰一个静态方法,该方法会在所有测试方法之后只执行一次。释放资源(清理工作)

代码演示一下:

@BeforeAll
public static void beforeAll() {
    System.out.println("before All");
}

@AfterAll
public static void AfterAll() {
    System.out.println("after All");
}

@BeforeEach
public void beforeEach() {
    System.out.println("before Each");
}

@AfterEach
public void afterEach(){
    System.out.println("after Each");
}

@Test
public void testGetAge() {
    UserService userService = new UserService();
    Integer age = userService.getAge("573910200009101038");
    System.out.println(age);
}

@Test
public void testGenderWithAssert() {
    UserService userService = new UserService();
    String gender = userService.getGender("573910200009101038");
    Assertions.assertEquals("男", gender);
}

运行结果: image.png

@ParameterizedTest参数化测试:

@ParameterizedTest必须要和@ValueSource一起使用,如下:@ValueSource内的数据传参到下面方法体中的idCard中,表示有三个测试。

@DisplayName("测试用户性别")             //显化测试
@ParameterizedTest
@ValueSource(strings= {"573910200009101038","194725490274628493","375920574625117476"})
public void testGetGender2(String idCard){
    UserService userService = new UserService();
    String gender = userService.getGender(idCard);
    Assertions.assertEquals("男", gender);
}

运行结果:

image.png