十五年测试老手,长期负责WEB\APP 项目测试,目前主要负责团队管理工作。

selenium与dbunit结合进行与数据库相关的测试

上一篇 / 下一篇  2012-02-09 22:01:47 / 个人分类:其它

文章来源
  • 文章来源:【转载】
1.dbunit原理:
Dbunit其原理,就是在每个测试方法之前后,通过增删一些固定的记录,保持了数据库的固定状态,由此,我们可以在每个测试方法中自由地增删记录,而不用担心会影响到别的测试方法。DBUnit的设计理念就是在测试之前,备份数据库,然后给对象数据库植入我们需要的准备数据,最后,在测试完毕后,读入备份数据库,回溯到测试前的状态。
2. POM文件中加入如下一段配置:
      <dependency>
         <groupId>org.dbunit</groupId>
         <artifactId>dbunit</artifactId>
         <version>2.4.3</version>
         <scope>test</scope>
      </dependency> 
     <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-log4j12</artifactId>
        <version>1.4.3</version>
   </dependency>
   <dependency>
        <groupId>com.oracle</groupId>
        <artifactId>ojdbc14</artifactId>
        <version>10.2.0.3.0</version>
   </dependency>

3.selenium与dbunit结合进行与数据库相关的测试,主要实现过程包括创建与数据库操作相关的测试脚本,创建测试用例的测试脚本和创建测试数据。
创建与数据库操作相关的测试脚本过程如下:
(1)用来取得dbunit用的数据库连接。
(2)用来在运行测试脚本前,设置数据库的初始数据。
(3)用来在测试用例运行后,设置数据库的测试后的数据。
(4)用来在断言测试用例执行后,断言测试实际数据和测试预期数据,一般判断测试用例的测试正确性。
   /**
     * 取得DbUnit用的数据库连接数据库连接
     */
    public IDatabaseConnection getConnection() throws Exception {
        Class driverClass = Class.forName("oracle.jdbc.driver.OracleDriver");
        Connection jdbcConnection = DriverManager.getConnection("jdbcracle:thin192.168.71.52:1521:JRESSTUDIO",
                "jrestester", "jrestester");
        return new DatabaseConnection(jdbcConnection,"JRESTESTER");
    }
    /**
     * 测试前设置数据库状态以及装载初始数据
     */
    public void dbActionBeforeTest(String fileName) throws Exception {
        dataSet = new FlatXmlDataSet(new FileInputStream(this.setFilePath(fileName)));
     // 清空数据库表,然后装载初始数据到数据库表中
        DatabaseOperation.CLEAN_INSERT.execute(this.getConnection(), dataSet);
    }
    /**
     * 测试后设置数据库状态
     */
    public void dbActionAfterTest() throws Exception {
     // 删除表中的所有数据
        DatabaseOperation.DELETE_ALL.execute(this.getConnection(), dataSet);
    }
    /**
     * 断言测试实际数据和测试期望数据
     */
    public void AssertionData(String actualTableName, String getActualTableSQL, String XMLFilePath,
            String expectedTableName) throws Exception {
        ITable actualTable = null;
        // 从数据库取得测试实际数据
        if (null == getActualTableSQL) {
            // 从表中取出所有字段
            IDataSet databaseDataSet = this.getConnection().createDataSet();
            actualTable = databaseDataSet.getTable(actualTableName);
        } else {
            // 根据SQL文取得字段
            actualTable = this.getConnection().createQueryTable(actualTableName, getActualTableSQL);
        }
        // 从XML取得测试期望数据
        IDataSet expectedDataSet = new FlatXmlDataSet(new File(XMLFilePath));
        ITable expectedTable = expectedDataSet.getTable(expectedTableName);
        // 断言测试实际数据和测试期望数据
        Assertion.assertEquals(expectedTable, actualTable);
    }

创建测试用例的测试脚本过程如下:
(1)       // 测试前,装载初始数据
  dbAction.dbActionBeforeTest("testdata\\Initial.xml");  
(2)       // 断言测试实际数据和测试期望数据
        String actualTableName = "TSYS_USER";
        String getActualTableSQL = "SELECT USER_ID,USER_NAME,USER_PWD,USER_TYPE,USER_STATUS,LOCK_STATUS,CREATE_DATE,MODIFY_DATE,PASS_MODIFY_DATE,REMARK,ORG_ID FROM JRESTESTER.TSYS_USER WHERE USER_ID='00001'";
        String XMLFilePath = dbAction.setFilePath("testdata\\Expected.xml");
        String expectedTableName = "TSYS_USER";
        dbAction.AssertionData(actualTableName, getActualTableSQL, XMLFilePath, expectedTableName);
(3)      //  测试后,设置数据库数据
  dbAction.dbActionAfterTest();

4.其中Initial.xml内容为:
<?xml version="1.0" encoding="UTF-8"?>
<dataset>
<TSYS_USER USER_ID="00001" USER_NAME="test00001" USER_PWD="7e5096f694565d5549f03a360cdb2a84" USER_TYPE="0" USER_STATUS="0" LOCK_STATUS="1" CREATE_DATE="20110926" MODIFY_DATE="20111008" PASS_MODIFY_DATE="20110928"  REMARK="sdf" ORG_ID="0_000000"/>
</dataset>

Expected.xml内容为:
<?xml version="1.0" encoding="UTF-8"?>
<dataset>
  <TSYS_USER USER_ID="00001" USER_NAME="user2" USER_PWD="7e5096f694565d5549f03a360cdb2a84" USER_TYPE="0" USER_STATUS="0" LOCK_STATUS="1" CREATE_DATE="20110926" MODIFY_DATE="20111008" PASS_MODIFY_DATE="20110928" REMARK="sdf" ORG_ID="0_000000"/>
</dataset>
其中TSYS_USER是用到的表的名字,后面的是表中的字段名字。

创建xml文件时,可以把数据库表里的数据导出成该xml:
    public static void main(String[] args) throws Exception{   
        Class.forName("oracle.jdbc.driver.OracleDriver");   
        Connection jdbcConnection = DriverManager.getConnection("jdbcracle:thin192.168.71.52:1521:JRESSTUDIO",
                "jrestester", "jrestester");  
        IDatabaseConnection connection = new DatabaseConnection(jdbcConnection,"JRESTESTER");   
        QueryDataSet dataSet = new QueryDataSet(connection);   
        //将整个TSYS_USER表里的数据导出到xml文件里   
        //dataSet.addTable("TSYS_USER");   
        //将TSYS_USER表里符合条件的数据导出到xml文件里   
        dataSet.addTable("TSYS_USER","select * FROM JRESTESTER.TSYS_USER WHERE USER_ID='00001'");   
        //导出到dbunit.xml文件里   
        FlatXmlDataSet.write(dataSet,new FileOutputStream("dbunit.xml"));   
    }

TAG: Selenium selenium

 

评分:0

我来说两句

Open Toolbar