0


单元测试使用JUnit 5

JUnit 介绍

  1. JUnit 是什么?
    JUnit 是一个 Java 编程语言的开源测试框架,它是xUnit架构的一部分,xUnit是为多种编程语言创建的单元测试库的通用名称。JUnit是由Erich Gamma和Kent Beck创建的,目前已经发展到JUnit 5。

它提供了一些功能,使编写测试变得容易,包括支持多个测试用例、断言和报告。JUnit也是多功能的,允许用各种语言编写测试。

JUnit 主要用于单元测试,但它也可用于其他测试,如功能和集成测试。功能测试是测试系统的功能。它们与单元测试不同,因为它们测试的是整个系统而不是单个单元。集成测试测试两个或多个系统的集成。它们与单元测试不同,因为它们测试的是系统的各个组成部分如何协同工作,而不是单独工作。

  1. 什么是单元测试框架?
    对于单元测试框架来讲,它主要完成以下几件事。

提供用例组织与执行: 测试用例只有几条时,可以不考虑用例组织,但是用例达到成百上千时,大量的测试用例堆砌在一起,就产生了扩展性与维护性等问题

提供丰富的断言方法: 不论是功能测试,还是单元测试,在用例执行完之后都需要将实际结果与预期结果相比较(断言),从而断定用例是否执行通过。单元测试框架一般提供丰富的断言方法。例如:判断相等/不等、包含/不包含、True/False的断言方法等

提供丰富的日志: 当测试用例执行失败时能抛出清晰的失败原因,当所有用例执行完成后能提供丰富的执行结果。例如,总执行时间、失败用例数、成功用例数等。

从这些特性来看单元测试框架的作用是:帮助我们更自动化完成测试,所以,它是自动化测试的基础。

  1. 为什么进行单元测试?
    在平时的开发当中,一个项目往往包含了大量的方法,可能有成千上万个。如何去保证这些方法产生的结果是我们想要的呢?当然了,最容易想到的一个方式,就是我们通过 System.out 来输出我们的结果,看看是不是满足我们的需求,但是项目中这些成千上万个方法,我们总不能在每一个方法中都去输出一遍嘛。这也太枯燥了。这时候用我们的单元测试框架JUnit就可以很好地解决这个问题。

JUnit 如何解决这个问题的呢?答案在于内部提供了一个断言机制,他能够将我们预期的结果和实际的结果进行比对,判断出是否满足我们的期望。

  1. JUnit 的主要用途
    JUnit主要用于单元测试,以下是JUnit的主要用途:

编写和运行测试: JUnit提供了注解和断言库,帮助你快速地编写测试代码,并且提供了测试运行器来运行和报告测试结果。
断言结果: JUnit提供了一套丰富的断言库来帮助你验证测试的结果。这些断言方法包括常用的 assertEquals、assertTrue、assertFalse、assertNull 等。
测试套件: 如果你有一组测试,并希望将它们一起运行,那么可以使用 JUnit 的 @TestSuite 注解。
测试异常: JUnit 可以帮助你测试方法是否会抛出预期的异常。
参数化测试: 如果你需要使用不同的参数多次运行同一个测试,那么可以使用 JUnit 的参数化测试。
模拟对象: 在很多情况下,你可能需要模拟依赖对象以便于测试。JUnit 可以与模拟框架(如Mockito)一起使用,帮助你创建模拟对象。
总的来说,JUnit是Java中非常重要的一个单元测试框架,它的使用可以使你的代码更加健壮,因为你可以快速定位并修复代码中的错误和bug。

如何安装 JUnit 测试框架

想要使用Junit5的框架,我们首先要从中央仓库中引入Maven依赖.代码如下所示:

  <dependency>
      <groupId>org.junit.jupiter</groupId>
      <artifactId>junit-jupiter-api</artifactId>
      <version>5.9.1</version>
    </dependency>
    <dependency>
      <groupId>org.junit.jupiter</groupId>
      <artifactId>junit-jupiter-params</artifactId>
      <version>5.9.1</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.junit.jupiter/junit-jupiter-params -->
    <dependency>
      <groupId>org.junit.jupiter</groupId>
      <artifactId>junit-jupiter-params</artifactId>
      <version>5.9.1</version>
    </dependency>
    <dependency>
      <groupId>org.junit.platform</groupId>
      <artifactId>junit-platform-suite</artifactId>
      <version>1.9.1</version>
      <scope>test</scope>
    </dependency>

    <!-- https://mvnrepository.com/artifact/org.junit.platform/junit-platform-suite -->
    <dependency>
      <groupId>org.junit.platform</groupId>
      <artifactId>junit-platform-suite</artifactId>
      <version>1.9.1</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.junit.jupiter/junit-jupiter-engine -->
    <dependency>
      <groupId>org.junit.jupiter</groupId>
      <artifactId>junit-jupiter-engine</artifactId>
      <version>5.9.1</version>
      <scope>test</scope>
    </dependency>

