您的位置:首页 > 产品设计 > 产品经理

jbpm用户指南翻译:第18章 工作流TDD(测试驱动开发)

2006-11-10 23:54 615 查看
第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)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: