jbpm用戶指南翻譯:第18章 工作流TDD(測試驅動開發)

 
第18章 工作流TDD(測試驅動開發)
18.1 工作流TDD簡介
因爲面向流程的軟件開發與其它軟件沒有什麼不同,所以我們認爲流程定義應該可以被容易的測試。本章將向你展示怎樣用平常的JUnit對所創建的流程定義進行單元測試,而不需要做任何擴展。
開發週期應該儘可能的短,對軟件源碼的修改應該立即被驗證,最好沒有任何中間的構造步驟。下面的示例將向你展示怎樣開發和測試jBPM流程而沒有中間步驟。
通常流程定義的單元測試是執行一個場景,每個場景在JUnit的測試方法中被執行,並且將外部的觸發(請閱讀:信號,即signal)傳回到流程執行中,然後在每個信號之後驗證流程是否處於所預期的狀態。
讓我們看這樣一個測試例子,我們使用拍賣流程的一個簡化版本,如下圖形表示:
18.1拍賣測試流程
現在,讓我們寫一個執行主場景的測試:
public class AuctionTest extends TestCase {
 
 // 解析流程定義
 static ProcessDefinition auctionProcess =
      ProcessDefinition.parseParResource("org/jbpm/tdd/auction.par");
 
 // 獲取節點,用於以後的斷言
 static StartState start = auctionProcess.getStartState();
 static State auction = (State) auctionProcess.getNode("auction");
 static EndState end = (EndState) auctionProcess.getNode("end");
 
 // 流程實例
 ProcessInstance processInstance;
 
 // 執行主路徑
 Token token;
 
 public void setUp() {
    // 爲給定的流程定義創建一個新的流程實例
    processInstance = new ProcessInstance(auctionProcess);
 
    // 執行的主路徑爲根令牌
    token = processInstance.getRootToken();
 }
 
 public void testMainScenario() {
    // 流程實例創建後,執行主路徑位於開始狀態
    assertSame(start, token.getNode());
   
    token.signal();
   
    // 信號後,執行主路徑轉移到aution狀態
    assertSame(auction, token.getNode());
   
    token.signal();
   
    // 信號後,執行主路徑移到結束狀態,且流程結束
    assertSame(end, token.getNode());
    assertTrue(processInstance.hasEnded());
 }
}
 
18.2 XML源
在開始寫執行場景之前,你需要一個流程定義,獲取一個流程定義對象最簡單的方式是通過解析xml。如果你的編寫環境有代碼完成(code completion)功能,鍵入ProcessDefinition.parse並激活代碼完成功能,然後你會獲得多個解析方法,主要有三種方式去編寫可被解析到一個ProcessDefinition對象的xml:
18.2.1 解析流程檔案
流程檔案是一個zip文件,它包含一個有流程XML置於其中的名爲processdefinition.xml的文件,jBPM流程設計器讀取和編寫流程檔案。例如:
...
static ProcessDefinition auctionProcess =
    ProcessDefinition.parseParResource("org/jbpm/tdd/auction.par");
...
 
18.2.2 解析xml文件
在其它情況下,你可能手工寫processdefinition.xml文件,然後使用如ant腳本方式來打包zip文件。這種情況下,你可以使用JpdlXmlReader。
...
static ProcessDefinition auctionProcess =
    ProcessDefinition.parseXmlResource("org/jbpm/tdd/auction.xml");
...
 
18.2.3 解析xml字符串
最簡單的選擇是在單元測試中從一個普通字符串解析xml。
...
static ProcessDefinition auctionProcess =
    ProcessDefinition.parseXmlString(
 "<process-definition>" +
 " <start-state name='start'>" +
 "    <transition to='auction'/>" +
 " </start-state>" +
 " <state name='auction'>" +
 "    <transition to='end'/>" +
 " </state>" +
 " <end-state name='end'/>" +
 "</process-definition>");
...
 
18.3 測試子流程
TODO(請看test/java/org/jbpm/graph/exe/ProcessStateTest.java 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章