0


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

JUnit


JUnit总览

在这里插入图片描述

一、什么是单元测试?

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

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

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

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

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

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

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

二、JUnit的使用与入门案例

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

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

使用演示

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

publicclassUtils{publicstaticintmax(int num1,int num2){return num1 > num2? num1 : num2;}}

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

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

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

在这里插入图片描述

运行效果

在这里插入图片描述


三、JUnit断言机制

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

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

  • 简单断言

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

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

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

运行效果

在这里插入图片描述
注意:

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

  • 数组断言

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

publicclass showTest {@Testpublicvoidshow(){assertArrayEquals("内容不相等",newint[]{3,2},newint[]{2,2});}}

运行效果

在这里插入图片描述


四、JUnit框架的常用注解

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

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

在这里插入图片描述

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

@Beforepublicvoidbefore(){System.out.println("before执行了");}@Testpublicvoidtest1(){System.out.println("test1执行");}@Testpublicvoidtest2(){System.out.println("test2执行");}

运行效果

在这里插入图片描述


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

@Testpublicvoidtest1(){System.out.println("test1执行");}@Testpublicvoidtest2(){System.out.println("test2执行");}@Afterpublicvoidafter(){System.out.println("after执行了");}

运行效果

在这里插入图片描述


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

@BeforeClasspublicstaticvoidbefore(){System.out.println("before执行了");}@Testpublicvoidtest1(){System.out.println("test1执行");}@Testpublicvoidtest2(){System.out.println("test2执行");}

运行效果

在这里插入图片描述


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

@Testpublicvoidtest1(){System.out.println("test1执行");}@Testpublicvoidtest2(){System.out.println("test2执行");}@Afterpublicvoidafter(){System.out.println("after执行了");}

运行效果

在这里插入图片描述


● 注解的应用场景

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

publicclass jUnitTest{privatestaticSocket socket;@Beforepublicvoidtest1(){System.out.println("--> test1 Before 执行了");}@BeforeClasspublicstaticvoidtest11(){System.out.println("--> test11 BeforeClass 执行了");//初始化Socket对象
        socket =newSocket();}@Afterpublicvoidtest2(){System.out.println("--> test2 After 执行了");}@AfterCalsspublicstaticvoidtest22(){System.out.println("--> test22 AfterCalss 执行了");//关闭Socket
        socket.close();}}

● 注解小结

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

五、JUnit5的注解

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

在这里插入图片描述

标签: 单元测试 java junit

本文转载自: https://blog.csdn.net/chenjiap/article/details/129887602
版权归原作者 chen.c. 所有, 如有侵权,请联系我们删除。

“Java高级技术 单元测试(JUnit4)”的评论:

还没有评论