本来打算迁移一下OSworkflow的核心部分,前几天从网上发现了JJ已经迁移好的DotNetTools workflow,还有已经翻译的部分文档,省了很多时间,在这里谢谢jjx。

下面的文字转自jjx的文档,关于DotNetTools workflow的更多信息,请参见http://www.gotdotnet.com/workspaces/workspace.aspx?id=6666274d-a3e5-4e7b-b0cb-368dbb2c4bca

下面是测试介绍:

在一个快速开发环境中,最简单的方法就是写一个测试案例。通过测试案例调用工作流,根据校验结果和捕捉可能发生的错误,来保证流程定义的正确性。

我们假设你已经熟悉Junit和了解怎样编写测试案例。如果你对这些知识还不了解的话,可以去JUnit的网站查找、阅读相关文档。编写测试案例会成为你的一个非常有用的工具。

在开始载入流程定义、调用动作以前,我们需要配置OSWorkflow的数据存储方式和定义文件的位置等。

h3 配置 osworkflow.xml

我们需要创建的第一个文件是 osworkflow.xml。下面是一个简单的例子:

<osworkflow>
  <persistence class="com.opensymphony.workflow.spi.memory.MemoryWorkflowStore"/>
  <factory class="com.opensymphony.workflow.loader.XMLWorkflowFactory">
    <property key="resource" value="workflows.xml" />
  </factory> 
</osworkflow>

这个例子指明了我们准备使用内存 (MemoryWorkflowStore) 来保存流程数据。这样可以减少设置数据库的相关信息,减少出问题的可能性。用内存持久化对于测试来说是非常方便的。

h3 Workflow factories

上面的配置文件还指明了我们工作流工厂(XMLWorkflowFactory),工作流工厂的主要功能是管理流程定义文件,包括读取定义文件和修改定义文件的功能。通过'resource'这个属性指明了采用通过从classpath中读取流程定义文件的方式,按照这个定义,接下来我们需要在classpath中创建一个名为workflows.xml的文件。

workflows.xml 的内容:

<workflows>
  <workflow name="mytest" type="resource" location="myworkflow.xml"/>
</workflows>

我们把 myworkflow.xml 和workflows.xml放在同一目录,这样它就能够被工作流工厂读取了。

这样就完成了配置,接下来是初始化一个流程并调用它。

h3 Initialising OSWorkflow

OSWorkflow 的调用模式相当简单:通过一个主要的接口来执行大部分操作。这个接口就是 Workflow interface,及其扩展 AbstractWorkflow 的实现,例如EJBWorkflow 和 SOAPWorkflow. 为了简单起见,我们使用最基本的一种: BasicWorkflow。

首先,我们来创建Workflow。在实际项目中,这个对象应该被放在一个全局的位置上以供重用,因为每次都创建一个新的Workflow对象是需要耗费比较昂贵的系统资源。在这里的例子,我们采用BasicWorkflow,它的构建器由一个当前调用者的用户名构成,当然我们很少看到单用户的工作流应用,可以参考其他的Workflow实现有不同的方式去获得当前调用者。

为了简单起见,我们采用BasicWorkflow来创建一个单一的用户模式,避免编写其他获取用户方法的麻烦。

这样我们来创建一个'testuser'调用的workflow:

Workflow workflow = new BasicWorkflow("testuser");

下一步是提供配置文件,在大多数情况下,只是简单的传递一个DefaultConfiguration实例:

DefaultConfiguration config = new DefaultConfiguration();
workflow.setConfiguration(config);

现在我们已经创建并且配置好了一个workflow,接下来就是开始调用它了。
h3 启动和进行一个工作流程

首先我们需要调用initialize 方法来启动一个工作流程,这个方法有3个参数,workflow name (定义在workflows.xml里,通过workflow factory处理), action ID (我们要调用的初始化动作的ID),和初始化变量。 因为在例子里面不需初始化变量,所以我们只是传递一个null,

long workflowId = workflow.initialize("mytest", 1, null);

我们现在已经有了一个工作流实例,返回的workflowId可以在后续的操作中来代表这个实例。这个参数会在Workflow interface的绝大部分方法中用到。

