Corda 如何测试计划流?

Corda 如何测试计划流?,corda,Corda,我正在使用模拟网络来测试计划流,但我无法跟踪给定的结果,因为它不会像使用node.services.startFlow…那样作为将来返回 我已经尝试过心跳示例中所述的方法: val recordedTxs = node.database.transaction { val (recordedTxs, futureTxs) = node.services.validatedTransactions.track() futureTxs.notUsed() recordedTxs } 我

我正在使用模拟网络来测试计划流,但我无法跟踪给定的结果,因为它不会像使用node.services.startFlow…那样作为将来返回

我已经尝试过心跳示例中所述的方法:

val recordedTxs = node.database.transaction {
  val (recordedTxs, futureTxs) = node.services.validatedTransactions.track()
  futureTxs.notUsed()
  recordedTxs
}
我已经在recordedTxs中列出了内容,而由计划流加载的内容没有出现。我也订阅了futureTxs,但没有observable的更新

还有其他方法吗


谢谢

您可以按如下方式测试计划状态:

调用创建计划活动的流 睡眠时间足够长,以使计划的活动发生 检查计划的活动是否已发生 例如,请参见Heartbeat示例中的流测试:

在本测试中,我们进行如下操作:

我们运行StartHeartbeatFlow。此流创建一个计划状态,一秒钟后将创建一个事务并创建另一个计划状态,依此类推。这意味着运行StartHeartbeatFlow会导致每秒发生一个新事务,直到节点关闭 我们等了5.5秒。这足够长,可以再进行五次交易 我们检查保险库中现在有六笔交易
使用此方法时,必须确保使用threadPerNode=true初始化MockNetwork,否则在线程上睡眠将阻止所有网络活动。

您可以按如下方式测试计划状态:

调用创建计划活动的流 睡眠时间足够长,以使计划的活动发生 检查计划的活动是否已发生 例如,请参见Heartbeat示例中的流测试:

在本测试中,我们进行如下操作:

我们运行StartHeartbeatFlow。此流创建一个计划状态,一秒钟后将创建一个事务并创建另一个计划状态,依此类推。这意味着运行StartHeartbeatFlow会导致每秒发生一个新事务,直到节点关闭 我们等了5.5秒。这足够长,可以再进行五次交易 我们检查保险库中现在有六笔交易
使用此方法时,必须确保使用threadPerNode=true初始化MockNetwork,否则在线程上睡眠将阻止所有网络活动。

测试计划流的另一个方面是使用参数对流计时以调节它。corda节点的调度程序将启动一个流程,该流程由契约调度逻辑启动,该逻辑预期在现在或过去完成。这为您提供了两种检查流完成情况的方法

设置要立即调度的流,然后检查 节点的数据库,用于具有您期望的属性的新消耗状态 看看。 启动流程并将测试设置中的平台时钟移动到 计划流完成并检查的时间 国家。 样本:

// Set up the network as:  
net: MockNetwork = MockNetwork(threadPerNode = true)
// Logic to set up nodes 
...
net.startNodes()

// Additional set up 
... 
val scheduledFlow = SimpleScheduledFlow(parameterForImmediateScheduling)
testNode.services.startFlow(scheduledFlow)
net.waitQuiescent()

node.database.transaction {
    // Check validated transactions ...
    // Checks on the states newly produced by the flow ...
}
或者

val scheduledFlow = SimpleScheduledFlow(parameterForLaterScheduling)
testNode.services.startFlow(scheduledFlow)
(node.internals.platformClock as TestClock).setTo(valueDate.atTime(LocalTime.MIDNIGHT).plusSeconds(1).toInstant(ZoneOffset.UTC))
net.waitQuiescent()

node.database.transaction {
    // Check validated transactions ...
    // Checks on the states newly produced by the flow ...
}
附加参考:


测试计划流的另一个方面是通过使用参数对流进行计时来调节它。corda节点的调度程序将启动一个流程,该流程由契约调度逻辑启动,该逻辑预期在现在或过去完成。这为您提供了两种检查流完成情况的方法

设置要立即调度的流,然后检查 节点的数据库,用于具有您期望的属性的新消耗状态 看看。 启动流程并将测试设置中的平台时钟移动到 计划流完成并检查的时间 国家。 样本:

// Set up the network as:  
net: MockNetwork = MockNetwork(threadPerNode = true)
// Logic to set up nodes 
...
net.startNodes()

// Additional set up 
... 
val scheduledFlow = SimpleScheduledFlow(parameterForImmediateScheduling)
testNode.services.startFlow(scheduledFlow)
net.waitQuiescent()

node.database.transaction {
    // Check validated transactions ...
    // Checks on the states newly produced by the flow ...
}
或者

val scheduledFlow = SimpleScheduledFlow(parameterForLaterScheduling)
testNode.services.startFlow(scheduledFlow)
(node.internals.platformClock as TestClock).setTo(valueDate.atTime(LocalTime.MIDNIGHT).plusSeconds(1).toInstant(ZoneOffset.UTC))
net.waitQuiescent()

node.database.transaction {
    // Check validated transactions ...
    // Checks on the states newly produced by the flow ...
}
附加参考:


这是一个很好的答案。我忘记了等待静止和手动设置平台时钟!3.X版本中是否有此建议?我没能找到它:这是一个很好的答案。我忘记了等待静止和手动设置平台时钟!3.X版本中是否有此建议?我没能找到它: