OTP

我们在日常的开发中,很大部分ut 都是测试数据库的增删改查功能,重复的ut常常因为数据库不一致而失败,例如第一次测试的时候刚刚插入了一条数据,再运行同样的ut因为数据重复就会失败。因此最好的测试方式是自己mock数据。每次ut在结束的时候都将数据库状态恢复到初始状态。这里就介绍一种spring使用transaction实现的方式。

  1. 在spring配置文件中配置数据库事务管理:
 <tx:annotation-driven transaction-manager="txManager"/>
 <bean id="txManager"class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
     <property name="dataSource" ref="testDataSource" />
 </bean>
 ```

其中dataSource是需要纳入管理的数据库的数据源配置。

2. 所有的测试类都需要继承AbstractTransactionalJUnit4SpringContextTests类。

3. UT类中设置数据源
```java
@Autowired
@Qualifier("dpMainDataSource")
private DataSource dpMainDataSource;
@Override
public void setDataSource(DataSource dataSource) {
    this.simpleJdbcTemplate = new SimpleJdbcTemplate(dpMainDataSource);
}
  1. 配置标签类 以上的配置完成之后,该UT所有的@Test方法执行结果都会RollBack, 如果有特殊需求可以设置@Rollback(false) java @TransactionConfiguration(defaultRollback = true,transactionManager="txManager")

5、下面给出一个示例代码

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {
          "classpath*:/config/spring/common/appcontext-*.xml",
          "classpath*:/config/spring/local/appcontext-*.xml",
          "classpath*:/config/spring/membercard/appcontext-*.xml" })
@TransactionConfiguration(defaultRollback = true, transactionManager = "txManager")
public class MemberCardUserProfileDemotionServiceObjectTest extends
AbstractTransactionalJUnit4SpringContextTests{
     @Autowired
     @Qualifier("dpMainDataSource")
     private DataSource dpMainDataSource;
    
     @Autowired
     private MemberCardUserProfileDemotionService memberCardUserProfileDemotionService;
    
     @Autowired
     private MemberCardUserDao memberCardUserDao;
    
     @Override
     public void setDataSource(DataSource dataSource) {
          this.simpleJdbcTemplate = new SimpleJdbcTemplate(dpMainDataSource);
     }
    
     @Test
     public void testOne(){
          //to test in here
     }
    
     @Test
     @Rollback(false)
     public void testTwo(){
         // to test in here
         
     }
}

总结

采用这种方式做ut,无论代码是在开发环境还是qa测试环境,只要每次代码修改只需要ut测试就可以看出代码是否正确,再也不会因为数据库的问题导致ut结果变化。