[OutSystems]BDDFrameworkに追加されたタグ機能

OutSystems向けにユニットテストを書くツールとして推奨されているのがBDDFrameworkです。
これまでは、Reactive Web App/Mobile AppのClient Actionにはテストを書けませんでしたが、BDDFramework Client Sideのリリースによってそれが改善されました。
　
　→[Client Action用のBDDFrameworkのチュートリアル](https://qiita.com/jyunji_watanabe/items/3c5e1f40bf9b00925fc9)

この追加と同じタイミングで、BDDFrameworkにもタグ機能が追加されたので、その動作を確認してみます（Client Sideにもこの機能がある）。

# 確認環境
Personal Environment(Version 11.12.0 (Build 30002))
Service Studio (Version 11.11.3)
BDDFramework(Version 1.4.0)

# ドキュメント
Forgeのサイト上にあります。
[BDDFramework - Documentation](https://www.outsystems.com/forge/Component_Documentation.aspx?ProjectId=1201&ProjectName=bddframework)のTaggingの項。

# タグ
テストケースにタグを付け、テストを実行するときに、

- 特定のタグがついているもののみ実行
- 特定のタグがついていないもののみ実行

ということができます。

## タグを作成する
まず、テストケースで利用するタグを定義します。
BDDFrameworkが提供するカスタムアプリケーションテンプレートから作成したテストモジュールには、デフォルトで、「Template_Tag」というBlockがあります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/43f0edcd-6321-9115-7a19-54f077420767.png)

これは、テンプレートなので、コピーして使う。
タグについては、専用のUI Flowを用意することが推奨されている。

1. UI Flowの下にテンプレートをコピーする
1. ブロック名をつける（例：SlowTest_Tag）
1. ブロックのローカル変数「TagLabel」のDefault Valueにタグ名を付与する（例：SlowTest）

上記手順で3つのタグを作成したところ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/24494d45-db87-9fd4-6ece-3070241cf679.png)

## テストケースにタグをつける
タグはテストスイート（画面）単位ではなく、テストケース（BDDScenario Block）単位で付与します。
BDDScenarioのPlaceholderとして、「Tags」が追加されており、そこに作成しておいたタグBlockをドラッグ＆ドロップで配置する。
以下は、Category1とSlowTestというタグ付与したところ。この様に、1つのテストケースに複数のタグを付けることも可能。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/efa7bb8c-6d01-1211-c7a4-770d6a98ab90.png)

## 実行時に特定のタグを持つケースだけ実行する
以下は、ドキュメントされていないが、APIの実装を読んで確認した方法。
テスト画面のURLのクエリストリングに「ExecuteTag=タグ名」を必要な数だけ追加する。

例：https://ホスト/モジュール名/画面名.aspx?_ts=637597807487161022&ExecuteTag=Category2

指定されたタグを持たないテストケースは以下のように「Skipped」と表示され、全体が灰色になる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/f1bb159c-22b0-ee8e-bd3b-843850e3d835.png)

## 実行時に特定のタグを持つケースを実行しないようにする
これもAPIの実装から。
SkipTag=タグ名、と指定する。
ExecuteTagも同じですが、複数指定したいときは、「&SkipTag=Category2&SkipTag=SlowTest」のように複数のタグ指定を「&」でつないで並べます。

# API V2
BDDFrameworkのバージョンアップに伴い、テストスイート（画面）を実行するREST API「RunTestSuite」のバージョン2が追加されています。
## IFの違い
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/ee46f679-704a-a5c1-e2e9-66cf2aee9f62.png)

## 追加されたInput Parameter：Tag指定
このパラメータはheader渡しの指定なので、HTTPリクエストを送信するときにリクエストヘッダに渡してください。
SkipTags：実行対象外のタグ名。複数あるときは「,」でつなぐ
ExecuteTags：実行対象のタグ名。複数あるときは「,」でつなぐ
両方に指定されたタグは、実行時にスキップされます。

## 追加されたOutput Parameter：テスト画面
テストスイートにあたる。
帰ってくるのは名前ではなく、URL。

## 変更されたOutput Parameter：テストケース実行結果
V1のIFでは、個別のテストケースについては、失敗したケースのみ失敗内容を示すText型の値が返ってきていました（型はList of Text）。

V2では成否に関わらず、各テストケースの状況を表す結果が返ってきます。
ただ、違和感を覚える部分もありました。
以下のTestScenarioResults[1]のテストケースは、スキップのリクエストを送ったもの。
なので、想定としては、IsSkipped: true、IsSuccess: false、TagsにはBDDScenarioに配置したタグが入りそうなものです。実際は、それぞれ、false, true, 空のリスト。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/0abc8eb3-0181-4918-6f9d-5848013ff960.png)

# 使い方検討
主な使い所は、

- 実行速度によるタグ分け。例えば遅いテストは重要なタイミングのテスト時にだけ実行し、開発中のTDD的なテストでは実行しないようにする、とか。この場合は上の例にも書いたとおり、「SlowTest」みたいなタグを用意する
- 環境によって実行でき無いテストがあるとき。例えば、開発環境では接続先の外部システムがないためじっこうできないとか。こういうときは、接続先のシステム名のタグを作る
- SmokeTest

などでしょうか。
タグは標準化しないと、実行時に困るので、CoE等で共通部品として提供したいところ。