JUnit使用入门

简介

相信大部分新手在测试程序的时候都喜欢在方法中使用System.out.println()方法直接把结果打印出来,看结果是否符合预期。这种方法在测试代码量很小、逻辑简单的程序时很方便。但平常工做中的项目中的代码量大、逻辑复杂,若是仍是在方法中使用System.out.println()来测试,只是输出结果就使人眼花缭乱。这时候咱们就但愿有一个工具是咱们更加方便的在复杂的项目中进行测试。JUnit就是这样一个工具。api

JUnit是一个Java语言的单元测试框架。它不只能够根据测试数据来验证程序的正确性,还将测试代码与工程代码分离,此外它还能够进行批量测试程序,极大的方便了测试工做。JUnit的使用很简单,只须要在方法上加上@Test注解,JUint就能够识别到这个测试方法。bash

例子

下面是一个使用JUint小栗子。在这个例子中,咱们建立了一个Calculator类和一个CalculatorTest类。Calculator类中实现了两个简单的方法:add()sub(),其中add()方法的逻辑是正确的,其返回值是两个参数之和;sub()方法的逻辑是错误的,返回值是也是两个参数之和。CalculatorTest类也有两个方法:addTest()subTest()。其中addTest()用来测试Calculator类中的add方法,subTest()方法用来测试Calculator类中的sub()方法。框架

Step.1 在IDEA中建立一个Maven工程工具

Step.2 在pom.xml文件中添加JUnit的依赖,这样咱们就可使用JUint啦。这里使用最新版的JUnit。单元测试

<dependency>
    <groupId>org.junit.jupiter</groupId>
    <artifactId>junit-jupiter-api</artifactId>
    <version>5.5.0-M1</version>
    <scope>test</scope>
</dependency>
复制代码

Step.3 编写Calculator类。学习

package com.junit;

public class Calculator {

    public int add(int a, int b) {
        return a + b;
    }

    public int sub(int a, int b) {
        return a + b;
    }

}
复制代码

Step.4 编写CalculatorTest测试类。测试

咱们将使用CalculatorTest类测试Calculator类的正确性。CalculatorTest类中有两个方法:addTest()subTest(),它们都须要使用@Test解来注明这是一个测试方法。这两个方法的逻辑大体相同,都是先建立一个Calculator类的对象,调用各自要测试的方法,最后使用Assertions.assertEquals()来让JUnit判断程序是否正确。Assertions是JUnit提供的用来验证程序运行结果的类,这里咱们使用的Assertions.assertEquals()方法有两个参数,第一个参数是预期值,第二个参数是程序的运行结果,调用Assertions.assertEquals()方法就可让JUnit比较预期值和程序运行结果,以验证程序的正确性。Assertions中提供了不少Assertions.assertEquals()方法的重载方法来比较不一样类型的数据,以便于使用。ui

package com.junit;

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

public class CalculatorTest {

    @Test
    public void addTest() {
        System.out.println("execute addTest");
        Calculator calculator = new Calculator();
        int result = calculator.add(1, 3);
        Assertions.assertEquals(4, result);
    }

    @Test
    public void subTest() {
        System.out.println("execute subTest");
        Calculator calculator = new Calculator();
        int result = calculator.add(1, 3);
        Assertions.assertEquals(2, result);
    }

}
复制代码

Step.5 测试结果spa

CalculatorTest类在IDEA的显示以下图所示,咱们能够点击方法左边的按钮运行单个测试方法,也能够点击类名左边的按钮运行测试类中的全部测试方法。 3d

咱们先试下点击方法左边的按钮运行进行测试。由于 Caluculator类中的 add()方法逻辑是正确的因此测试结果是正确的,在IDEA中的运行结果以下图所示。
从上图中咱们能够很直观的看到,当测试经过的时候IDEA的运行结果栏会有绿色的对号。那么当测试不经过过的时候会怎样呢?接下来,咱们类名左边的按钮运行测试类中的全部测试方法。
从上图中能够看出两个测试方法都被调用了。因为 Calculator类中的 sub()方法的逻辑是错误的,因此不会经过测试。从上图也能够看出IDEA在输出栏中报错了,并打印出指望值是2,实际运行结果是4的错误。

@BeforeAll @AfterAll @BeforeEach @AfterEach注解的使用

有些时候咱们须要在测试方法以前和以后作一些工做,例如打开和释放资源。JUnit提供了一组注解来帮助咱们实现这类操做。

@BeforeAll注解的方法会在测试类的全部测试方法(包括被@BeforeEach注解的方法)执行以前执行。使用@BeforeAll注释的方法必须为static方法

@AfterAll会在测试类的全部测试方法(包括被@BeforeEach注解的方法)执行以前执行。使用@AfterAll注释的方法必须为static方法

@BeforeEach会在测试类的全部测试方法(除了被@BeforeAll注解的方法)执行以前执行。

@AfterEach会在测试类的全部测试方法(除了被@AfterAll注解的方法)执行以后执行。

为了进一步了解这几个注解的使用,咱们在CalculatorTest类中添加这几个注解。

package com.junit;

import org.junit.jupiter.api.*;

public class CalculatorTest {

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

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

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

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

    @Test
    public void addTest() {
        System.out.println("execute addTest");
        Calculator calculator = new Calculator();
        int result = calculator.add(1, 3);
        Assertions.assertEquals(4, result);
    }

    @Test
    public void subTest() {
        System.out.println("execute subTest");
        Calculator calculator = new Calculator();
        int result = calculator.add(1, 3);
        Assertions.assertEquals(2, result);
    }

}
复制代码

运行结果以下图所示

从运行结果中能够看出,使用 @BeforeAll注解的方法在全部测试方法被执行以前执行,使用 @AfterAll注解的方法在全部测试方法被执行以后执行,它们都只被执行了一次。使用 @BeforeEach在测试类的除了被 @BeforeAll注解的方法的全部测试方法执行以前被执行。使用 @AfterEach会在测试类的除了被 @AfterAll注解的方法全部测试方法执行以后执行,它们都被执行了两次。

JUnit使用入门的介绍到此结束,对JUnit有兴趣的同窗能够进行更深刻的学习。

相关文章
相关标签/搜索