h4 检验工作流

现在让我们来检验启动的工作流实例是否按照我们所预期的那样运行。根据流程定义,我们期望的当前步骤是第一步,而且应该可以执行第一个动作(开始编写草稿)。

Collection currentSteps = workflow.getCurrentSteps(workflowId);
//校验只有一个当前步骤
assertEquals("Unexpected number of current steps", 1, currentSteps.size());
//校验这个步骤是1
Step currentStep = (Step)currentSteps.iterator().next();
assertEquals("Unexpected current step", 1, currentStep.getStepId());

int[] availableActions = workflow.getAvailableActions(workflowId);
//校验只有一个可执行的动作
assertEquals("Unexpected number of available actions", 1, availableActions.length);
//校验这个步骤是1
assertEquals("Unexpected available action", 1, availableActions[0]);

h4 执行动作

现在已经校验完了工作流实例正如我们所期望的到了第一个步骤,让我们来开始执行第一个动作:

workflow.doAction(workflowId, 1, null);

这是简单的调用第一个动作,工作流引擎根据指定的条件,改变状态到‘Underway’,并且保持在当前步骤。

现在我们可以类似地调用第2个动作,它所需要的条件已经都满足了。

在调用完第2个动作以后,根据流程定义就没有可用的动作了,getAvailableActions将会返回一个空数组。

Congratulations, 你已经完成了一个工作流定义并且成功地调用了它。下一节我们将会讲解osworkflow一些更深入的概念。

我们假设你已经熟悉Junit和了解怎样编写测试案例。如果你对这些知识还不了解的话,可以去JUnit的网站查找、阅读相关文档。编写测试案例会成为你的一个非常有用的工具。

在开始载入流程定义、调用动作以前,我们需要配置OSWorkflow的数据存储方式和定义文件的位置等。

h3 配置 osworkflow.xml

我们需要创建的第一个文件是 osworkflow.xml。下面是一个简单的例子:

<osworkflow>
  <persistence class="com.opensymphony.workflow.spi.memory.MemoryWorkflowStore"/>
  <factory class="com.opensymphony.workflow.loader.XMLWorkflowFactory">
    <property key="resource" value="workflows.xml" />
  </factory> 
</osworkflow>

这个例子指明了我们准备使用内存 (MemoryWorkflowStore) 来保存流程数据。这样可以减少设置数据库的相关信息,减少出问题的可能性。用内存持久化对于测试来说是非常方便的。

h3 Workflow factories

上面的配置文件还指明了我们工作流工厂(XMLWorkflowFactory),工作流工厂的主要功能是管理流程定义文件,包括读取定义文件和修改定义文件的功能。通过'resource'这个属性指明了采用通过从classpath中读取流程定义文件的方式,按照这个定义,接下来我们需要在classpath中创建一个名为workflows.xml的文件。

workflows.xml 的内容:

<workflows>
  <workflow name="mytest" type="resource" location="myworkflow.xml"/>
</workflows>

我们把 myworkflow.xml 和workflows.xml放在同一目录,这样它就能够被工作流工厂读取了。

这样就完成了配置,接下来是初始化一个流程并调用它。

h3 Initialising OSWorkflow

OSWorkflow 的调用模式相当简单:通过一个主要的接口来执行大部分操作。这个接口就是 Workflow interface,及其扩展 AbstractWorkflow 的实现,例如EJBWorkflow 和 SOAPWorkflow. 为了简单起见,我们使用最基本的一种: BasicWorkflow。

首先,我们来创建Workflow。在实际项目中,这个对象应该被放在一个全局的位置上以供重用,因为每次都创建一个新的Workflow对象是需要耗费比较昂贵的系统资源。在这里的例子,我们采用BasicWorkflow,它的构建器由一个当前调用者的用户名构成,当然我们很少看到单用户的工作流应用,可以参考其他的Workflow实现有不同的方式去获得当前调用者。

为了简单起见,我们采用BasicWorkflow来创建一个单一的用户模式,避免编写其他获取用户方法的麻烦。

这样我们来创建一个'testuser'调用的workflow:

