使用dbunit初始化数据

    在进行自动化测试时,测试的健壮性很重要,对于数据库驱动程序来说,单元测试的健壮性主要来自于数据库数据。你写测试的时候是一种状态,但数据库的状态会随时改变,如何保证单元测试的健壮性呢? 我们可以在测试前使用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格式的,如下

 



  
  
  
  

 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方法中初初始化,这样单元测试才具备独立性,可重复性及容易理解。

 

 

 

 

你可能感兴趣的:(自动化测试,TDD,junit)