Java学习笔记@Junit单元测试

笔者:unirithe

日期:11/12/2021

单元测试

单元测试就是针对最小的功能单元编写测试代码,Java程序最小的功能单元是方法,因此,单元测试就是针对Java方法的测试,进而检查方法的正确性

Junit

  • Junit是使用Java语言实现的单元测试框架,它是开源的,Java开发者都应当学习并使用Junit编写单元测试
  • 几乎所有的IDE工具都集成了Junit,目前最新版本是5

优点

  • 可灵活的选择执行哪些测试方法, 可以一键执行全部测试方法
  • 可生成全部方法的测试报告
  • 单元测试中的某个方法测试失败了,不会影响其他测试方法的测试

IDEA 配置 Junit

在IDEA使用Junit只需导入两个jar包,分别是 junit-*.jarhamcrest-core-*.jar 其中的*表示版本号

不同Junit版本的利用率 ,数据图片来源:Maven官方仓库

image

由此可见4.12版本是使用最多的版本,所以推荐下载Junit4.12,之后的例子也都基于该版本,其中会有部分API与5版本不同

Junit 4.12 jar包下载地址 https://repo1.maven.org/maven2/junit/junit/4.12/junit-4.12.jar

在Maven下载依赖包,对应的hamcrest-core的jar包会在junit下载网页中有提示,如下图:

hamcrest-core.jar包下载地址https://mvnrepository.com/artifact/org.hamcrest/hamcrest-core/1.3

image

为方便之后的项目使用Junit进行单元测试,把这两个jar包放到一个指定的文件夹

image

接着在IDEA里进行jar包配置 File -> Project Structure -> SDK下面的那个选项,添加Juni文件夹即可

image

使用注意事项

  • 必须是public 公开方法,且无参数 无返回值, 比如:public class Demo { @Test public void test(){} }
  • 必须使用@Test注解标记

初识断言

org.junit.Assert

Assert.assertEquals(提示消息, 预期值, 判断变量)

public class UserService {
   public String loginName(String username, String password){
       if("admin".equals(username) && "123456".equals(password))
           return "登陆成功";
       else
           return "登陆失败";
   }
   public String selectName(){
       return "";
   }
}

 @Test
public void testLoginName(){
	UserService us = new UserService();
	String rs = us.loginName("admin", "12345");
	// 断言
	Assert.assertEquals("经过测试,没有登陆成功!", "登陆成功", rs);
}

测试结果

org.junit.ComparisonFailure: 经过测试,没有登陆成功!
预期:登陆成功
实际:登陆失败
<点击以查看差异>

单元测试可一次性测试多个方法

import org.junit.Test;
public class Demo {
    @Test
   public void test1(){
        int b = 10 / 0;
        System.out.println("test1. ok");
    }
    @Test
    public void test2(){
        System.out.println("test2. ok");
    }
}

image

Junit常用注解

Junit 4 版本

注解 说明
@Test 测试方法
@Before 修饰实例方法,在每个测试方法执行前执行一次
@After 修饰实例方法,在每个测试方法执行后执行一次
@BeforeClass 静态修饰方法,在所有测试方法之前只执行一次
@AfterClass 静态修饰方法,在所有测试方法之后只执行一次

测试 @Before 和 @After

import org.junit.After;
import org.junit.Before;
import org.junit.Test;
public class TestUserService {
    @Before
    public void beforeInit(){
        System.out.println("beforeInit() ok.");
    }
    @After
    public void afterEnd(){
        System.out.println("afterInit() ok.");
    }

    @Test
   public void test1(){
        System.out.println("test1. ok");
    }
    @Test
    public void test2(){
        System.out.println("test2. ok");
    }
}

运行结果

beforeInit() ok.
test1. ok
afterInit() ok.
beforeInit() ok.
test2. ok
afterInit() ok.

测试 @BeforeClass 和 @AfterClass

import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;
public class Demo {
    @BeforeClass
    public static void beforeInit(){
        System.out.println("beforeInit() ok.");
    }
    @AfterClass
    public static void afterEnd(){
        System.out.println("afterInit() ok.");
    }

    @Test
    public void test1(){
        System.out.println("test1. ok");
    }
    @Test
    public void test2(){
        System.out.println("test2. ok");
    }
}

运行结果

beforeInit() ok.
test1. ok
test2. ok
afterInit() ok.

Junit5 版本的常用注解

  • @Before 和 @After 更名为 @BeforeEach 和 @AfterEach

  • @BeforeClass 和 AfterClass 更名为 @BeforeAll 和 @AfterAll

posted @ 2021-11-12 21:46  Unirithe  阅读(241)  评论(0)    收藏  举报