Workflow workflow = new BasicWorkflow("testuser");

下一步是提供配置文件,在大多数情况下,只是简单的传递一个DefaultConfiguration实例:

DefaultConfiguration config = new DefaultConfiguration();
workflow.setConfiguration(config);

现在我们已经创建并且配置好了一个workflow,接下来就是开始调用它了。
h3 启动和进行一个工作流程

首先我们需要调用initialize 方法来启动一个工作流程,这个方法有3个参数,workflow name (定义在workflows.xml里,通过workflow factory处理), action ID (我们要调用的初始化动作的ID),和初始化变量。 因为在例子里面不需初始化变量,所以我们只是传递一个null,

long workflowId = workflow.initialize("mytest", 1, null);

我们现在已经有了一个工作流实例,返回的workflowId可以在后续的操作中来代表这个实例。这个参数会在Workflow interface的绝大部分方法中用到。

h4 检验工作流

现在让我们来检验启动的工作流实例是否按照我们所预期的那样运行。根据流程定义,我们期望的当前步骤是第一步,而且应该可以执行第一个动作(开始编写草稿)。

Collection currentSteps = workflow.getCurrentSteps(workflowId);
//校验只有一个当前步骤
assertEquals("Unexpected number of current steps", 1, currentSteps.size());
//校验这个步骤是1
Step currentStep = (Step)currentSteps.iterator().next();
assertEquals("Unexpected current step", 1, currentStep.getStepId());

int[] availableActions = workflow.getAvailableActions(workflowId);
//校验只有一个可执行的动作
assertEquals("Unexpected number of available actions", 1, availableActions.length);
//校验这个步骤是1
assertEquals("Unexpected available action", 1, availableActions[0]);

h4 执行动作

现在已经校验完了工作流实例正如我们所期望的到了第一个步骤,让我们来开始执行第一个动作:

workflow.doAction(workflowId, 1, null);

这是简单的调用第一个动作,工作流引擎根据指定的条件,改变状态到‘Underway’,并且保持在当前步骤。

现在我们可以类似地调用第2个动作,它所需要的条件已经都满足了。

在调用完第2个动作以后,根据流程定义就没有可用的动作了,getAvailableActions将会返回一个空数组。

Congratulations, 你已经完成了一个工作流定义并且成功地调用了它。下一节我们将会讲解osworkflow一些更深入的概念。

我们假设你已经熟悉Junit和了解怎样编写测试案例。如果你对这些知识还不了解的话,可以去JUnit的网站查找、阅读相关文档。编写测试案例会成为你的一个非常有用的工具。

在开始载入流程定义、调用动作以前,我们需要配置OSWorkflow的数据存储方式和定义文件的位置等。

h3 配置 osworkflow.xml

我们需要创建的第一个文件是 osworkflow.xml。下面是一个简单的例子:

<osworkflow>
  <persistence class="com.opensymphony.workflow.spi.memory.MemoryWorkflowStore"/>
  <factory class="com.opensymphony.workflow.loader.XMLWorkflowFactory">
    <property key="resource" value="workflows.xml" />
  </factory> 
</osworkflow>

这个例子指明了我们准备使用内存 (MemoryWorkflowStore) 来保存流程数据。这样可以减少设置数据库的相关信息,减少出问题的可能性。用内存持久化对于测试来说是非常方便的。

h3 Workflow factories

上面的配置文件还指明了我们工作流工厂(XMLWorkflowFactory),工作流工厂的主要功能是管理流程定义文件,包括读取定义文件和修改定义文件的功能。通过'resource'这个属性指明了采用通过从classpath中读取流程定义文件的方式,按照这个定义,接下来我们需要在classpath中创建一个名为workflows.xml的文件。

workflows.xml 的内容:

<workflows>
  <workflow name="mytest" type="resource" location="myworkflow.xml"/>
</workflows>

我们把 myworkflow.xml 和workflows.xml放在同一目录,这样它就能够被工作流工厂读取了。

这样就完成了配置,接下来是初始化一个流程并调用它。

h3 Initialising OSWorkflow

