Java学习笔记@Junit单元测试
笔者:unirithe
日期:11/12/2021
单元测试
单元测试就是针对最小的功能单元编写测试代码,Java程序最小的功能单元是方法,因此,单元测试就是针对Java方法的测试,进而检查方法的正确性
Junit
- Junit是使用Java语言实现的单元测试框架,它是开源的,Java开发者都应当学习并使用Junit编写单元测试
- 几乎所有的IDE工具都集成了Junit,目前最新版本是5
优点
- 可灵活的选择执行哪些测试方法, 可以一键执行全部测试方法
- 可生成全部方法的测试报告
- 单元测试中的某个方法测试失败了,不会影响其他测试方法的测试
IDEA 配置 Junit
在IDEA使用Junit只需导入两个jar包,分别是 junit-*.jar 和 hamcrest-core-*.jar 其中的*表示版本号
不同Junit版本的利用率 ,数据图片来源:Maven官方仓库

由此可见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

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

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

使用注意事项
- 必须是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");
}
}

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

浙公网安备 33010602011771号