跳过主要内容

测试节点

为了确保一个节点行为符合放音乐,您可能要进行一些测试。 有多个级别的测试:

  • 单元测试: 验证一个特定函数或组件行为符合预期。

    节点是正常的可执行文件或脚本,因此您可以使用您选择的编程语言标准测试工具进行单元测试。 例如, Rust 节点您可以使用 Rust的built-in test frameworkcargo test组合。

  • [集成测试]: 验证一个节点对一组输入的预期反应和它产生预期的输出。

    Dora do not 提供自动集成测试功能。 我们计划添加一个方式,在独立的“测试模式”中运行节点,输入通过一个特殊输入文件,并且写入一个输出文件至输出。 这将使节点的集成测试成为可能,因为您可以验证每个节点对给定输出的反应是否符合预期。

    然而,Dora 节点可以在单独的 _"交互模式"_中运行,在这里输入是通过命令行提供的。 此功能有助于手动集成测试。 详细信息见 below

  • 端到端测试: 验证具有多个节点的完整数据流是否按预期工作。

    这种测试通常是手动进行的,使用 dora rundora start CLI 命令。 如果您的数据流有定义的退出条件, 您也可以通过 dora run 运行自动化测试:退出状态将报告是否发生任何错误。

交互模式

交互模式允许在独立模式下启动一个节点,提示输入终端。 它适用于所有使用 init_from_envinit_interactive 函数的节点。 启动交互模式,手动启动您的节点可执行文件/脚本 就像正常可执行文件一样。

这种交互模式不会连接到 dora daemon ,而是会提示终端上的节点输入。 在这种模式下,节点完全从休眠和其他节点分离出来,因此它不能成为数据流的一部分。

示例

运行任意节点使用 init_interactive 或自一个终端直接 init_from_env。 然后该节点将以“交互模式”开始,并提示您下一个输入:

> cargo build -p rust-dataflow-example-node
> target/debug/rust-dataflow-example-node
hello
Starting node in interactive mode as DORA_NODE_CONFIG env variable is not set
Node asks for next input
? Input ID
[empty input ID to stop]

rust-dataflo-example-node 需要一个 tick 输入,所以让我们把输入 ID 设置为 tick 。 Tick 消息没有任何数据,因此提示时我们留空“数据”:

Node asks for next input
> Input ID tick
> Data
tick 0, sending 0x943ed1be20c711a4
node sends output random with data: PrimitiveArray<UInt64>
[
10682205980693303716,
]
Node asks for next input
? Input ID
[empty input ID to stop]

我们看到节点的stdout 输出以及它发送的输出信息都被打印到终端。 然后我们再获得另一个提示以获取下一个输入。

如果您想要发送带有数据的输入, 您可以将其作为文本(用于字符串数据) 或作为JSON对象(用于结构数据)。 目前不支持其他数据类型。

空输入 ID 被解释为停止指令:

> Input ID
given input ID is empty -> stopping
Received stop
Node asks for next input
event channel was stopped -> returning empty event list
node reports EventStreamDropped
node reports closed outputs []
node reports OutputsDone

除了节点输出外,我们还看到节点报告的不同事件的日志消息。 在 OutputsDone 之后,节点应该退出。

JSON 数据

除了文本输入外,Data 提示也支持JSON对象,这些对象将被转换为 Apache Arrow 结构数组:

Node asks for next input
> Input ID some_input
> Data { "field_1": 42, "field_2": { "inner": "foo" } }

此 JSON 数据转换成以下 Arrow 数组:

StructArray
-- validity: [valid, ]
[
-- child 0: "field_1" (Int64)
PrimitiveArray<Int64>
[42,]
-- child 1: "field_2" (Struct([Field { name: "inner", data_type: Utf8, nullable: true, dict_id: 0, dict_is_ordered: false, metadata: {} }]))
StructArray
-- validity: [valid,]
[
-- child 0: "inner" (Utf8)
StringArray
["foo",]
]
]