Node-REDでフローをテストするためにnode-red-contrib-flow-asserterというノードを作りました。
機能を追加して、そこそこ満足してきたので記事を書いてみました。
このノードには、
- Node-REDエディタ上でフローのテストを実行できる
- 複数のテストケースを作成してボタンクリック1回でまとめてテストできる
- テスト実行中は値を検証したい位置以降にはメッセージが流れない
という特徴があります。
フローのテストは面倒だった
Node-REDはご存知の通りにノードをマウス操作で繋ぎ、設定を行なうだけで簡単にプログラム(フロー)を作ることができます。フローが単純な場合はそのまま使い始めますが、複雑になるとフローの動作をテストすると思います。
ここで問題になるのは、フロー作成の簡単さに比べるとテストは面倒くさいということです。
テストの際、私はテスト用のInjectノードとDebugノードをフローに追加し、ボタンを押してはデバッグサイドバーで値を確認していました。
また、フローの一部をテストしたい場合、不必要なフローを実行したくない場合にはノード間のワイヤーをテスト中に付け替えることもしていました。
さらに、いったん使い始めてからフローのリファクタを行なった場合、再度全ての値でテストを繰り返していました。
このように、Node-REDではフローをテストしようとすると非常に煩わしいことになっていました。
node-red-contrib-flow-asserterという解決策
このようなテストの煩わしさを解決するため、node-red-contrib-flow-asserterを作成しました。
このモジュールにはFlow-asserter inノード(ボタン付きのノード)とFlow-asserter outノード(入力ポートと出力ポートが1つずつあるノード)という2つのノードが含まれています。
Flow-asserter inノード
テストケースを設定するためのノードです。
テストケースには入力値(Input)、検証方法とその検証で比較する値を指定します。
検証方法は==
のような一般的な演算子やequals
、あとはSwitchノードで使える比較演算子です。
上図では見切れていて表示されていませんが、このノードのテストケースの値を検証する位置、つまりFlow-asserter outノードを指定する必要があります。
ボタンはクリックすることでテストを開始できます。テスト実行時の動作は後述してあります。
出力ポートは2つあります。
上側はテスト実行時にテストケースのInputに記述した値がペイロードに代入されてメッセージが送出されます。
下側のポートはテストケースの検証結果が送出されます。
Flow-asserter outノード
編集ダイアログを開いて設定することはありません。
テストにおいてメッセージの値を検証したいフロー位置に挿入しておき、Flow-asserter inノードで指定します。
このノードにたどり着いたときにmsg.payload
をFlow-asserter inノードで設定した検証方法と検証用の値で比較が行なわれます。
フローでのメッセージの流れ
このフローの作成過程はGitHubのREADMEに記載してあります。
テスト実行時
- Flow-asserter inノードのボタンをクリックすることでテストが実行され、テストケースの入力値がペイロードに代入されたメッセージオブジェクトが上側のポートから送出されます。
- メッセージはDelayノード、Functionノードを介してFlow-asserter outノードに到達します。
- すると、Flow-asserter outノードはメッセージを自身の出力ポートに繋がっているDebugノードに送らず、代わりに値を検証します。
- 検証結果はFlow-asserter inノードの下側のポートから送られます。
テストではない時
- テスト以外で実行した場合(Injectノードのボタンを押した場合)、Delayノード、Functionノードを介してFlow-asserter outノードに到達します。
- しかし、このノードでは値の検証は実施せず、直後のDebugノードにメッセージをそのまま送出します。
おわりに
Node-REDのフローのテストを簡単にするnode-red-contrib-flow-asserterというノードの特徴とその簡単な使い方と挙動を紹介しました。
説明不足は否めませんが、GitHubには日本語のREADMEもあるので是非参考にしてもらい、Node-RED上で利用していただけると嬉しいです。