如何测试预定流程?

How can I test a scheduled flow?

我正在使用模拟网络来测试预定流程,但我无法跟踪给出的结果,因为它不像使用 node.services.startFlow(...) 那样作为未来返回。

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

val recordedTxs = node.database.transaction {
  val (recordedTxs, futureTxs) = node.services.validatedTransactions.track()
  futureTxs.notUsed()
  recordedTxs
}

我把recordedTxs里面的内容都列出来了,没有出现定时流程加载的内容。我也订阅了 futureTxs 但没有可观察的更新。

还有其他方法吗?

谢谢

您可以按如下方式测试预定状态:

  • 调用创建预定 activity
  • 的流程
  • 睡眠足够长的时间,以便计划的 activity 发生
  • 检查预定的activity是否已经发生

例如,请参阅 Heartbeat 示例中的流量测试 (https://github.com/joeldudleyr3/heartbeat):

@Test
fun `heartbeat occurs every second`() {
    val flow = StartHeartbeatFlow()
    a.services.startFlow(flow).resultFuture

    val enoughTimeForFiveScheduledTxs: Long = 5500
    Thread.sleep(enoughTimeForFiveScheduledTxs)

    val recordedTxs = a.database.transaction {
        val (recordedTxs, futureTxs) = a.services.validatedTransactions.track()
        futureTxs.notUsed()
        recordedTxs
    }

    val originalTxPlusFiveScheduledTxs = 6
    assertEquals(originalTxPlusFiveScheduledTxs, recordedTxs.size)
}

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

  • 我们运行StartHeartbeatFlow。此流程创建一个计划状态,一秒钟后将创建一个事务,创建另一个计划状态,依此类推。这意味着 运行ning StartHeartbeatFlow 导致每秒发生一个新事务,直到节点关闭
  • 我们等待 5.5 秒。这足以让另外五笔交易发生
  • 我们检查保险库中现在有六笔交易

使用此方法时,必须确保使用 threadPerNode = true 初始化 MockNetwork,否则线程休眠将阻塞所有网络 activity。

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

  1. 设置流量立即调度,然后查看 节点的新消费状态数据库,具有您期望的属性 看看。
  2. 启动流程并将平台时钟(在测试设置中)移动到 预定流程完成的时间,然后检查 州。

样本:

// 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 ...
}

附加参考: