ODCのBDD Frameworkを試してみる

Forgeに、ODC用のBDD Frameworkが既に登録されていたので、試してみた。
まずは、簡単なテストケースを1つ実装してみて、O11の時との相違点を主にみていく。

# 環境情報
ODC Studio(Version 1.2.3)
BDD Framework (version 0.1.2)
Template_BDD Framework (version 0.1.3)

# 感想（まとめコメント）
- テストの実装方法はO11と変わらず
- Applicationが無くなったので、BDD Framework本体、テンプレート、API、API用ライブラリと4つのApp/Libraryに分離して別々のForgeコンポーネントとして登録されている
- O11のBDDFramework Client Sideコンポーネントのドキュメントにあった、Server Actionをテストすると遅くなるという文言は無くなった
- セキュリティ機能が追加されたので、Settingの設定と呼び出し時のInput Parameter設定が必要

# アーキテクチャ変更
O11にはApplicationがあるため、1つのApplication内に本体、Screen Template、カスタムアプリケーションテンプレート、支援用Extensionが含まれていた。
ODCではApplicationが無くなったので、以下4つのApp/Libraryに分離されている。

- BDD Framework: (Library) テスト用ツールの本体、テストシナリオ作成用BlockやAssert用Actionを含む
- Template_BDD Framework: (App) BDD Framework用のテストアプリケーションのテンプレート。見た限りでは、O11のカスタムアプリケーションテンプレートに相当する機能はドキュメントには見つからない。が、このAppをインストールするとApp作成時のTemplateとしてこのAppが出てくるため、実装はされているようだ
- BDD Framework API: (App) BDD Frameworkで作成したテストを起動するREST APIを提供する
- BDDFrameworkTestRunLib: (Library) API用のLibrary

# インストール
ODC Portalでサイドバーの下にあるForge > All assetsをクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/e88a1a51-0f92-1db6-1357-7f904b3cc629.png)
「BDD」などでフィルタし、少なくともBDD FrameworkとTemplate_BDD Frameworkをインストール。

# テストAppを作成する
ODC Studioで作業する。
1. Createをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/a154dac5-1091-b2b5-5527-fbc3e356a7bb.png)
1. 表示されたダイアログで、Appを選択しContinueボタンをクリック
1. ダイアログが切り替わり、Appのテンプレートを選択する状態になる。BDD Frameworkを選択しContinueボタンをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/a727161b-df25-95e8-8891-f11c422ceb6e.png)
4．NameとDescriptionは適当に埋めて「Create app」ボタンをクリック

ここまでで、必要な参照と、テンプレートScreen/Blockを含むテストAppの準備ができた。

# テスト用Screen (Test Suite) とBlock (Test Scenario) を作成する

1. 作成されたAppをODC Studioで開き、画面上部のプラグのアイコンをクリック
1. 「Add public elements to」ダイアログでテスト対象Actionへの参照を追加
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/dc560377-0b0a-1bdb-5b89-888616cdcafe.png)
1. Test Suite/Test Scenario用にUI Flowを作成する（Test Scenarioが1つのテストケース、Test Suiteは複数のTest Scenarioをまとめたもの）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/660c96c2-e18f-a625-8f37-f84c871f91c0.png)
（Test Scenarioが増えてくると、ScenarioとSuiteが同じUI Flowにあるとみにくくなるので、それぞれに別のUI Flowを作成している。1つにまとめる案もある）
1. ScreenTemplates UI FlowからTest Scenario用Blockをコピーして、↑で作ったTest Scenario用UI Flowに貼り付け。名前は適当に変更する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/45c03c28-ae5f-fc83-1afd-1d6bac8f41cb.png)
（ScreenTemplatesの下には、以下の3種類のテストケースに対応するTest Suite/Scenarioのテンプレートがある
- 単独のテストケース：New_Suite/Scenario
- DataDrivenテストケース（テストケースはStatic Entityで定義）：DataDrivenDbScenario_Suite/Scenario
- DataDrivenテストケース（テストケースはExcelで定義）：DataDrivenXlsScenario_Suite/Scenario
）

5.. ScreenTemplates UI FlowからTest Suite用Screenをコピーして、↑で作ったTest Suite用UI Flowに貼り付け。名前は適当に変更する。Screen内にTest Scenario向けBlockが配置されているが、参照先がTemplateになっているため、↑の手順で作ったBlockに差し替える

# AuthToken：追加されたセキュリティ
ここまでに作成したScreenを右クリックして、Open in Browserを選択すると、ブラウザ上で画面が開き、テストの実行結果が表示される。それはOutSystems 11の時と同じ。

まだテストそのものは実装していないため、ほぼ空で表示されるはず……だが、実は以下のエラーメッセージが表示される。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/8021de0c-63ed-18ad-096a-c24703198b00.png)

これは、ODC版のBDD Frameworkの新機能。Setting (O11のSite Propertyに相当）のAuthenticationSecretTokenの値を、ScreenのAuthToken Input Parameterに渡さないと発生する。

このAuthenticationSecretTokenというSettingは、BDD FrameworkがLibraryであることから、参照側のテストAppをODC Portalで開いて設定する。
なお、Is Secret=YesのSettingはデフォルト値がないため、何らかの設定を行う必要がある。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/cbf3b7cf-d5e2-a688-e183-274dd1cc5536.png)

# テスト実装
ここは、OutSystems11の時とあまり変わらない。
Static Entityを使ったData Drivenなテストを例に実装手順を示す。

1. コピーしてきたScreenに初期設定されているAggregateにはOrderが指定されていないので、IdかOrder Attributeでソートされるように設定しておく
1. Static Entityを利用するテストの場合、1レコードが1つのテストケースに該当する。テストケースに必要な値をAttributeとしてStatic Entityに追加しておく
（例：黄色で塗ったAttributeを追加した。Whenで呼ぶActionに渡すものにInput_、ThenでAssertに使うものにOutput_のプレフィックスをつけている）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/e1a1b4a8-f893-90b1-80b6-528cefa12406.png)
1. テストケース数分のレコードを定義しておく
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/55b76189-4669-f9e9-baa7-8cd08f05b99d.png)
1. Test Scenarioに対応するBlockの実装を行う
    1. ScenarioIdentifier PlaceholderにはTestData Input ParameterのId Attribute、ScenarioDescription PlaceohlderにはTestData Input ParameterのScenarioNameを配置。その他のPlaceholderには必要に応じて配置する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/2142ef44-9679-f7dd-be3a-33d87c7c5ec0.png)
    1. Screen配下の5つのClient Actionにテストを実装する。詳細は、OutSystems 11のBDDFramework向けの記事を参照してほしいが、少なくとも、c_When (テスト対象Actionを実行する）とd_Then (テスト結果に対してAssertする）は実装することになる
（c_When内でのテスト対象Action呼び出し例。Input ParameterにStatic Entityのレコードから受け取った値を渡している）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/e9848ea6-362f-431d-f555-e14be589a551.png)

(d_Then内でのAssert例。Static Entityから来た値とc_Whenの実行結果を突き合わせている）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/3a563f47-b803-0427-297d-d7e4cc1792e0.png)