OSWorkflow 的调用模式相当简单:通过一个主要的接口来执行大部分操作。这个接口就是 Workflow interface,及其扩展 AbstractWorkflow 的实现,例如EJBWorkflow 和 SOAPWorkflow. 为了简单起见,我们使用最基本的一种: BasicWorkflow。

首先,我们来创建Workflow。在实际项目中,这个对象应该被放在一个全局的位置上以供重用,因为每次都创建一个新的Workflow对象是需要耗费比较昂贵的系统资源。在这里的例子,我们采用BasicWorkflow,它的构建器由一个当前调用者的用户名构成,当然我们很少看到单用户的工作流应用,可以参考其他的Workflow实现有不同的方式去获得当前调用者。

为了简单起见,我们采用BasicWorkflow来创建一个单一的用户模式,避免编写其他获取用户方法的麻烦。

这样我们来创建一个'testuser'调用的workflow:

Workflow workflow = new BasicWorkflow("testuser");

下一步是提供配置文件,在大多数情况下,只是简单的传递一个DefaultConfiguration实例:

DefaultConfiguration config = new DefaultConfiguration();
workflow.setConfiguration(config);

现在我们已经创建并且配置好了一个workflow,接下来就是开始调用它了。
h3 启动和进行一个工作流程

首先我们需要调用initialize 方法来启动一个工作流程,这个方法有3个参数,workflow name (定义在workflows.xml里,通过workflow factory处理), action ID (我们要调用的初始化动作的ID),和初始化变量。 因为在例子里面不需初始化变量,所以我们只是传递一个null,

long workflowId = workflow.initialize("mytest", 1, null);

我们现在已经有了一个工作流实例,返回的workflowId可以在后续的操作中来代表这个实例。这个参数会在Workflow interface的绝大部分方法中用到。

h4 检验工作流

现在让我们来检验启动的工作流实例是否按照我们所预期的那样运行。根据流程定义,我们期望的当前步骤是第一步,而且应该可以执行第一个动作(开始编写草稿)。

Collection currentSteps = workflow.getCurrentSteps(workflowId);
//校验只有一个当前步骤
assertEquals("Unexpected number of current steps", 1, currentSteps.size());
//校验这个步骤是1
Step currentStep = (Step)currentSteps.iterator().next();
assertEquals("Unexpected current step", 1, currentStep.getStepId());

int[] availableActions = workflow.getAvailableActions(workflowId);
//校验只有一个可执行的动作
assertEquals("Unexpected number of available actions", 1, availableActions.length);
//校验这个步骤是1
assertEquals("Unexpected available action", 1, availableActions[0]);

h4 执行动作

现在已经校验完了工作流实例正如我们所期望的到了第一个步骤,让我们来开始执行第一个动作:

workflow.doAction(workflowId, 1, null);

这是简单的调用第一个动作,工作流引擎根据指定的条件,改变状态到‘Underway’,并且保持在当前步骤。

现在我们可以类似地调用第2个动作,它所需要的条件已经都满足了。

在调用完第2个动作以后,根据流程定义就没有可用的动作了,getAvailableActions将会返回一个空数组。

Congratulations, 你已经完成了一个工作流定义并且成功地调用了它。下一节我们将会讲解osworkflow一些更深入的概念。

我们假设你已经熟悉Junit和了解怎样编写测试案例。如果你对这些知识还不了解的话,可以去JUnit的网站查找、阅读相关文档。编写测试案例会成为你的一个非常有用的工具。

在开始载入流程定义、调用动作以前,我们需要配置OSWorkflow的数据存储方式和定义文件的位置等。

h3 配置 osworkflow.xml

我们需要创建的第一个文件是 osworkflow.xml。下面是一个简单的例子:

<osworkflow>
  <persistence class="com.opensymphony.workflow.spi.memory.MemoryWorkflowStore"/>
  <factory class="com.opensymphony.workflow.loader.XMLWorkflowFactory">
    <property key="resource" value="workflows.xml" />
  </factory> 
</osworkflow>

这个例子指明了我们准备使用内存 (MemoryWorkflowStore) 来保存流程数据。这样可以减少设置数据库的相关信息,减少出问题的可能性。用内存持久化对于测试来说是非常方便的。

