今天看到花花同學寫的白盒測試的白皮書,大致翻了下。感覺缺少點什么,之前也一直都在討論,測試數據與測試代碼是否需要分離,測試代碼如何建設冗余的問題。如何解決這2個問題,feed4junit是一種思路,我對比junit 4和feed4junit的功能,大致了解這些功能的實現。
對于網站的接口測試,常常面臨的一個場景:大量不同的輸入,但處理邏輯的業務不變,對其結果進行驗證也會有不同的期望值。按照之前的一些思路,往往會為每一組輸入和輸入寫一個case,達成大量的代碼冗余。
基于上面的場景,junit 4給出了參數化的特性,從而實現了不同的輸入對應相同的代碼。
待測的方法:
public class UserAccess {
// simple validation for user name and password
public static boolean accessCheck(String userName, String password) {
if (userName.length() <= 4 || userName.length() > 8 )
return false;
if (password.length() <= 4 || password.length() > 8 )
return false;
if (userName.contains("@" ))
return false;
if (password.contains("*" ))
return false;
return true;
}
}
1. 使用Junit參數化,減少代碼冗余:
測試代碼:
import java.util.Arrays;
import java.util.Collection;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;
import static org.junit.Assert.assertEquals ;
import sample.junit.code.UserAccess;
/*
* JUnit - Parameter test sample
*/
@RunWith(Parameterized.class)
public class JunitSample {
private String user ;
private String pwd ;
private boolean expected ;
@Parameters
public static Collection dataGenerate(){
return Arrays.asList( new Object[][]{
{ "user01","123456" ,true},
{ "user02","123456" ,true},
{ "user03","12345678" ,true}
});
}
public JunitSample(String user,String pwd,boolean expected){
this.user = user;
this.pwd = pwd;
this.expected = expected;
}
@Test
public void testAccessCheck(){
assertEquals(expected,UserAccess. accessCheck(user, pwd));
}
}
運行結果如下所示:
2. 數據與代碼的分離(Feed4Junit)
Feed4JUnit 是開源的測試組件,您可以從如下鏈接下載最新版本 http://sourceforge.net/projects/feed4junit/files/
Feed4JUnit 的數據源可以包括以下幾種類型 – 文件 (CSV 或者 Excel )、數據庫、自定義數據源。
基本的使用方法: Feed4JUnit 使用一個特殊的運行類 Feeder.class,用來支持與標識參數化測試,如果您想要編寫數據與代碼分離的測試腳本,必須同時滿足下面的三個條件:
1. 必須在您的測試類上增加注釋 @RunWith(Feeder.class) 。
2. 您需要使用 @Test 來標示您實現測試的方法。
3. 使用 @Source 來聲明和接收數據源的數據。
2.1. 文件數據源(excel和csv差不多)
1. 在測試項目的根目錄下創建 data.xls 和data.csv數據文件,第一行會以列名存在,在運行過程中不會作為數據讀取。
2. 創建測試類并在接收數據的測試方法上聲明數據源為 @Source("Data.xls"),Excel 中的數據在傳遞過程中會自動按照列與測試方法的參數的位置順序進行匹配,并以行作為一個單位讀取并傳遞給測試方法體。比如上圖中的 user 列的值會做為方法的第一個參數傳入方法體中,pw 列的值會作為方法的第二個參數,以此類推。在測試進行過程中,首先在 Excel 文件中讀取一行(包含三列),接著按照位置順序將數據傳遞到方法體中(每列按順序對應一個參數)進行執行,執行完成后讀取 Excel 中的下一行進行相同流程的測試,其原理與 Java 中的迭代器十分類似。請注意當數據文件中數據的列數小于測試方法參數的個數的時候,測試會因為位置不匹配而失敗。
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.junit.code.*;
@RunWith (Feeder.class )
public class Feed4junitSample {
@Test
@Source( "Data.csv" )//CSV source
public void testAccessCheck_CSV(String userName, String pw, boolean expected) {
assertEquals(expected, UserAccess. accessCheck(userName, pw));
}
@Test
原文轉自:http://www.wangyuxiong.com/archives/51662