【测试】JUnit 测试 - 自动完成事务回滚 - Spring@Transactional注解

参考博客:

(初级篇)https://blog.youkuaiyun.com/andycpp/article/details/1327147
(中级篇)https://blog.youkuaiyun.com/andycpp/article/details/1327346
(高级篇)https://blog.youkuaiyun.com/andycpp/article/details/1329218

基于Controller层单元测试和服务层的单元测试也是一样的,在测试上添加 @Transactional 注解,就可以自动完成事务回滚,不需要再做事务补偿。
事务管理对于企业应用来说是至关重要的,即使出现异常情况,它也可以保证数据的一致性。

“标注”也是 JDK5 的一个新特性,用在此处非常恰当。我们可以看到,在某些方法的前有 @Before、@Test、@Ignore等字样,这些就是标注,以一个 “@” 作为开头。

JUnit提供了一种方法来区别他们,那就是在这种测试函数的前面加上 @Ignore 标注,这个标注的含义就是“某些方法尚未完成,暂不参与此次测试”。这样的话测试结果就会提示你有几个测试被忽略,而不是失败。一旦你完成了相应函数,只需要把 @Ignore 标注删去,就可以进行正常的测试。

Fixture(暂且翻译为“固定代码段”) - @Before、@After、@BeforeClass 或 @AfterClass

Fixture的含义就是“在某些阶段必然被调用的代码”。比如我们上面的测试,由于只声明了一个Calculator对象,他的初始值是0,但是测试完加法操作后,他的值就不是0了;接下来测试减法操作,就必然要考虑上次加法操作的结果。这绝对是一个很糟糕的设计!我们非常希望每一个测试都是独立的,相互之间没有任何耦合度。因此,我们就很有必要在执行每一个测试之前,对Calculator对象进行一个“复原”操作,以消除其他测试造成的影响。因此,“在任何一个测试执行之前必须执行的代码”就是一个Fixture,我们用 @Before 来标注它。
如果“在任何测试执行之后需要进行的收尾工作”也是一个Fixture,使用 @After 来标注。

上面,我们介绍了两个 Fixture 标注,分别是 @Before@After ,我们来看看他们是否适合完成如下功能:

有一个类是负责对大文件(超过 500 兆)进行读写,他的每一个方法都是对文件进行操作。换句话说,在调用每一个方法之前,我们都要打开一个大文件并读入文件内容,这绝对是一个非常耗费时间的操作。

如果我们使用 @Before@After ,那么每次测试都要读取一次文件,效率及其低下。这里我们所希望的是在所有测试一开始读一次文件,所有测试结束之后释放文件,而不是每次测试都读文件。 JUnit 的作者显然也考虑到了这个问题,它给出了 @BeforeClass@AfterClass 两个 Fixture 来帮我们实现这个功能。从名字上就可以看出,用这两个 Fixture 标注的函数,只在测试用例初始化时执行 @BeforeClass 方法,当所有测试执行完毕之后,执行 @AfterClass 进行收尾工作。在这里要注意一下,每个测试类只能有一个方法被标注为 @BeforeClass@AfterClass ,并且该方法必须是 PublicStatic 的。

限时测试 - @Test (timeout = 1000 )

public   void  squareRoot( int  n)  {
          for  (; ;) ;                  // Bug : 死循环 
} 

如果测试的时候遇到死循环,你的脸上绝对不会露出笑容。因此,对于那些逻辑很复杂,循环嵌套比较深的程序,很有可能出现死循环,因此一定要采取一些预防措施。限时测试是一个很好的解决方案。我们给这些测试函数设定一个执行时间,超过了这个时间,他们就会被系统强行终止,并且系统还会向你汇报该函数结束的原因是因为超时,这样你就可以发现这些 Bug 了。要实现这一功能,只需要给 @Test (timeout = 1000 ) 标注加一个参数即可

@Test(timeout = 1000 )
​
      public   void  squareRoot()  {
​
         calculator.squareRoot( 4 );
​
         assertEquals( 2 , calculator.getResult());
          
     } 

Timeout 参数表明了你要设定的时间,单位为毫秒,因此 1000 就代表 1 秒。

打包测试

在一个项目中,只写一个测试类是不可能的,我们会写出很多很多个测试类。可是这些测试类必须一个一个的执行,也是比较麻烦的事情。鉴于此, JUnit 为我们提供了打包测试的功能,将所有需要运行的测试类集中起来,一次性的运行完毕,大大的方便了我们的测试工作。

import  org.junit.runner.RunWith;
import  org.junit.runners.Suite;
​
 @RunWith(Suite. class )
 @Suite.SuiteClasses( {
         CalculatorTest. class ,
         SquareTest. class 
         } )
 public   class  AllCalculatorTests  {
 } 

@RunWith 标注传递一个参数 Suite.class 。同时,我们还需要另外一个标注 @Suite.SuiteClasses ,来表明这个类是一个打包测试类。我们把需要打包的类作为参数传递给该标注就可以了。有了这两个标注之后,就已经完整的表达了所有的含义,因此下面的类已经无关紧要,随便起一个类名,内容全部为空既可。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值