Junit单元测试
1、简介
1.1 概念
单元测试就是针对最小的功能单元编写测试代码,Java程序最小的功能单元是方法,因此,单元测试就是针对Java方法的测试,进而检查方法的正确性。
1.2使用情况描述
在企业中开发一个程序有很多个方法,需要确定这些方法有没有问题,比如防止别人影响你的方法,或者程序部署到新环境还需要测试,通过测试来保证系统的稳健性。
2、测试方法对比
2.1 main方法测试
存在问题:
- 只有一个main方法,如果一个方法的测试失败了,其他方法测试会受到影响。
- 无法得到测试的结果报告,需要程序员自己去观察测试是否成功。
- 无法实现自动化测试。
2.2 Junit单元测试框架
优点
- JUnit可以灵活的选择执行哪些测试方法,可以一键执行全部测试方法。
- Junit可以生成全部方法的测试报告。
- 单元测试中的某个方法测试失败了,不会影响其他测试方法的测试。
3、单元测试
3.1 需求
使用单元测试进行业务方法预期结果、正确性测试的快速入门。
3.2 操作步骤分析
- 将JUnit的jar包导入到项目中。
IDEA通常整合好了Junit框架,一般不需要导入。
如果IDEA没有整合好,需要自己手工导入如下2个JUnit的jar包到模块.
- 编写测试方法:该测试方法必须是公共的无参数无返回值的非静态方法。
- 在测试方法上使用**@Test**注解:标注该方法是一个测试方法
- 在测试方法中完成被测试方法的预期正确性测试。
- 选中测试方法,选择“JUnit运行” ,如果测试良好则是绿色;如果测试失败,则是红色
3.3 实际应用
- 确定需要测试的方法。
package com.cp;
/*
业务方法
*/
public class UserService {
public String loginName(String loginName,String passWord){
if("admin".equals(loginName)&&"123qwe".equals(passWord)){
return "登录成功";
}else{
return "登录失败";
}
}
public void selectNames(){
System.out.println(10/0);
System.out.println("查询全部用户名称成功***");
}
}
- 新建一个测试类,导入包。
创建被测试类的测试代码:
第一种方法,直接点击被测试类UserService, 使用 Ctrl+Shift+T
第二种方法, 鼠标右键点击类名 使用 goto-Test
第三种方法,直接新建一个测试类,写一个无参数()无返回值(void),且公开(public)的非静态(static)方法,加上@Test注解
package com.cp;
import org.junit.Assert;
import org.junit.Test;
/*
测试类
*/
public class TestUserService {
/*
测试方法
无参数()无返回值(void),且公开(public)的非静态(static)方法
*/
@Test
public void testLoginName(){
UserService u = new UserService();
String rs = u.loginName("admin1","123qwe");
//进行预期结果的正确性测试-断言
//判断测试结果是否相等并且提示信息
Assert.assertEquals("您的功能业务数据可能存在问题","登录成功",rs);
}
}
- 判断测试结果是否符合预期
点击需要测试的方法前面的绿色按钮可以执行该测试方法
如果需要执行全部的测试方法则点击在测试类名处的绿色按钮
3.4 Junit 4.xxxx版本常用注解
注解 | 说明 |
---|---|
@Test | 测试方法 |
@Before | 用来修饰实例方法,该方法会在每一个测试方法执行之前执行一次。 |
@After | 用来修饰实例方法,该方法会在每一个测试方法执行之后执行一次。 |
@BeforeClass | 用来静态修饰方法,该方法会在所有测试方法之前只执行一次。 |
@AfterClass | 用来静态修饰方法,该方法会在所有测试方法之后只执行一次。 |
开始执行的方法:初始化资源。
执行完之后的方法:释放资源。
package com.cp;
/*
业务方法
*/
public class UserService {
public String loginName(String loginName,String passWord){
if("admin".equals(loginName)&&"123qwe".equals(passWord)){
return "登录成功";
}else{
return "登录失败";
}
}
public void selectNames(){
// System.out.println(10/0);
System.out.println("查询全部用户名称成功***");
}
}
package com.cp;
import org.junit.*;
/*
测试类
*/
public class TestUserService {
//修饰实例方法
@Before
public void before(){
System.out.println("before");
}
@After
public void after(){
System.out.println("after");
}
//修饰静态方法
@BeforeClass
public static void beforeClass(){
System.out.println("beforeclass");
}
@AfterClass
public static void afterClass(){
System.out.println("afterClass");
}
/*
测试方法
无参数()无返回值void,且公开的方法public
*/
@Test
public void testLoginName(){
UserService u = new UserService();
String rs = u.loginName("admin","123qwe");
//进行预期结果的正确性测试-断言
//判断测试结果是否相等并且提示信息
Assert.assertEquals("您的功能业务数据可能存在问题","登录成功",rs);
}
// @Test
// public void testSelectNames(){
// UserService u = new UserService();
// u.selectNames();
// }
}
测试结果
beforeclass
before
after
before
查询全部用户名称成功***
after
afterClass
3.5 Junit 5.xxxx版本常用注解
注解 | 说明 |
---|---|
@Test | 测试方法 |
@BeforeEach | 用来修饰实例方法,该方法会在每一个测试方法执行之前执行一次。 |
@AfterEach | 用来修饰实例方法,该方法会在每一个测试方法执行之后执行一次。 |
@BeforeAll | 用来静态修饰方法,该方法会在所有测试方法之前只执行一次。 |
@AfterAll | 用来静态修饰方法,该方法会在所有测试方法之后只执行一次。 |