h3 Workflow factories

上面的配置文件还指明了我们工作流工厂(XMLWorkflowFactory),工作流工厂的主要功能是管理流程定义文件,包括读取定义文件和修改定义文件的功能。通过'resource'这个属性指明了采用通过从classpath中读取流程定义文件的方式,按照这个定义,接下来我们需要在classpath中创建一个名为workflows.xml的文件。

workflows.xml 的内容:

<workflows>
  <workflow name="mytest" type="resource" location="myworkflow.xml"/>
</workflows>

我们把 myworkflow.xml 和workflows.xml放在同一目录,这样它就能够被工作流工厂读取了。

这样就完成了配置,接下来是初始化一个流程并调用它。

h3 Initialising OSWorkflow

OSWorkflow 的调用模式相当简单:通过一个主要的接口来执行大部分操作。这个接口就是 Workflow interface,及其扩展 AbstractWorkflow 的实现,例如EJBWorkflow 和 SOAPWorkflow. 为了简单起见,我们使用最基本的一种: BasicWorkflow。

首先,我们来创建Workflow。在实际项目中,这个对象应该被放在一个全局的位置上以供重用,因为每次都创建一个新的Workflow对象是需要耗费比较昂贵的系统资源。在这里的例子,我们采用BasicWorkflow,它的构建器由一个当前调用者的用户名构成,当然我们很少看到单用户的工作流应用,可以参考其他的Workflow实现有不同的方式去获得当前调用者。

为了简单起见,我们采用BasicWorkflow来创建一个单一的用户模式,避免编写其他获取用户方法的麻烦。

这样我们来创建一个'testuser'调用的workflow:

Workflow workflow = new BasicWorkflow("testuser");

下一步是提供配置文件,在大多数情况下,只是简单的传递一个DefaultConfiguration实例:

DefaultConfiguration config = new DefaultConfiguration();
workflow.setConfiguration(config);

现在我们已经创建并且配置好了一个workflow,接下来就是开始调用它了。
h3 启动和进行一个工作流程

首先我们需要调用initialize 方法来启动一个工作流程,这个方法有3个参数,workflow name (定义在workflows.xml里,通过workflow factory处理), action ID (我们要调用的初始化动作的ID),和初始化变量。 因为在例子里面不需初始化变量,所以我们只是传递一个null,

long workflowId = workflow.initialize("mytest", 1, null);

我们现在已经有了一个工作流实例,返回的workflowId可以在后续的操作中来代表这个实例。这个参数会在Workflow interface的绝大部分方法中用到。

h4 检验工作流

现在让我们来检验启动的工作流实例是否按照我们所预期的那样运行。根据流程定义,我们期望的当前步骤是第一步,而且应该可以执行第一个动作(开始编写草稿)。

Collection currentSteps = workflow.getCurrentSteps(workflowId);
//校验只有一个当前步骤
assertEquals("Unexpected number of current steps", 1, currentSteps.size());
//校验这个步骤是1
Step currentStep = (Step)currentSteps.iterator().next();
assertEquals("Unexpected current step", 1, currentStep.getStepId());

int[] availableActions = workflow.getAvailableActions(workflowId);
//校验只有一个可执行的动作
assertEquals("Unexpected number of available actions", 1, availableActions.length);
//校验这个步骤是1
assertEquals("Unexpected available action", 1, availableActions[0]);

h4 执行动作

现在已经校验完了工作流实例正如我们所期望的到了第一个步骤,让我们来开始执行第一个动作:

workflow.doAction(workflowId, 1, null);

这是简单的调用第一个动作,工作流引擎根据指定的条件,改变状态到‘Underway’,并且保持在当前步骤。

现在我们可以类似地调用第2个动作,它所需要的条件已经都满足了。

在调用完第2个动作以后,根据流程定义就没有可用的动作了,getAvailableActions将会返回一个空数组。

Congratulations, 你已经完成了一个工作流定义并且成功地调用了它。下一节我们将会讲解osworkflow一些更深入的概念。

posted on 2006-07-17 21:52  榻榻米  阅读(571)  评论(0编辑  收藏  举报