什么是单元测试

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

为什么需要单元测试

在没有单元测试之前我们是使用main方法进行测试的,但是只有一个main方法,如果一个方法的测试失败了,其他方法测试会受到影响。无法得到测试的结果报告,需要程序员自己去观察测试是否成功。无法实现自动化测试。
所以后来有公司发明Junit单元测试,对应的优点:

  • JUnit可以灵活的选择执行哪些测试方法,可以一键执行全部测试方法。
  • Junit可以生成全部方法的测试报告。如果测试良好则是绿色;如果测试失败,则是红色【断言失败为黄色】
  • 单元测试中的某个方法测试失败了,不会影响其他测试方法的测试。

怎么进行单元测试

应该达到的要求:

  • 必须导入Junit框架的jar包。【IDEA集成,初次使用联网自动选择版本导入/也可手动下载加入jar包,4.0版本相对5.0版本会更稳定】
  • 定义的测试方法必须是无参数无返回值,且公开的方法。【方便框架的实现】
  • 测试方法使用@Test注解标记。
    JUnit测试某个方法,测试全部方法怎么处理?成功的标志是什么:
  • 测试某个方法直接右键该方法启动测试。
  • 测试全部方法,可以选择类或者模块启动。
  • 红色失败,绿色通过。

断言与示例

什么是断言

进行预期结果的正确性测试:Junit中Assert类即实现断言功能,根据实际情况会有很多种断言方法。
例如下面例子中的Assert.assertEquals方法中的参数("结果错误打印的message", "方法正确预期得到的结果", 方法执行得到的实际结果 )

Junit示例

  1. 首先我们要有一个业务方法UserService,我们才能为其编写测试类UserService进行方法测试
/**  
 业务方法  
 */  
public class UserService {  
    public String loginName(String loginName , String passWord){  
        if("admin".equals(loginName) && "123456".equals(passWord)){  
            return "登录成功";  
 }else {  
            return "用户名或者密码有问题";  
 }  
    }  
  
    public void selectNames(){  
        System.out.println(10/2);  
 System.out.println("查询全部用户名称成功~~");  
 }  
}
  1. TestUserService类中我们分别编写不同的公开、无参、无返回值的测试方法
    1. 测试用户名输入是否正确,因为有返回值,所以需要用到断言自动化判断结果【 Assert.assertEquals("结果错误打印的message", "方法正确预期得到的结果", 方法执行得到的实际结果 ); 】
    2. selectNames筛选用户名功能没有返回值,直接调用测试
    3. 注意:
      • 在测试方法中先要做的是实例化对象,在调用方法
      • 红色:功能的函数逻辑发生错误【无法正常运行】
      • 黄色:功能的函数逻辑正确,但参数错误【可以运行只是结果不对】
      • 绿色:功能的函数逻辑和参数均正确
/**  
 测试类  
 */  
public class TestUserService {  
    /**  
 测试方法  
 注意点: 1、必须是公开的,无参数 无返回值的方法  
 2、测试方法必须使用@Test注解标记。  
 */  
 @Test  
 public void testLoginName(){  
        UserService userService = new UserService();  
 String rs = userService.loginName("admin","123456");  
  
 // 进行预期结果的正确性测试:断言。  
 Assert.assertEquals("您的登录业务可能出现问题", "登录成功", rs );  
 }  
  
    @Test  
 public void testSelectNames(){  
        UserService userService = new UserService();  
 userService.selectNames();  
 }  
  
}

常用注解

Junit常用注解(Junit 4.xxxx版本)

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

Junit常用注解(Junit 5.xxxx版本)

注解 说明
@Test 测试方法
@BeforeEach 用来修饰实例方法,该方法会在每一个测试方法执行之前执行一次。
@AfterEach 用来修饰实例方法,该方法会在每一个测试方法执行之后执行一次。
@BeforeAll 用来静态修饰方法,该方法会在所有测试方法之前只执行一次。
@AfterAll 用来静态修饰方法,该方法会在所有测试方法之后只执行一次。

Junit4和junit5的注解区别在哪里

Junit5的注解只是在Jnunit4的基础上改成了更直观的名字而已

这些注解有啥用,为啥需要注解

  • 开始执行的方法:初始化资源。
  • 执行完之后的方法:释放资源。

比如IO流需要加载类,我们就需要:

  • 在所有测试方法之前加载流【使用@BeforeClass】
  • 在所有测试方法之后关闭流【使用@AfterClass】