持续集成+单元测试实践(上)

单元测试实践

1.测试框架选择Unitils

为什么选择Untils作为本次项目单元测试框架呢?

Unitils的优点和介绍网上都比较详细:http://www.unitils.org/summary.html;它的主要模块有:

· DatabaseModule: 测试数据库维护和连接池

· DbUnitModule: 使用DBunit进行测试数据维护

· HibernateModule: Hibernate配置支持和自动的数据库mapping检查

· MockModule: 支持使用Unitilsmock框架进行mock创建

· EasyMockModule: 支持使用EasyMockmock框架进行mock创建

· InjectModule: 支持注入mock对象到其他对象中

· SpringModule: 支持载入Spring配置文件、检索或注入Spring Beans

 

本次项目并没有全部用到它的所有特性,其中我使用到的优秀特性和功能有:

l  Spring集成的单元测试提供很好的解决方案

l  数据库相关测试的数据准备,事务回滚

l  简单方便的Assert工具

2.在测试中使用Unitils

方法一.  继承UnitilsJUnit4

方法二.  在测试类上添加annotation@RunWith(UnitilsJUnit4TestClassRunner.class)

方法三.  拷贝UnitilsJUnit3(UnitilsJUnit4)的代码生成一个MyUnitilsJunit3,然后测试类继承这个类。这种方法的好处是MyUnitilsJunit3可以随意继承一个Junit3 TestCase 的子类,比如:   AbstractDependencyInjectionSpringContextTests,从而可以更加方便的加入自己需要的功能。

 

3.使用Unitils进行Spring集成的单元测试

            在基类中设置公用的Spring 配置

@SpringApplicationContext( {"/bean/profile/base-beans.xml"})

public class DAOTestBase  extends UnitilsJUnit4{

 

}

 

子类中特殊化的Spring配置

public class UserDAOTest extends DAOTestBase{

 

             @SpringApplicationContext( {"/bean/profile/base-beans.xml","/bean/profile/extra-beans.xml"})

protected ApplicationContext applicationContext;

 

@SpringBean("userDAO")

private UserDAO userDAO;

 

@SpringBeanByName

private UserDAO userDAO;

 

@SpringBeanByType

private UserDAO userDAO;

 

}

 

4.使用DBunit进行数据库相关的测试

(1). unitils.properties当中进行配置

         database.driverClassName=com.mysql.jdbc.Driver                                                              database.url=jdbc:mysql://192.168.205.62:3310/pro_general?characterEncoding=UTF-8

         database.userName=profile

         database.password=profile

         database.schemaNames=pro_general

         database.dialect=mysql

         设置数据载入策略为先删除再插入。常用的载入策略有CleanInsertLoadStrategy              InsertLoadStrategyRefreshLoadStrategyUpdateLoadStrategy;顾名思义,这些策          略不 难理解。

    DbUnitModule.DataSet.loadStrategy.default=org.unitils.dbunit.data      setloadstrategy.impl.DeleteInsertLoadStrategy

         数据集的格式支持多种,常用的有xmlexcel,本项目中使用excelxls文件(不是xlsx) 毕竟excel的编辑更加方便。下面的配置指定默认数据集解析方式

    DbUnitModule.DataSet.factory.default=org.unitils.dbunit.datasetfa      ctory.impl.XlsDataSetFactory

         (2). 在测试类中指定数据加载

                   @DataSet

       public class TagTest extends DAOTestBase {
           @ExpectedDataSet

           public void testUpdate(){

           }

       }

    Annotation @DataSet指明该类下的所有测试方法执行前都需要进行数据准备。DataSet中可以指明数据文件的具体路径和文件名,如果没有指定,默认在执行测试方法前先找${ClassName.methodName}的数据文件,再找${ClassName}的数据文件(文件格式为前面设置过的数据集格式)

    @ExpectedDataSet用于检查执行结果是否和预期一致。预期数据集文件和前面的数据准备文件查找过程类似只是文件名后面多了个“-result”。

 

 

5.使用Unitils事务保障数据库相关测试的一致性

@Transactional(TransactionMode.ROLLBACK)

在测试类或方法上添加Transactional Anotation,用于指定事务执行方式。这里提一下Unitils的一个bug,使用Transactional Anotation时测试类必须继承UnitilsJUnit4,@RunWith的方式则不行。

你可能感兴趣的:(spring,bean,mysql,单元测试,Excel)