java-Junit单元测试

1,070 阅读4分钟

Junit单元测试

1、引入依赖

image-20210726141905928

2、相关注解

junit是以org.junit为框架进行的测试,以注解的形式@Test来识别代码中需要测试的方法;

@BeforeClass 全局只会执行一次,而且是第一个运行
@Before 在测试方法运行之前运行
@After 在测试方法运行之后允许
@AfterClass 全局只会执行一次,而且是最后一个运行
@Ignore 忽略此方法
@Rollback 事务控制,默认为true,表示单元测试过程中事务会回滚,不会操作数据库
@Test 该方法为测试方法
@Test(expected = NullPointerException.class)  
解析:在注解的时候添加expected 为忽略此异常
@Test(timeout  =   5000 ):超时设置
@Test(expected  =  XXXXException. class):期望出现异常,如果出现该异常则成功,否则测试失败

3、断言测试

断言列表:
->assertTrue(String message, boolean condition)             要求condition == true
->assertFalse(String message, boolean condition)            要求condition == false
->assertEquals(String message, XXX expected,XXX actual) 要求expected期望的值能够等于actual
->assertArrayEquals(String message, XXX[] expecteds,XXX [] actuals) 要求expected.equalsArray(actual)
->assertNotNull(String message, Object object)          要求object!=null
->assertNull(String message, Object object)             要求object==null
->assertSame(String message, Object expected, Object actual)     要求expected == actual
->assertNotSame(String message, Object unexpected,Object actual) 要求expected != actual
->assertThat(String reason, T actual, Matcher matcher)  要求matcher.matches(actual) == true
->fail(String message) 要求执行的目标结构必然失败,同样要求代码不可达,即是这个方法在程序运行后不会成功返回,如果成功返回了则报错
Assert.assertEquals("此处输出提示语", 5, result);
解析:"此处输出提示语" 为错误时你个人想要输出的错误信息; 5  是指你期望的值;result 是指你调用程序后程序输出给你的结果
​
fail("Not yet implemented")
解析:放在方法中,如果我顺利地执行,我就报失败出来。就是说按道理不应该执行到这里的,但是偏偏执行了,说明程序有问题
​
Assert.assertTrue("msg",boolean)与Assert.assertFalse("msg",boolean)
解析:如果和预期一样为true则成功,否则失败输出msg;如果和预期一样为false则成功,否则失败并输出

4、运行器指定

单元测试中,每个类都是由于JUNIT4框架中的Runner运行器来执行的。一般情况下,在没有指定运行器的时候,是由系统默认选择(TestClassRunner)的运行器执行。包括类中的所有方法都是由该运行器负责调用和执行。

当我们需要指定的时候,则通过类级别注解 @Run Wirth(xxxxxx)进行选择,一般是根据不同类型选择不同执行器,可以提高效率也可以应用于某种特殊场景!

5、参数化测试

blog.csdn.net/w605283073/…

6、打包测试

@RunWith(Suite. class )
@Suite.SuiteClasses( {CalculatorTest. class ,SquareTest. class } )
public   class  AllCalculatorTests  {
    //to do something;
} 
​
解析:将有需要的一起执行程序一起打包,然后执行
运行器:Suite. class

解析:我们把需要打包一起测试的测试类作为参数传递给该注解。然后直接运行代码,此处的测试类可以直接设置为空,只需要添加注解便OK;

7、单元测试数据检查方式

1 断点 通过打断点查看测试过程中的数据变化

2 断言 即采用断言测试方法

3 日志 通过查看日志检查数据异常

8、单元测试如何控制事务回滚

在单元测试时,只要测试类开启了事务,所有的操作,无论抛出什么类型的异常,无论是否存在事务的传播行为,无论被调用的类上是否有@Transactional注解,还有无论是否捕获异常,都会回滚事务。

在单元测试时,测试类不开启事务,如果被调用的类上有@Transactional注解(开启事务),此时若被调用类的被调用方法发生不可查异常(RuntimeException及其子类或者error),则事务会回滚,其他操作不会回滚。 解释:虽然单元测试没有开启事务,但是被调用的类本身存在事务,所以会出现事务回滚的情况。

在单元测试时,测试类不开启事务,如果被调用的类不开启事务(即类上没有@Transactional注解),被调用类中的方法不抛出异常、抛出不可查异常RuntimeException及抛出可查异常IOException,这三种情况都不会回滚事务。解释:因为都不存在事务,自然不会有事务回滚。

因此,我们最好在测试类上或涉及事务的测试方法上开启事务,导入 javax.transaction.Transactional包或者org.springframework.transaction.annotation.Transactional的@Transactional注解,避免污染数据库。

通过@Transactional, @Rollback 注解来实现, @Rollback默认是true,事务会回滚,可以不写, false时事务不会回滚,数据会写到数据库中。

一般的场景下都是要对事务进行回滚的。要支持回滚,只需要增加一个@Transactional注解即可;

@Test
@Transactional

单独的@Transactional是回滚事务,在添加@Transactional的情况下如果要提交事务,只需要增加@Rollback(false);

@Test
@Transactional
@Rollback(value = false)

\