5
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

エヌシーアイ総合システムAdvent Calendar 2019

Day 8

Node-REDのフローを簡単にテストする(ためのノードを作った)

Last updated at Posted at 2019-12-07

Node-REDでフローをテストするためにnode-red-contrib-flow-asserterというノードを作りました。
機能を追加して、そこそこ満足してきたので記事を書いてみました。

このノードには、

  • Node-REDエディタ上でフローのテストを実行できる
  • 複数のテストケースを作成してボタンクリック1回でまとめてテストできる
  • テスト実行中は値を検証したい位置以降にはメッセージが流れない

という特徴があります。

dialog.png

フローのテストは面倒だった

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)、検証方法とその検証で比較する値を指定します。

testcases.png

検証方法は==のような一般的な演算子やequals、あとはSwitchノードで使える比較演算子です。

上図では見切れていて表示されていませんが、このノードのテストケースの値を検証する位置、つまりFlow-asserter outノードを指定する必要があります。

ボタンはクリックすることでテストを開始できます。テスト実行時の動作は後述してあります。

出力ポートは2つあります。
上側はテスト実行時にテストケースのInputに記述した値がペイロードに代入されてメッセージが送出されます。
下側のポートはテストケースの検証結果が送出されます。

Flow-asserter outノード

編集ダイアログを開いて設定することはありません。
テストにおいてメッセージの値を検証したいフロー位置に挿入しておき、Flow-asserter inノードで指定します。
このノードにたどり着いたときにmsg.payloadをFlow-asserter inノードで設定した検証方法と検証用の値で比較が行なわれます。

フローでのメッセージの流れ

assertflow.png

このフローの作成過程はGitHubのREADMEに記載してあります。

テスト実行時

  1. Flow-asserter inノードのボタンをクリックすることでテストが実行され、テストケースの入力値がペイロードに代入されたメッセージオブジェクトが上側のポートから送出されます。
  2. メッセージはDelayノード、Functionノードを介してFlow-asserter outノードに到達します。
  3. すると、Flow-asserter outノードはメッセージを自身の出力ポートに繋がっているDebugノードに送らず、代わりに値を検証します。
  4. 検証結果はFlow-asserter inノードの下側のポートから送られます。

テストではない時

  1. テスト以外で実行した場合(Injectノードのボタンを押した場合)、Delayノード、Functionノードを介してFlow-asserter outノードに到達します。
  2. しかし、このノードでは値の検証は実施せず、直後のDebugノードにメッセージをそのまま送出します。

おわりに

Node-REDのフローのテストを簡単にするnode-red-contrib-flow-asserterというノードの特徴とその簡単な使い方と挙動を紹介しました。

説明不足は否めませんが、GitHubには日本語のREADMEもあるので是非参考にしてもらい、Node-RED上で利用していただけると嬉しいです。

5
4
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?