OutSystemsの自動化されたユニットテスト

OutSystemsで自動化されたユニットテストを作成する方法についてまとめてみます。

これまで、Client Actionのユニットテストを作れない問題があったのですが、最近BDDFramework Client SideというコンポーネントがForgeに公開されて解決しました。

開発要素ごとのテスト方法

Server Action

サーバサイドで動くロジックを作る要素。

テストはBDDFrameworkで行う。

Service Action

サーバサイドで動くロジックを作る要素。

ただし、作ったロジックは疑似的なマイクロサービスとして動作し、トランザクションは呼び出し元と分離される。呼び出し時には内部的にREST通信が行われる。

Service Actionに関して以前書いた記事:

Service Actionをユニットテストするなら、BDDFramework。

ただし、トランザクションがテストと分離するため、Teardownでロールバックするときなどは注意が必要。

REST API

これもサーバサイドで動くロジックを作る要素。

Service Actionと立ち位置は似ている。

大きな違いとして、独立性の高いサービスを、

  • 同じOutSystems環境内に提供したい⇒Service Action
  • 外部環境に提供したい⇒REST

という使い分けです。

よって、ユニットテストするならBDDFramework。トランザクションについての注意点はService Actionと同じ。

ただし、REST APIの設計として、処理のほとんどを独立したServer Actionで実装し、REST APIはそのActionに処理を任せる、という方式があります。この方法をとるときは、ユニットテストレベルではServer Actionの方だけを対象にするのもありですね。

Client Action

Reactive Web App/Mobile Appにある要素で、クライアント側で動作するAction。

実行時にはJavaScriptとして動作する。

OutSystemsバージョン10でモバイルアプリ開発が可能になって以来、この種類の要素はユニットテストできませんでした。しかし、最近公開されたBDDFramework Client Sideというコンポーネントによって可能になりました。

Block・Screen

私が日本で経験したシステム開発では、画面の単体テスト、という工程が含まれていることが多かったので含めてあります。

BlockはUI部品で単独では動作せず、他の画面に配置して使います。

Screen ActionはBDDFrameworkの対象ではないし、UIについてはブラウザに表示して初めて本当のテストができるので、UIテストツールでテストすることになりますね。

Process・Timer

OutSystemsでバッチやワークフローを作る要素。

どちらも要素を構成するActionに対するユニットテストをBDDFrameworkで作成することになると思います。

バッチなので、これらの単位でテストするときは結合テストなどと呼ばれるはず。

ユニットテスト実施方法

BDDFramework

Forgeのプロジェクトページ:BDDFramework

OutSystemsが現在推奨しているユニットテスト用ツール。

本来は、BDD(Behavior Driven Development)に基づいてテストを行うためのもの。

このモジュールはTraditional Webでテストケースを作成するため、Client Actionはテスト対象にできません。

このモジュールの使い方について以前書いた記事:

BDDFramework Client Side

Forgeのプロジェクトページ:BDDFramework Client Side

もともとあった、サーバー処理専用のBDDFrameworkがカバーしていなかった、Client Actionを対象とするテストツール。

ブロックや画面テンプレート、APIの構造がBDDFrameworkとそろえられているので同じように使える。

使い方については、以前書いたチュートリアルをご覧ください。

UIテストツール

特定のツールが推奨されているということはないので、使い慣れているものがあれば、それを使えばよいでしょう。

ただし、注意点として、各要素を指定するセレクタの書き方には注意が必要です。

OutSystemsで作った画面上で出力されるHTMLタグ上のIDは、OutSystemsによって自動生成されるため。

対策は、

  1. idの後方一致で指定する(WidgetのNameの値がidの後ろに出力されるため)
  2. classで指定する
  3. カスタムデータ属性で指定する

UIテストツールを使ってOutSystemsの画面を操作してみたときの記事:

Service CenterをCodeceptJSで操作してみる