JUnit 编写单元测试

创建一个简单的Java类,这个类将包含一些基础的数学运算。这个类名叫做Calculator:

public class Calculator {
    public int add(int a,int b) {
        return a + b;
    }
    public int subtract(int a, int b) {
        return a - b;
    }
    public int multiply(int a,int b) {
        return a * b;
    }
    public double divide(int a, int b) {
        if (b == 0) {
            throw new IllegalArgumentException("Divider cannot be zero");
        }
        return (double) a / b;
    }
}

这个类包含四个方法,分别实现加法、减法、乘法和除法运算。注意,在进行除法运算时,我们需要检查除数是否为0,如果是0,我们抛出一个

IllegalArgumentException

异常。

接下来,我们将为这个类创建一个 JUnit 测试类,以测试它的功能。

测试代码

在IDEA中,通常会为要测试的类创建一个同名的测试类,只不过这个测试类的名字后面会附加Test。为Calculator类创建一个名为CalculatorTest的测试类。

这个测试类中,会为Calculator类中的每个方法都编写一个对应的测试方法。使用@Test注解来标识这些测试方法。

下面是CalculatorTest类的代码:

import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;

import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertThrows;

public class CalculatorTest {
    private Calculator calculator;

    @BeforeEach
    public void setUp() {
        calculator = new Calculator();
    }

    @Test
    public void testAdd() {
        assertEquals(5, calculator.add(2, 3));
    }

    @Test
    public void testSubtract() {
        assertEquals(-1, calculator.subtract(2, 3));
    }

    @Test
    public void testMultiply() {
        assertEquals(6, calculator.multiply(2, 3));
    }

    @Test
    public void testDivide() {
        assertEquals(2.0, calculator.divide(4, 2));
    }

    @Test
    public void testDivideByZero() {
        assertThrows(IllegalArgumentException.class, () -> calculator.divide(4, 0));
    }
}

在这个类中,首先定义了一个私有的 Calculator 实例,然后在 @BeforeEach 注解的 setUp() 方法中为它赋值。@BeforeEach 注解的方法会在每个测试方法运行前被调用,所以可以在这里初始化测试环境。

然后为Calculator类中的每个方法都编写了一个测试方法。在这些测试方法中,使用了assertEquals()方法来检查方法的返回值是否和我们预期的一样。

对于divide()方法,还写了一个额外的测试方法来测试当除数为0时,方法是否会抛出IllegalArgumentException异常。使用assertThrows()方法来检查这个异常是否被正确地抛出。

接下来,可以右击IDEA中的测试类或者测试方法,然后选择 “Run ‘test…’” 来运行测试。,可以看到测试全部通过

以上就是单元测试,需要遵循以下规则:

每一个测试方法上使用 @Test 进行修饰
每一个测试方法必须使用 public void 进行修饰(即 public 且不返回任何值)
每一个测试方法不能携带参数
测试代码和源代码在两个不同的项目路径下
测试类的包应该和被测试类保持一致
测试单元中的每个方法必须可以独立测试
以上的 6 条规则,是在使用单元测试的必须项,当然JUnit也建议在每一个测试方法名加上 test 前缀,表明这是一个测试方法。

assertEquals 是一个断言的规则,里面有两个参数,第一个参数表明预期的值,第二个参数表示实际运行的值。不过 JUnit5 对这些做出了一些改变,会在后续专门介绍。

运行测试类,就会运行每一个测试方法,也可以运行某一个,只需要在相应的测试方法上面右键运行即可。如果运行成功编辑器的控制台不会出现错误信息,如果有就会出现 failure 等信息。

JUnit 注解


本文转载自: https://blog.csdn.net/sadfasdfsafadsa/article/details/143833452
版权归原作者 薛定谔的猫1982 所有, 如有侵权,请联系我们删除。

“单元测试使用JUnit 5”的评论:

还没有评论