一個通用的單元測試框架的思考和設計09-實現篇-視圖操作

01)概述

基於DBunit做基於數據庫的單元測試,數據庫表的準備數據由框架負責插入和自動清理,目前數據庫中很多業務操作是基於視圖的(包括普通視圖和物理視圖),hop測試框架本身並不支持對視圖的直接插入和更新操作,因此對視圖做測試準備數據的時候,必須造出與視圖相關聯的各個表的數據,再進行測試

02)普通視圖

一般性的視圖,對這種視圖做準備數據只有找到該視圖的關聯表,利用框架提供的工具類DbunitManager造出測試數據(造的數據必須和視圖邏輯關聯),然後運行單元測試用例,這種視圖只要基礎表裏插入了數據,則視圖中會自動實時同步過來(可以把這類視圖簡單理解爲只讀視圖)。

03)物化視圖

物化視圖是oracle數據庫特有的一種視圖,首先它屬於視圖的範疇,因此滿足視圖的定義,同時,有自身的特點,就是當向物理視圖關聯的數據庫表插數據時,物理視圖裏的數據同步並不一定是實時的,爲了保證我們造的測試數據能夠實時的在物理視圖中得以體現,必須在基礎表數據插入後,對物理視圖做手動刷新-強制物理視圖同步最新數據。

使用方法

  • 準備於物化視圖相關聯的幾張基礎數據表的數據-通過dbunit xml格式,詳細參考單元測試規範章節
  • 編寫測試代碼-和先前的做法完全一致
  • 在該測試用例執行前執行物化視圖的刷新操作

public void testGetProductbyUserId() {

       String mv = "ECC_FND.PRODUCT_LINE_MV";//要進行刷新的物化視圖的名字

        refeshMaterializedView(mv );//測試用例執行前刷新一下,保證準備好的基礎數據同步到視圖中

        List<CmiAssistmodel> list=baseSeachConditionService.getProductbyUserId();//執行具體的測試

        assertThat(list.size(), equalTo(2));//斷言

    }

03)物化視圖

刷新物化視圖的操作見 void refeshMaterializedView(String materializedViewName)

/**
 * HOP測試框架的基類,定義了常用到的工具類
 * @author WangXuzheng
 * @see com.haier.openplatform.test.dbunit.XmlDatasetProviderListener
 * @see com.haier.openplatform.test.dbunit.IDatabaseTesterAware
 * @see org.springframework.test.context.transaction.TransactionalTestExecutionListener
 */
@TestExecutionListeners({ XmlDatasetProviderListener.class, TransactionalTestExecutionListener.class })
public class BaseHopTestCase extends AbstractJUnit4SpringContextTests implements IDatabaseTesterAware{
	protected IDatabaseTester databaseTester;
	@Override
	public void setIDatabaseTester(IDatabaseTester databaseTester) {
		this.databaseTester = databaseTester;
	}
	/**
	 * 利用dbunit的connection執行sql語句
	 * @param sql
	 */
	protected void executeSQL(String sql){
		Connection connection = null;
		Statement statement = null;
		try {
			connection = databaseTester.getConnection().getConnection();
			statement = connection.createStatement();
			statement.execute(sql);
		}catch (Exception e) {
			ReflectionUtils.handleReflectionException(e);
		}finally{
			closeStatement(statement);
			closeConnection(connection);
		}
	}
	/**
	 * 關閉數據庫連接
	 * @param connection
	 */
	protected void closeConnection(Connection connection) {
		if(connection != null){
			try {
				connection.close();
			} catch (SQLException e) {
				ReflectionUtils.handleReflectionException(e);
			}
		}
	}
	/**
	 * 關閉sql語句對象
	 * @param statement
	 */
	protected void closeStatement(Statement statement){
		if(statement != null){
			try {
				statement.close();
			} catch (SQLException e) {
				ReflectionUtils.handleReflectionException(e);
			}
		}
	}
	
	/**
	 * 生成默認的刷新物化視圖的sql語句--僅限於oracle
	 * @param materializedViewName 物化視圖的名字
	 * @return
	 */
	protected String generateRefeshMaterializedViewSql(String materializedViewName){
		StringBuffer stringBuffer = new StringBuffer();
		stringBuffer.append("BEGIN")
		  .append("  DBMS_SNAPSHOT.REFRESH")
		  .append("  (LIST                 => '")
		  .append(materializedViewName).append("'")
		  .append("  ,PUSH_DEFERRED_RPC    => TRUE")
		  .append("  ,REFRESH_AFTER_ERRORS => FALSE")
		  .append("  ,PURGE_OPTION         => 1")
		  .append("  ,PARALLELISM          => 0")
		  .append("  ,ATOMIC_REFRESH       => TRUE")
		  .append("  ,NESTED               => FALSE);")
		  .append("  END;");
		return stringBuffer.toString();
	}
	
	/**
	 * 刷新指定的物化視圖
	 * @param materializedViewName 物化視圖名字
	 */
	protected void refeshMaterializedView(String materializedViewName){
		executeSQL(generateRefeshMaterializedViewSql(materializedViewName));
	}
}



發佈了110 篇原創文章 · 獲贊 24 · 訪問量 48萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章