ODCのBDD Frameworkで作成したテストをREST APIから実行する手順

ODCのBDD Framework一般については以下の記事で見た。

https://qiita.com/jyunji_watanabe/items/35cf1500b64429e0e518#authtoken%E8%BF%BD%E5%8A%A0%E3%81%95%E3%82%8C%E3%81%9F%E3%82%BB%E3%82%AD%E3%83%A5%E3%83%AA%E3%83%86%E3%82%A3

ここでは、BDD Frameworkで作成したテストを自動実行できるREST APIの利用法を確認する。

# 環境情報
ODC Studio(Version 1.4.15)
BDD Framework API (version 0.1.3)
BDDFrameworkTestRunLib (version 0.1.0)

# 全体像
BDD Framework APIが提供するExpose REST API "TestTrigger/RunTestSuite"を呼ぶことで外部からテストを自動実行できる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/811ab3d1-6b12-bbb9-15cf-e281ecc70a17.png)

↑の記事でも書いた通り、ODCのBDD Frameworkのテスト画面を実行するにはテストAppに設定したAuthTokenを渡さないといけない。
このAuthTokenが、BDD Framework APIと対象のテストAppで同じ値になっていないと動作しない点に注意（詳細は以下で）。

# BDD Framework APIの認証の仕組みを確認する
以下の通り、このAPIはAuthentication=Customなので、OnAuthentication Callbackを確認してみる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/3c5ba394-2b96-e5aa-4098-b8de0359ef61.png)

## OnAuthenticationの実装
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/ef4bbef8-433e-5cee-e096-3690a1b01425.png)

### GetRequestHeaderSecurityToken Action
HTTPリクエストヘッダーからAuthorizationの値を取得。
値は「Bearer \<AuthToken\>」となっているはずなので、\<AuthToken\>の部分を抜き出す。

### ValidateTestCanBeTriggered Action
これは実は、BDDFramework本体のAction。
BDDFrameworkが持っているAuthenticationSecretTokenというSettingsの値[^1]と、GetRequestHeaderSecurityTokenのOutput Parameterが合致するかをチェックする。

合致しない場合、後続のIfでHTTP Status 401 (Unauthorized) として処理する。つまり認証エラー。

[^1]: これは、BDD Frameworkのテスト画面アクセス時に渡すAuthTokenの値。BDD FrameworkはLibraryであるため、Consumer Appの設定画面で設定する

## APIからテスト画面を呼ぶときのAuthToken
実は、APIの認証で使った値（Authorizationヘッダーから取得した値）を再利用する。

Expose REST API "TestTrigger/RunTestSuite"でテスト画面のURLを組み立てるのが以下のAssign。GetRequestHeaderSecurityTokenのOutput Parameterを渡しているのを確認できる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/3fe5d44f-453a-b1aa-2c48-a5baf543c707.png)

つまり、「APIの認証に使うAuthToken（BDD Framework APIのSettingの値）と、テスト画面のアクセスに使うAuthToken（テストAppのSettingの値）には同じ値を使う」⇨「BDD Framework APIのSettingとテストAppのSettingを同じ値にしておく必要がある」。

# 利用手順（OutSystemsのみを使う場合）
1. ODC Portalで、BDD Framework APIのSettings > AuthenticationSecretTokenの値を、テストApp（BDD Frameworkで作成したテスト用App）の同項目に設定したのと同じ値に更新しておく
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/ea195f02-6d39-f595-943b-3f7522bd4cf7.png)
2. BDD Framework APIのExpose REST APIのドキュメントからswagger.jsonのリンクを取得
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/6a515f2c-a265-6e06-749c-828b73c59873.png)
3. 利用側Appでswagger.jsonを使ってConsume REST APIを作成する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/08e67ec6-698f-60cf-0707-b48003e922e9.png)
4. Consume REST APIのプロパティOnBeforeRequestのドロップダウンリストを展開し、New OnBeforeRequestを選択
5. OnBeforeRequest内に元からあるAssignの下にListAppendを追加。内容は、CustomizedRequest.HeadersにName="Authorization"、Value="Bearer \<AuthTokenの値\>"を追加するというもの
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/9f708185-d55e-4ebc-c13b-0c25e667b564.png)
6. Consume REST APIのメソッドを呼ぶ。TestESpaceにはテストApp名[^2]、TestSuiteScreenにはテストケースを配置したScreenの名前を設定する。BDD Frameworkのテスト実行には時間がかかるので、Server Request TimeoutやTimeoutには大きめの値を設定したほうがいいかもしれない
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/7f609ce1-367b-fe3b-1bd4-cc73e9ab1e95.png)

[^2]: eSpaceとはO11のExtension以外のモジュールのことだが、恐らく歴史的理由で残ってしまっている

# AuthToken問題の対策
以下のような対策が考えられる。AuthTokenを共有してよいのならもちろん今のままでも良い。
- BDD Framework APIをCloneして、REST APIのInput Parameterにテスト画面用のAuthTokenを追加する
- BDD Framework APIをCloneして、テスト対象AppとそのAuthTokenのセットを、そのCloneしたApp内で管理する（テスト対象画面を呼ぶ際に、管理情報からAuthTokenを取り出して使う）

# External Logic BDDFrameworkTestRunLibについて
External LogicなのでC#で作られているはずだが、レポジトリへのリンク等は見当たらない。
また、External Logicは、O11のExtensionと違い、それ自体にはC#のソースコードを含まない。
従って、実際に何をやっているのかを確認することは現時点ではできない。