如何测试预定流程?
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 节点的调度程序将启动一个流程(通过合约调度逻辑)预计现在或过去完成。这为您提供了两种检查流程完成的方法。
- 设置流量立即调度,然后查看
节点的新消费状态数据库,具有您期望的属性
看看。
- 启动流程并将平台时钟(在测试设置中)移动到
预定流程完成的时间,然后检查
州。
样本:
// 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 ...
}
附加参考:
我正在使用模拟网络来测试预定流程,但我无法跟踪给出的结果,因为它不像使用 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
。此流程创建一个计划状态,一秒钟后将创建一个事务,创建另一个计划状态,依此类推。这意味着 运行ningStartHeartbeatFlow
导致每秒发生一个新事务,直到节点关闭 - 我们等待 5.5 秒。这足以让另外五笔交易发生
- 我们检查保险库中现在有六笔交易
使用此方法时,必须确保使用 threadPerNode = true
初始化 MockNetwork
,否则线程休眠将阻塞所有网络 activity。
测试计划流的另一个方面是使用参数对流进行计时以调节流。 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 ...
}
附加参考: