官網上的使用說明:http://www.fitnesse.org/FitNesse.UserGuide.WritingAcceptanceTests.Slimhtml
本文主要介紹Slim經常使用的幾種表格,更多其餘表格的使用能夠參考官網使用手冊java
Fitnesse默認使用fit,若是要使用slim須要先聲明ide
!define TEST_SYSTEM {slim}函數
1.Decision Table測試
表格ui
源碼this
package fitnesse.slim.test;spa
public class ShouldIBuyMilk {3d
private int dollars;orm
private int pints;
private boolean creditCard;
public void setCashInWallet(int dollars) {
this.dollars = dollars;
}
public void setPintsOfMilkRemaining(int pints) {
this.pints = pints;
}
public void setCreditCard(String valid) {
creditCard = "yes".equals(valid);
}
public String goToStore() {
return (pints == 0 && (dollars > 2 || creditCard)) ? "yes" : "no";
}
// The following functions are optional. If they aren't declared they'll be ignored.
public void execute() {
}
public void reset() {
}
public void table(List<List<String>> table) {
}
public void beginTable() {
}
public void endTable() {
}
}
Table 的流程
1) 構建ShouldIBuyMilk的fixture
2) 調用table方法(若是存在)
3) 調用beginTable,(用來初始化)
4) 對於表格中的每一行的調用流程
4.1)調用reset方法,以便進行準備和清除
4.2)而後經過調用相應的set方法加載全部輸入,輸入按照從左到右的順序加載
4.3)調用execute方法
4.4)最後調用輸出的方法,比較表格中的指望值
5)調用endTable方法,清除和關閉你想要的東西
PS:表的第一行填的是類名,不分大小寫,這是最基本最經常使用的表格
2.Dynamic Decision Table
表格
源碼
public class AddUpChange {
private Integer totalCents = 0;
private static Map<String, Integer> COIN_VALUES = new HashMap<String, Integer>();
static {
COIN_VALUES.put("1c", 1);
COIN_VALUES.put("5c", 5);
COIN_VALUES.put("10c", 10);
COIN_VALUES.put("25c", 25);
COIN_VALUES.put("50c", 50);
COIN_VALUES.put("$1", 100);
}
public void reset() {
totalCents = 0;
}
public void set(String coin, Integer amount) {
if (!COIN_VALUES.containsKey(coin)) {
throw new IllegalArgumentException("Unknown coin type " + coin);
}
totalCents += amount * COIN_VALUES.get(coin);
}
public String get(String requestedValue) {
if ("$ total".equals(requestedValue)) {
return String.format(Locale.US, "%.2f", totalCents / 100.0);
}
return String.format("%d", totalCents);
}
}
dynamic decision table 基本上和decision table的語法一致,除了須要在第一行中加入ddt
沒有?的列,都會統一調用set(header,value)方法,有?的列都會統一調用get(header)方法,除此以外其餘方法的調用都跟decision table同樣(table, beginTable, reset, execute, endTable).
有#的列都是註釋的內容
3.Query Table
表格
源碼
package fitnesse.slim.test;
import java.util.Date;
import java.util.List;
import static java.util.Arrays.asList;
public class EmployeesHiredBefore {
public EmployeesHiredBefore(Date date) {
}
public void table(List<List<String>> table) {
// optional function
}
public List<List<List<String>>> query() {
return
asList( // table level
asList( // row level
asList("company number", "4808147"), // cell column name, value
asList("employee number", "1429"),
asList("first name", "Bob"),
asList("last name", "Martin"),
asList("hire date", "10-Oct-1974")
),
asList(
asList("company number", "5123122"),
asList("employee number", "8832"),
asList("first name", "James"),
asList("last name", "Grenning"),
asList("hire date", "15-Dec-1979")
)
);
}
}
第一行中須要加入Query,接下來就是構造函數的參數,每一行的標題就是字段名.Fixture類必須有一個query方法返回結果行,每一行都是由兩個元素構成,一個就是字段名,另一個就是對應的值(String類型)。從表格中的值從最左邊開始匹配返回的結果,若是該行中的第一列不匹配,則該條記錄是不匹配的,執行時候就查詢失敗
表格
源碼
public class LoginDialogDriver {
private String userName;
private String password;
private String message;
private int loginAttempts;
public LoginDialogDriver(String userName, String password) {
this.userName = userName;
this.password = password;
}
public boolean loginWithUsernameAndPassword(String userName, String password) {
loginAttempts++;
boolean result = this.userName.equals(userName) && this.password.equals(password);
if (result)
message = String.format("%s logged in.", this.userName);
else
message = String.format("%s not logged in.", this.userName);
return result;
}
public String loginMessage() {
return message;
}
public int numberOfLoginAttempts() {
return loginAttempts;
}
}
第一行Script後面跟的是類名和構造函數的參數,若是該page在script後面沒有指定fixture,則會沿用該頁面的上一個script table的fixture
Script table 調用方法能夠插入式調用,即方法和參數是相間的
也能夠連續調用,能夠在單元格方法名後面添加分號,而後緊接的單元格都是入參
4.1. 一行中若是隻包含一個方法名,那麼只有它返回的是布爾值,纔會執行的時候變成綠色或者紅色,其餘狀況不會有顏色
4.2. 若是一個變量在第一個單元格,則它後面應該跟的是方法名,該變量的值就是方法返回的值
4.3. 若是第一個單元格是check,則它後面應該跟的是方法名,最後一個單元格就是指望值
4.4. 若是第一個單元格是not check,則它後面跟的是方法名,最後一個單元格就是不但願的指望值
4.5. 若是第一個單元格是ensure,則它後面跟的是方法名,返回的布爾值若是是true就變成綠色,若是是false就變成紅色
4.6. 若是第一個單元格是reject,則它後面跟的是方法名,返回的布爾值若是是false就變成綠色,返回的布爾值若是是true就變成紅色
4.7. 若是第一個單元格是note,則在執行的時候就會忽略(空格,以#或者*開頭的都是這種效果)
4.8. 若是第一個單元格是show,則它後面跟的是方法名,當這個測試運行的時候,一個新的單元格將會被添加,顯示的是該方法的返回值
若是第一個單元格是start,它後面跟的應該是一個新的fixture和構造函數的參數,會開始一個新的actor,覆蓋上面的,它下面的script都會沿用該fixture
5.Scenario Table
Scenario Table能夠被其餘tables調用(Script table和Decision table),能夠用做封裝測試步驟。可是Scenario只能封裝Script的測試步驟,並且Script實例要先建立,而後才能調用
5.1 聲明Scenario
Scenario Table的格式跟Script table的一致,有插入式調用和連續調用
上表的第一個單元格式scenario,代表這個是scenario table.這個表格的名字是WidgetRenders,它有兩個入參,wikiText和htmlText(WidgetRenders不是調用的fixture,而是Scenario的名稱),Scenario的名稱是camel-cased並且首字母是大寫,參數也是camel-cased,並且首字母是小寫
Scenario也能夠用下劃線聲明,第二個單元格表明名稱,第三個單元格表明參數,每一個下劃線表明一個參數。
Scenario中@爲前綴的都是參數(@後面的參數命名也要遵循camel-cased規則,並且首字母是小寫),若是參數比較長,也能夠使用@{the parameter}這種形式
Scenario被調用前須要先實例化它的fixture,Scenario中的方法都是來自如下fixture
5.2 Decision Table調用Scenario
Decision Table的名字轉化爲camel-cased會是WidgetRenders.若是這是一個Scenario的名字在同一個page中,那麼Scenario會被調用而不是相同名字的fixture.若是Scenario再也不該page定義,可是included中包含了,也遵循該調用規則。
在Scenario中能夠使用出參,定義
調用,在表格中新增一列名字後面添加」?」,能夠用做捕獲值和比較
構造函數參數
若是不想每次調用的時候都要賦值,能夠利用構造函數賦值
語法以下 :Scenario Name-[giving|having]-1.Variable Name-1.Variale Value-2.Variable Name-2.Variable Value-……
先確保向後兼容性構造函數參數檢查,若是他們是一個Scenario Name.那麼就沒法傳遞參數值。
5.3 Script Table調用Scenario Table
調用Scenario是不會有返回值的,因此不能使用check和show關鍵字
5.4 嵌套調用Scenario