> 文章列表 > Java高级技术 单元测试(JUnit4)

Java高级技术 单元测试(JUnit4)

Java高级技术 单元测试(JUnit4)

JUnit

  • JUnit总览
  • 一、什么是单元测试
  • 二、JUnit的使用与入门案例
  • 三、JUnit断言机制
  • 四、JUnit框架的常用注解
  • 五、JUnit5的注解

JUnit总览

Java高级技术 单元测试(JUnit4)

一、什么是单元测试?

所谓单元测试,就是针对最小的功能单元,编写测试代码对其进行正确性测试。

我们之前一直使用的测试便是通过main方法来实现,但在main方法中写测试代码有如下的几个问题存在:

  • 只能在main方法编写测试代码,去调用其他方法进行测试。
  • 无法实现自动化测试,一个方法测试失败,可能影响其他方法的测试。
  • 无法得到测试的报告,需要程序员自己去观察测试是否成功。

为了测试更加方便,有一些第三方的公司或者组织提供了很好用的测试框架,其中一种便是JUnit测试框架。

JUnit是第三方公司开源出来的框架,用于对代码进行单元测试的工具(IDEA已经继承了JUnit框架)。

相比于在main方法中测试,JUnit有如下的优点:

  • 可以灵活的编写测试代码,可以针对某个方法执行测试,也支持一键完成对全部方法的自动化测试,且各自独立。
  • 不需要人为分析测试的结果,会自动生成测试报告出来。

二、JUnit的使用与入门案例

因为Junit是第三方提供的,所以在使用之前,我们需要导入到项目之中才能使用,具体步骤如下所示:

  1. 将Junit框架的jar包导入到项目中(注意:IDEA集成了Junit框架,不需要手工导入)。
  2. 为需要测试的业务类,定义对应的测试类,并为每个业务方法,编写对应的测试方法(必须:公共、无参、无返回值)。
  3. 测试方法上必须声明@Test注解,然后在测试方法中,编写代码调用被测试的业务方法进行测试。
  4. 开始测试:选中测试方法,右键选择"Junit运行",如果测试通过,则为绿色;如果测试失败,则为红色

使用演示

先准备一个类:Utils工具类(实现两数最大值)

public class Utils {public static int max(int num1,int num2) {return num1 > num2? num1 : num2;}
}

再准备一个测试类,测试Utils工具类中的方法能否正常使用。

public class showTest {@Testpublic void show(){int num = 10;int num2 = 30;System.out.println("两数最大值为:" + Utils.max(num,num2));}
}

在写完代码后,测试方法左边会出现一个绿色的三角形按钮,点击按钮就可以测试方法。

Java高级技术 单元测试(JUnit4)

运行效果

Java高级技术 单元测试(JUnit4)


三、JUnit断言机制

断言机制(assertions):是测试方法中的核心部分,用来对测试需要满足的条件进行验证。这些断言方法都是org.junit.jupiter.api.Assertions的静态方法。

而所谓断言,意思是程序员可以预测程序的运行结果,检查程序的运行结果是否与预期一致。

  • 简单断言

介绍一种简单的断言方法。

现在在showTest中新增一个方法:assertEquals(判断两个对象或两个原始类型是否相等)。

public class showTest {@Testpublic void show(){int num = 10;int num2 = 30;assertEquals("不等于",10,Utils.max(num,num2));System.out.println("两数最大值为:" + Utils.max(num,num2));}
}

运行效果

Java高级技术 单元测试(JUnit4)
注意:

若断言失败,后面的代码都不会执行,所以断言后的输出语句并没有执行。

  • 数组断言

通过 assertArrayEquals 方法来判断两个对象或原始类型的数组是否相等

public class showTest {@Testpublic void show(){assertArrayEquals("内容不相等",new int[]{3,2},new int[]{2,2});}
}

运行效果

Java高级技术 单元测试(JUnit4)


四、JUnit框架的常用注解

JUnit的启动必须要有@Test注解,它的作用是用来标记一个方法为测试方法,测试才能启动执行。

在JUnit中,除了@Test注解,还有一些其他的注解:

Java高级技术 单元测试(JUnit4)

@Before:每个测试方法执行之前执行

@Beforepublic void before(){System.out.println("before执行了");}@Testpublic void test1(){System.out.println("test1执行");}@Testpublic void test2(){System.out.println("test2执行");}

运行效果

Java高级技术 单元测试(JUnit4)


@After:每个测试方法之后执行。

     @Testpublic void test1(){System.out.println("test1执行");}@Testpublic void test2(){System.out.println("test2执行");}@Afterpublic void after(){System.out.println("after执行了");}   

运行效果

Java高级技术 单元测试(JUnit4)


@BeforeClass :修饰静态方法,只会在所有测试方法之前执行一次。

@BeforeClasspublic static void before(){System.out.println("before执行了");}@Testpublic void test1(){System.out.println("test1执行");}@Testpublic void test2(){System.out.println("test2执行");}

运行效果

Java高级技术 单元测试(JUnit4)


@AfterClass : 修饰静态方法,只会在所有测试方法之后执行一次。

    @Testpublic void test1(){System.out.println("test1执行");}@Testpublic void test2(){System.out.println("test2执行");}@Afterpublic void after(){System.out.println("after执行了");}

运行效果

Java高级技术 单元测试(JUnit4)


● 注解的应用场景

假如我想在每个测试方法中使用Socket对象,并且用完之后,要把Socket关闭,这个时候就可以使用注解来完成。

public class jUnitTest{private static Socket socket;@Beforepublic void test1(){System.out.println("--> test1 Before 执行了");}@BeforeClasspublic static void test11(){System.out.println("--> test11 BeforeClass 执行了");//初始化Socket对象socket = new Socket();}@Afterpublic void test2(){System.out.println("--> test2 After 执行了");}@AfterCalsspublic static void test22(){System.out.println("--> test22 AfterCalss 执行了");//关闭Socketsocket.close();}
}

● 注解小结

1.被@BeforeClass标记的方法,执行在所有方法之前
2.被@AfterCalss标记的方法,执行在所有方法之后
3.被@Before标记的方法,执行在每一个@Test方法之前
4.被@After标记的方法,执行在每一个@Test方法之后

五、JUnit5的注解

在JUnit5中对注释做了更新,但作用是相同的,只是改了方法名。

Java高级技术 单元测试(JUnit4)

特殊符号