JavaEE——Junit

声明:本栏目所使用的素材都是凯哥学堂VIP学员所写,学员有权匿名,对文章有最终解释权;凯哥学堂旨在促进VIP学员互相学习的基础上公开笔记。

Junit

Junit又名单元测试,Junit是用来测试Java代码的,使用Junit测试有什么特别的地方吗?Junit的好处之一,落实在单元两字上。可以对单元进行全方位测试。

什么是单元?单元就是模块。

单元小一点可以指一个类,一个类完成一件事件。

单元在小一点,可以指一个类中的方法。一个方法完成一个功能,多个方法组成一个类。

我们要对这一个个单元,一个个模块进行全方位测试,我们就可以使用Junit。Junit提供了这样的功能:分块全方位测试。

例:

image

这里有一个方法,给年龄赋值。先判断年龄是否符合要求,如果不符合,则抛出异常。如果符合则赋值给年龄。

image

使用Junit对前面写的年龄方法进行测试

@Test注解,告诉别人我这是一个测试用例,待会给我运行这个测试用例

因为一个方法写在类中,又不是main方法,光一个方法是不会被运行的。写上@Test表示这个Junit测试用例。注解配置描述着:这是一个测试用例,待会会来调用此注解下的方法

在第一个测试用例中,我们setAge传入年龄10,这是正常的年龄是不会有错误的。

在第二个测试用例中,我们@Test(expected)表示这个用例会抛出如下错误,如果有抛出我指定的错误,表示测试是通过。如果没有抛错或是抛错但不是我的这个错误,表示测试不通过

在这里就进行了2种测试。一个是正常情况下是否正确,一个是测试参数非法下是否会抛出异常。抛出指定的才通过,否则不通过。

运行结果如下:

image

运行了2个测试用例,都执行成功

如果我将测试抛出异常的方法改为10,年龄正常下,就不抛异常,再看测试用例:

改为10:

image

image

出现了警告,表示这个用例指定的异常没有被抛出。需要抛出异常,才表示正常通过。因为这个用例就是用来测试异常是否被抛出的。

image

当点击类上的运行,是这个测试类下的所有用例全部运行起来,如之前

image

当点击某一个用例的运行,表示只单独运行这一个用例如左下角

这就是全方面测试体现之一:可以对某一个方法,单独拎出来测试。可以对某一个方法,测试他正常运行,还测试他非法访问。不仅测正确,还要测错误。

如果没有用Junit,我们就只能是写一个类,main方法调用进行测试。这样有点不合适,并且测起来也麻烦,使用Junit就可以避免这种问题

在@Test注解,有2个参数可以选填

image

一个是expected,一个是timeout。一个设置方法会抛出异常,一个设置方法执行时间。

查看这个expected,是Class<? extends Trowable>,要求Class并且继承要异常,可以测异常 Timeout是设置这个方法执行的时间,当超过这个时间,表示这个方法超时了,可以做优化

Junit还提供了什么呢?

我们这里有一个MyArrayList类,我们打算测试这个类:

image

这里有这样一个注解@BeforeClass

image

@BeforeClass这个注解的意思是,在运行整个Junit之前,先调用这个方法。等同于初始化 还有这个注解@AfterClass,在运行完毕整个Junit后,调用这个注解下的方法,等同于destroy 还有@Before每次调用Junit案例前,先执行我这个方法 还有@After每次调用完Junit案例后,先执行我这个方法

这里的区别是: @BeforeClass与@AfterClass是在运行Junit框架前后调用,只会调用一次 @Before与@After是在调用用例前后调用,有多少个用例调用多少次

我们什么静态的集合属性,我们这里使用@BeforeClass注解,在执行整个Junit用例开始前,先给集合注入数据,在后面的测试就可以使用集合,就不用填充数据了。

@BeforeClass需要是静态的方法,因为在整个执行前先调用,可能是拿类.方法调用。保证方法先被执行。

测试一:

image

进入Junit调用@BeforeClass注入数据。我们这里addMyArrayList测试: 第0个数据是否是嘻嘻哈哈,第1个数据是否是哈哈嘻嘻,第2个数据是否是哈哈哈哈

Assert Junit提供的操作类,翻译:断言。这个操作类有什么用处呢?它的方法替代我们的一些操作。比如这里判断前后和后面的对象是否一样。就是解决这种事情的。如果符合则表示通过,如果不符合就报错。断言,断论是否OK

Assert提供的方法都是静态的方法:

image

引入静态包,*将Assert下的静态方法全部引入。

静态引包好处是,之前调用:Assert.assertEquals()。现在调用:assertEquals()

判断删除:

image

删除第二个,则就删掉了最后一个哈哈哈哈。assertNull判断第二个是否为null

在添加一个进入,第二个不为null。assertNotNull判断第二个是否不为null

assertEquals判断第一个对象与第二个对象是否一致

删除第一个,那么就由0 1 2变成0 2。那么2为1,则就是哈哈哈哈为1,哈哈嘻嘻被删除。assertEquals判断第二个是否是哈哈哈哈

判断下标越界:

image

测试参数错误,是否为抛出越界错误

判断修改

image

判断修改的地方是否是我们预期的值

这就是Junit测试,对业务块全方位测试。

@Test提供多方面测试。提供的Assert断言减轻了我们以前测试麻烦。

@Ignore

要测试的用例:

image

image

对方法进行测试,按照往常,这样的一测试就报错,因为里面有抛错,Junit也没有指定逻辑会抛出错误

查看测试:

image

对于这个用例,上面划上了蜂窝的图标。也没有报错。为什么会这样呢? 这就是@Ignore的作用了,ignore翻译:忽略。这个注解的意思是:忽略这个用例不执行。所以没报错,因为根本没有执行这个用例,这就是@Ignore的作用,忽略测试用例

@Runwith

这个注解在Spring-TestContext对Spring测试时,会使用到这个注解。在使用Spring测试时有2个注解,一个是@Runwith一个是ContextConfiguration。

@ContextConfiguration的意思是指定application.xml Spring配置文件在哪里,那@Runwith是意思是?

这个注解的意思猜测是运行之前启动这个类。什么意思呢?启动@Runwith指定的类,这样Spring书写的test类就启动了,这样这个test类就会帮我们构建Spring环境。这样我们在test中就可以直接使用,无需手动创建applicationcontext类了。

看来这个@Runwith与@BeforClass的意思是差不多了,是的。不过@BeforClass是在运行测试前调用这个静态方法。而@Runwith是运行测试前运行这个类

查看注解里面的申请:

image

里面要求的是class,类的class管理。要求这个传递的class要继承与Runner类

我们继承这个类,查看要求,这个类是一个抽象类:

image

继承这个抽象类,需要实现2方法,一个是销毁,一个运行。当重写这两个方法后,在运行Junit前应该就是调用run,运行完毕后在调用销毁方法。

但当我们这样写后,报错了,也没有深究。但意思是这个意思,在运行Junit测试前,会调用这个run开始做初始化或是其他操作。

原文地址:https://www.cnblogs.com/kaigexuetang/p/9833871.html