目前淘宝共享中心测试的数据准备主要使用Unitils + DBunit来完成,具体实现请参阅:
http://teamojiao.iteye.com/blog/456782
文中已经提及和如何实现Uitils对Execl文件的 支持,并指出Unitils暂时无法支持多数据源的不足。在TC读写分离项目的测试中,需要同时往不同的数据 库插入测试数据,为此该问题的存在已经大大的影响了测试效率,因此决定对Unitils进行再次改造,使其能够对多数据源提供良好支持;
·How Unitils works with DBUnit
我们首先来看下Unitls是如何将数据传递给DBunit的,org.dbunit.operation.DatabaseOperation提供的接口如下:
public abstract void execute(IDatabaseConnection connection, IDataSet dataSet) throws DatabaseUnitException, SQLException;
可以看出,Unitils只需要dataSet和相应的connection参数就可以完成数据库的操作,这样我们只需将一个Excel中的内容根据不同的数据源拆分成几个dataSet并配给不同数据源就可以实现对多数据源的需求了。
·Excel 文件的拆分
为了把Excel拆分成几个DataSet,我们就得先看下DataSet的结构,DataSet其实只有一个成员变量:ITable[] _tables,因此我们只需将_tables按不同的数据源拆分为几个ITable的数组即可。而为了能将不同的表单按数据源进行,本次做法是在 Excel的各个表单加上标签,即表单名由原来的TableName改为 DatasourceLable.TableName,DatasourceLable与数据源配置一一对应,为了可以兼容以前的用例,也可没有 DatasourceLable,此时使用默认数据源(详见数据源配置)。
如上标注中,sheet1中的数据将插入默认数据源的TC_BIZ_ORDER表中,sheet2中的数据将插入test标注的数据源的user表中。
·数据源配置
上例中,数据源配置如下:
默认数据源:
#default datasource database.driverClassName=oracle.jdbc.driver.OracleDriver database.url=jdbc:oracle:oci:@dev-unittest database.userName=tbcenter database.password=tbcenter database.schemaNames=tbcenter
标注为test的数据源
test.database.driverClassName=org.gjt.mm.mysql.Driver test.database.url=jdbc:mysql://127.0.0.1:3306/test test.database.userName=test test.database.password=
我们将根据数据源配置文件的配置将所用到的数据源放到一个Datasource Map中,以标注为Key。
接下来只需把DataSet和Datasource一一对应起来传递给DBunit即可实现多数据源的支持了。
一个很土却有效方法,欢迎拍砖。