在进行自动化测试时,测试的健壮性很重要,对于数据库驱动程序来说,单元测试的健壮性主要来自于数据库数据。你写测试的时候是一种状态,但数据库的状态会随时改变,如何保证单元测试的健壮性呢? 我们可以在测试前使用dbunit来初化数据,以保证你测试中使用的数据没问题。
1,使用dbunit导出数据库数据:
//先保存上一次保存的数据
InitData.initData();
Class.forName("oracle.jdbc.driver.OracleDriver");
Connection jdbcConnection = DriverManager.getConnection(
"jdbc:oracle:thin:@192.168.60.54:1521:DEVDB01", "neo_2011_dev", "neo_2011_dev");
DatabaseConnection conn = new DatabaseConnection(jdbcConnection, "neo_2011_dev");
IDatabaseConnection connection = conn;
QueryDataSet partialDataSet = new QueryDataSet(connection);
partialDataSet.addTable("pds_product", "select * from pds_product p where p.productname='***测试专用'");
partialDataSet.addTable("web_productview", "select * from web_productview w where w.productname = '***测试专用'");
partialDataSet.addTable("mbs_member", "select * from mbs_member m where m.membername='***测试专用'");
partialDataSet.addTable("sto_buyEnter", "select * from sto_buyEnter aa where aa.id = -1");
FlatXmlDataSet.write(partialDataSet, new FileOutputStream("siushop_web.xml"));
导出后的数据是xml格式的,如下
<?xml version='1.0' encoding='UTF-8'?>
<dataset>
<pds_product ID="18452" PRODUCTCODE="201111STOCK" PRODUCTNAME="罗明亮测试专用" BRANDCODE="BBI" BRANDNAME="By Basi" ONETYPE="FEMALE" SIZEGROUP="ALL" SIZERATIOS="标准尺码组" YEAR="FW11" SEASON="2011秋冬" DESCRIPTION="stock_test" GENDER="F" CURRENCY="RMB" RETAILPRICE="0" WEBRETAILPRICE="188" WEBDISCOUNT="0" REFERENCEPRICE="56" ACTUALPRICE="0" TOMARKETDATE="2011-11-03 00:00:00.0" COSTACCOUNTINGTYPE="1" BESHOW="1" BESALE="1" UPDATEBY="冯星" UPDATETIME="2011-11-29 11:56:04.0" TWOTYPE="WT" THREETYPE="YRFWT" ONETYPENAME="女装" TWOTYPENAME="外套" THREETYPENAME="羽绒服"/>
<web_productview ID="602" PRODUCTCODE="201111STOCK" BRANDCODE="BBI" BRANDNAME="By Basi" ONETYPE="FEMALE" TWOTYPE="WT" THREETYPE="YRFWT" SIZEGROUP="80,81,82,83,84,85,86,87" SIZERATIOS="XXS,XSi,S,M,L,XL,XXL,XXXL" YEAR="FW11" SEASON="2011秋冬" DESCRIPTION="stock_test" GENDER="F" CURRENCY="RMB" RETAILPRICE="0" WEBRETAILPRICE="188" WEBDISCOUNT="0" COLORS="天蓝色,好色" TOMARKETDATE="2011-11-03 00:00:00.0" SALESVOLUME="0" BESHOW="1" BESALE="1" ACTIVE="1" PRODUCTNAME="罗明亮测试专用" ONETYPENAME="女装" TWOTYPENAME="外套" THREETYPENAME="羽绒服"/>
<mbs_member ID="47927" MEMBERCD="0000047925" MEMBERLEVEL="1" MEMBERNAME="罗明亮测试专用" PASSWORD="E10ADC3949BA59ABBE56E057F20F883E" SEX="1" EMAIL="mingliang.luo@neo-concept.com.cn" CREATETIME="2011-11-05 21:38:22.0" CREATOR="123456" EMPIRICVALUE="0" STATUS="1" PERFECTINFO="1" MEMBERTYPE="2" CREATORID="20001101" ISBLACK="1"/>
<sto_buyEnter ID="-1" BUYCODE="CG00002636" STORAGE="电子商务东莞仓" PRODUCTSOURCE="杭州" APPLICANT="罗明亮" APPLYDATE="2011-12-05 00:00:00.0" ENTERSTATE="1" ISBUY="0" ISDIFFERENCE="0" BUYNOTE="1323074291894" CREATOR="20001101" CREATEDATE="2011-12-05 16:38:12.0" PROJECTNUMTOTAL="1000" REALNUMTOTAL="0" DIFFERENCENUMTOTAL="0"/>
</dataset>
2,使用dbunit来初始化数据,我使用的方式是refresh形式的—就是xml数据里有的数据(根据主健与数据库数据比对),就进行update,没有的数据就进行insert操作;
这也就在某种意义上建立了一个虚拟schema,当然你也可以使用单独的schema进行测试,呵呵
public SiushopData(String name)
{
super( name );
System.setProperty( PropertiesBasedJdbcDatabaseTester.DBUNIT_DRIVER_CLASS, "oracle.jdbc.driver.OracleDriver" );
System.setProperty( PropertiesBasedJdbcDatabaseTester.DBUNIT_CONNECTION_URL, "jdbc:oracle:thin:@192.168.60.54:1521:DEVDB01" );
System.setProperty( PropertiesBasedJdbcDatabaseTester.DBUNIT_USERNAME, "neo_2011_dev" );
System.setProperty( PropertiesBasedJdbcDatabaseTester.DBUNIT_PASSWORD, "neo_2011_dev" );
// System.setProperty( PropertiesBasedJdbcDatabaseTester.DBUNIT_SCHEMA, "" );
}
@Override
protected IDataSet getDataSet() throws Exception {
return new FlatXmlDataSetBuilder().build(new FileInputStream("siushop_web.xml"));
}
Connection jdbcConnection = DriverManager.getConnection(
"jdbc:oracle:thin:@192.168.60.54:1521:DEVDB01", "neo_2011_dev",
"neo_2011_dev");
DatabaseConnection conn = new DatabaseConnection(jdbcConnection, "neo_2011_dev");
IDatabaseConnection connection = conn;
IDataSet iDataSet = new SiushopData("neo_2011_dev").getDataSet();
DatabaseOperation.REFRESH.execute(connection, iDataSet);
3,在自动化测试用集成dunit初始化数据,在实例化容器后,数据将得到初始化!
private static ApplicationContext context ;
static{
context = new ClassPathXmlApplicationContext("applicationContext.xml");
//初始化数据,增强测试的健壮性
try {
InitData.initData();
} catch (Exception e) {
e.printStackTrace();
}
}
private BeanFactory(){
}
public static Object getBean(String beanName){
return context.getBean(beanName);
}
4, 在测试的时候,就可以直接引用数据库的数据,而不用担心测试的健壮性
@Test
public void test保存采购入库() throws Exception{
BuyEnter buyEnter = purchaseStorageService.loadPurchaseStorageById(-1l); //直接使用特定数据进行测试,这个数据得到初始化,而不用担心数据不存在或一致
//...
}
小结:当然了,严格意义上的单元测试初始化是在单个测试前进行初始化工作(包括数据初始化)—在setUp方法中初初始化,这样单元测试才具备独立性,可重复性及容易理解。
分享到:
相关推荐
3. **清洗数据库**:在开始测试之前,可能需要清空或初始化数据库,确保测试在已知状态下开始。这通常通过 `IDatabaseConnection` 的 `cleanInsert()` 方法完成,它可以删除指定表中的所有数据。 4. **装载数据**:...
数据集通常以 CSV、XML 或 YAML 格式定义,可以用来初始化或验证数据库的状态。 2. **操作模式(Operation)**: DBUnit 支持多种操作,如 `CLEAN_INSERT`、`INSERT`、`UPDATE` 和 `DELETE`,它们分别对应清除并插入...
`DatabaseTestCase`提供了管理数据库状态的一系列方法,如设置初始化数据和恢复原始状态。 在测试用例中,你可以针对具体的业务逻辑编写测试方法。假设你有一个名为`StudentDAO`的数据访问对象,其中有一个`...
1. 数据初始化:在测试前,DBUnit 可以导入 CSV、XML 或 Excel 文件中的数据到数据库,设置测试环境的数据状态。 2. 数据验证:测试完成后,DBUnit 可以对比数据库的实际数据与预期结果,确保测试过程中数据库的状态...
以下是一个简单的Ant构建文件(build.xml)片段,展示了如何使用DBUnit进行数据初始化: ```xml <project name="DBUnit-Ant-Example" default="run-dbunit"> <taskdef name="dbunit" classname="org.dbunit.ant....
DBUnit 的主要功能在于帮助开发者在执行测试前后对数据库进行初始化和清理,确保每次测试都在一个已知的、干净的状态下开始。这样可以避免因为数据残留或依赖关系导致的测试不准确。以下是一些关于DBUnit 2.2的知识...
使用DBUnit,我们可以创建一个数据集(通常为XML或CSV格式),该数据集包含用于初始化数据库的记录。在测试开始前,这些数据会被加载到数据库中,形成一个已知的起点。测试执行完毕后,还可以选择将数据库恢复到初始...
3. 初始化数据库:使用 `DatabaseOperation` 类的实例(如 `CLEAN_INSERT`)来清空表并插入数据集中的数据。 4. 执行测试:在测试代码中,你可以查询数据库以验证数据是否正确加载。如果需要更新数据库,可以使用 `...
3. **初始化数据库**:使用`IDatabaseConnection`接口的`createDataSet()`方法加载数据集到数据库,清空并填充测试数据。 4. **执行测试**:在JUnit测试类中,编写测试方法,调用应用程序代码,观察和验证结果。 5...
通常,`@Before` 会使用 `IDatabaseConnection` 和 `IDataSet` 清理和填充数据,`@After` 用于恢复初始状态或清理数据。 6. **执行测试**:在测试方法中,使用 `DatabaseTester` 或 `DBUnitHelper` 类来运行 DBUnit...
典型的流程包括:连接数据库、初始化数据库状态、执行测试方法、并在测试后清理数据库状态。DbUnit的Clean和Insert模式可以帮助我们有效地管理数据库在测试期间的状态,确保测试结果的准确性。 在实际应用中,可能...
1. **数据填充**:DBUnit允许你在测试开始前设置数据库到已知状态,这通常被称为“清理”或“初始化”。你可以定义XML文件来描述期望的数据结构和内容,然后使用这些文件将数据加载到数据库中。 2. **断言比较**:...
DbUnit 提供了一种方法来管理这些状态,允许开发者在测试开始前设定数据库的初始数据,执行测试后则可以验证数据库是否处于预期状态,或者在每次测试之间清理数据库,确保测试的隔离性。 DbUnit 的核心功能包括: ...
3. **数据填充**:使用 `Dataset` 对象,DbUnit 可以将预定义的数据填充到数据库中,以模拟各种场景。 4. **断言比较**:DbUnit 提供了断言方法,用于比较数据库的实际状态与期望的状态是否一致,有助于确保测试的...
5. **DBUnitInitializer.java** 和 **DBUnitInitializationException.java**:前者可能是一个初始化类,负责在测试开始前设置DBUnit环境,后者可能抛出当初始化过程中发生错误时。 6. **...
// 初始化数据源 public void setupDataSource() { dataSource = new DriverManagerDataSource("jdbc:mysql://localhost:3306/test", "username", "password"); } @Before public void setUp() throws ...
1. 数据初始化:在测试之前,DBUnit可以将预定义的数据集(通常以XML或CSV格式)加载到数据库中,确保每次测试都在一致的数据状态下运行。 2. 数据清理:测试完成后,它可以清除这些临时数据,恢复数据库到初始状态...
1. **数据初始化**: 在开始任何数据库操作之前,DBUnit 提供了 `IDatabaseConnection` 接口来建立与数据库的连接,并通过 `DataSet` 推送预定义的数据集到测试环境中。`FlatXMLDataSet` 或 `XMLDataSet` 类常用于...
例如,`@Test`用于标记测试方法,`@Before`和`@After`用于在每个测试方法之前和之后执行初始化或清理工作。此外,还有`@Ignore`来忽略某个测试,`@Expected`指定预期的异常等。Junit4.10还引入了参数化测试和分类...
`getDataSet()` 方法返回的 `FlatXmlDataSet` 是用来初始化数据库的数据集,这里假设有一个名为 `initial_data.xml` 的文件包含了数据库的初始数据。 DBUnit 还提供了一种方便的方法来导出数据库中的数据到 XML ...