JUnit 介绍
- JUnit 是什么?
JUnit 是一个 Java 编程语言的开源测试框架,它是xUnit架构的一部分,xUnit是为多种编程语言创建的单元测试库的通用名称。JUnit是由Erich Gamma和Kent Beck创建的,目前已经发展到JUnit 5。
它提供了一些功能,使编写测试变得容易,包括支持多个测试用例、断言和报告。JUnit也是多功能的,允许用各种语言编写测试。
JUnit 主要用于单元测试,但它也可用于其他测试,如功能和集成测试。功能测试是测试系统的功能。它们与单元测试不同,因为它们测试的是整个系统而不是单个单元。集成测试测试两个或多个系统的集成。它们与单元测试不同,因为它们测试的是系统的各个组成部分如何协同工作,而不是单独工作。
- 什么是单元测试框架?
对于单元测试框架来讲,它主要完成以下几件事。
提供用例组织与执行: 测试用例只有几条时,可以不考虑用例组织,但是用例达到成百上千时,大量的测试用例堆砌在一起,就产生了扩展性与维护性等问题
提供丰富的断言方法: 不论是功能测试,还是单元测试,在用例执行完之后都需要将实际结果与预期结果相比较(断言),从而断定用例是否执行通过。单元测试框架一般提供丰富的断言方法。例如:判断相等/不等、包含/不包含、True/False的断言方法等
提供丰富的日志: 当测试用例执行失败时能抛出清晰的失败原因,当所有用例执行完成后能提供丰富的执行结果。例如,总执行时间、失败用例数、成功用例数等。
从这些特性来看单元测试框架的作用是:帮助我们更自动化完成测试,所以,它是自动化测试的基础。
- 为什么进行单元测试?
在平时的开发当中,一个项目往往包含了大量的方法,可能有成千上万个。如何去保证这些方法产生的结果是我们想要的呢?当然了,最容易想到的一个方式,就是我们通过 System.out 来输出我们的结果,看看是不是满足我们的需求,但是项目中这些成千上万个方法,我们总不能在每一个方法中都去输出一遍嘛。这也太枯燥了。这时候用我们的单元测试框架JUnit就可以很好地解决这个问题。
JUnit 如何解决这个问题的呢?答案在于内部提供了一个断言机制,他能够将我们预期的结果和实际的结果进行比对,判断出是否满足我们的期望。
- 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 注解
版权归原作者 薛定谔的猫1982 所有, 如有侵权,请联系我们删除。