基于 JUnit 使用 Feed4JUnit 實現數據與代碼分離的測試(2)

發表于:2012-10-09來源:IBM作者:萬書吉點擊數: 標簽:junit
以文件作為數據源 Feed4JUnit 支持從 CSV 或者 Excel 文件里面讀取數據作為輸入,這里我們以 Excel 文件為例。 1. 在測試項目的根目錄下創建 Data.xls 數據文件,

  以文件作為數據源

  Feed4JUnit 支持從 CSV 或者 Excel 文件里面讀取數據作為輸入,這里我們以 Excel 文件為例。

  1. 在測試項目的根目錄下創建 Data.xls 數據文件,樣例數據如圖 3,默認情況下,第一行會以列名存在,在運行過程中不會作為數據讀取。

  圖 3. Excel 數據源

圖 3. Excel 數據源

  2. 創建測試類并在接收數據的測試方法上聲明數據源為 @Source("Data.xls"),Excel 中的數據在傳遞過程中會自動按照列與測試方法的參數的位置順序進行匹配,并以行作為一個單位讀取并傳遞給測試方法體。比如圖 3 中的 user 列的值會做為方法的第一個參數傳入方法體中,pw 列的值會作為方法的第二個參數,以此類推。在測試進行過程中,首先在 Excel 文件中讀取一行(包含三列),接著按照位置順序將數據傳遞到方法體中(每列按順序對應一個參數)進行執行,執行完成后讀取 Excel 中的下一行進行相同流程的測試,其原理與 Java 中的迭代器十分類似。請注意當數據文件中數據的列數小于測試方法參數的個數的時候,測試會因為位置不匹配而失敗。

  清單 4 包括從 CSV 和 Excel 讀取和傳遞數據的示例:

  清單 4. 文件數據源示例

				 
package sample.test;

import static org.junit.Assert.assertEquals;

import org.databene.benerator.anno.Source;
import org.databene.feed4junit.Feeder;
import org.junit.Test;
import org.junit.runner.RunWith;

import sample.code.UserAccess;

/*
 * Feed4JUnit - Get Data from CSV/Excel File source
 */

@RunWith(Feeder.class)
public class F4JfromFile {
	
	@Test
	@Source("Data.csv")//CSV source
	public void testAccessCheck_CSV(String userName, String pw, boolean expected) {
		assertEquals(expected, UserAccess.accessCheck(userName, pw));
	}
	
	@Test
	@Source("Data.xls")//Excel source
	public void testAccessCheck_Excel(String userName, String pw, boolean expected) {
		assertEquals(expected, UserAccess.accessCheck(userName, pw));
	}
}

  3. 運行測試,因為 Feed4Junit 是 JUnit 的擴展,所以運行方式與 JUnit 完全相同,即以 JUnit 運行即可,運行結果如圖 4 所示,我們可以看到,Data.xls 中的數據已全部傳入測試方法并運行。

  圖 4. 運行結果示例

圖 4. 運行結果示例

  以數據庫作為數據源

  通過使用 @Database ,您可以很方便的使用來自于數據庫的數據,這在進行大量測試數據測試的時候或者復用現有的應用業務數據作為測試數據的情況下比較有用。

  當您使用來自數據庫的數據源的時候,首先必須使用 @Database 聲明數據庫的信息 ,可以為類或方法添加 @Database 注釋 , 如果注釋類為 @Database 的時候,類中所有的方法都可以使用此數據庫的數據作為源,當聲明 @Database 于方法的時候,此類中僅此方法可以調用數據庫作為數據源。@ Database 具有一些屬性,用于聲明用于連接數據庫信息,請看一下說明:

  id: 一個用于標識數據庫數據源標識符,在測試方法的 @Source 中進行引用關聯

  url:數據庫的 URL

  driver: 數據庫的驅動

  user: 數據庫的用戶名

  password:數據庫的密碼

  完成以上數據庫的定義后,需要在測試方法的 @Source 中引用您所需要的庫,使用屬性 id 和 selector 可以完成此操作:

  id: @Source 中的 id 和 @Database 的 id 相對應關聯

  selector:SQL 語句,用于查詢出相應的數據傳遞給測試方法

  以下我們以 DB2 作為數據源,使用 DB2 的 Sample 數據庫,并創建名為 TEST 的表來存儲測試數據,測試數據與圖 3 Excel 數據源的完全相同,請看圖 5。

  圖 5. 數據表中的測試數據

圖 5. 數據表中的測試數據

  首先,創建測試類,添加 @Database 注釋并增加數據庫的連接信息,同時指定一個表示數據庫的 id,在測試方法的 @Source 中通過 id 進行關聯,并制定 selector 的語句進行數據查詢,例如本例中的 selector = "select * from TEST",會從 TEST 表中取出全部數據用于測試,細節請參考以下代碼示例:

  清單 5 為在類上聲明 @Database。

  清單 5. 在類上聲明 @Database

				 
package sample.test;

import static org.junit.Assert.assertEquals;

import org.databene.benerator.anno.Database;
import org.databene.benerator.anno.Source;
import org.databene.feed4junit.Feeder;
import org.junit.Test;
import org.junit.runner.RunWith;

import sample.code.UserAccess;

/*
 * Feed4JUnit - Get Data from Database, all test methods can use the database data
 */
@RunWith(Feeder.class)
@Database(
		id = "testdb", 
		url = "jdbc:db2://localhost:50000/SAMPLE", 
		driver = "com.ibm.db2.jcc.DB2Driver", 
		user = "db2admin", 
		password = "db2admin")
public class F4JfromDB {

	@Test
	@Source(id = "testdb", selector = "select * from TEST")
	public void testAccessCheck(String userName, String pw, String expected) {
		Boolean bSucess = UserAccess.accessCheck(userName.trim(), pw.trim());
		assertEquals(expected.trim(), bSucess.toString());

	}
}

原文轉自:http://www.anti-gravitydesign.com

国产97人人超碰caoprom_尤物国产在线一区手机播放_精品国产一区二区三_色天使久久综合给合久久97