Fitnesse Slim的使用

官網上的使用說明: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類型)。從表格中的值從最左邊開始匹配返回的結果,若是該行中的第一列不匹配,則該條記錄是不匹配的,執行時候就查詢失敗

 

4.Script Table

表格

 

源碼

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是不會有返回值的,因此不能使用checkshow關鍵字

 

5.4 嵌套調用Scenario

相關文章
相關標籤/搜索