OutSystemsでテスト駆動開発の写経するためのTips

OutSystemsでテスト駆動開発(Kent Beck 著／和田 卓人　訳)
https://shop.ohmsha.co.jp/shopdetail/000000004967/
第Ⅰ部の写経を試してみたので、そこで引っかかった点の共有です。

# 前提条件
使用した環境・ツールは以下の通り
Service Studio：11.0.204.114(Beta)
Platform(Personal Environment)：11.0.118.0
テストツール：BDDFramework 1.2.2

BDDFrameworkはBDDに基づいたテストをOutSystemsで書くためのツールです。
BDDFramework自体の使い方(ブログ)
- [BDDFrameworkを試してみる(1)](https://blog.house-soft.info/archives/879)
- [BDDFrameworkを試してみる(2)1ケース実装してみる](https://blog.house-soft.info/archives/892)
- [BDDFrameworkを試してみる(3)サマリ、初期終了処理、REST](https://blog.house-soft.info/archives/911)

OutSystemsの基礎的な開発知識と、Java/C#などのオブジェクト指向開発言語で1回写経試していた方が望ましいです。

#「写経」について
## 「写経」とは
本の付録Cで勧められている方法で、本のサンプルコードを実際に打ち込んで学ぶものです。
手順は以下の通り。
> 1. ローカルで使えるバージョン管理システム（Git等）を用意。
> 2. 書見台などで対象の本を固定（あるいは、電子書籍を開く）。
> 3. ひたすらサンプルコードを写して実行。
> 4. 実行するたびにコミット（コミットログにページ番号を含める）。
> 5. 疑問点があったらコミットログや本に書き込む。
> 6. 章ごとにタグを打つ。
> 
> ＫｅｎｔＢｅｃｋ.テスト駆動開発(Kindleの位置No.5268-5271).Kindle版.

## OutSystemsの「写経」するにあたって 
1 バージョン管理はOutSystemsにビルトインされています。1-Click Publishするたびに勝手にバージョン番号が上がっていきます。
4 残念ながら、1-Click Publishにコミットログはつけられないと思います。
6 タグを打つ際にはコメントを付与することができます。
タグをどこで打つかというとLifeTimeです。URL直接入力してもいいですが、Service Centerを開き、Administration>Usersにあるリンクから開くことができます。

LifeTimeでApplicationを開くと、「TAG VERSION」というボタンがあるのでここでタグを打つことができます。
本来、ここは開発環境->ステージング環境->本番環境などの移行をするための場所ですが、Personal Environmentでもタグを打つことが可能です。
![qiita_tdd1.PNG](https://qiita-image-store.s3.amazonaws.com/0/332987/e46923e0-1d34-267a-fd5b-0b0930490df8.png)

タグコメント(Description)はこんなフォーマットにしました。
1行目は本と章番号、2行目は後からこのタグバージョンのソースに対応するバージョンを探すために、Service Centerでのバージョン番号を記録するための場所です。
> ＫｅｎｔＢｅｃｋ. テスト駆動開発 　第章
> eSpace Version: 

この方法でコメントをつけるとこんなイメージになります。
![qiita_tdd3.PNG](https://qiita-image-store.s3.amazonaws.com/0/332987/b3c11f2e-c0bd-1cdb-5b9e-03e65b3454fe.png)


# バージョン番号について
eSpaceのバージョン番号は、Service CenterのFactory>eSpacesで対象のeSpace(モジュールに対応)を開き、Version欄で確認できます。
![qiita_tdd2.PNG](https://qiita-image-store.s3.amazonaws.com/0/332987/0be8ea67-867d-2198-8610-efcea51617ab.png)

どう利用するかというと、特定の章終了時のソースに戻りたいとき
1. TAGの履歴から対象の章番号のログをみつける
2. 対象のeSpace Versionを確認
3. Service StudioのModuleメニュー>Open other version...で開くダイアログで対象バージョンのソースを開く

あるいは、Moduleメニュー>Compare and Merge with Published Versionで、変更点を確認できます。

# BDDFrameworkを使ったTDDの手順
1. テストモジュールの画面にBDDのシナリオのWeb Blockと関連する変数・Actionを用意する
2. テスト対象モジュールにテスト対象のActionを用意する
3. テストモジュールで用意したAction参照を追加
4. TDDの方法に従って、テスト対象修正->参照更新->テスト実行を繰り返す

4の面倒さを軽減するため、できたら、テスト対象のActionをService Actionにした方がいいです。
Service Actionにすると、I/Fが変わらなければ参照の更新が必要ないため、手間が軽減されます。
少なくとも写経の時は、Service Actionにしてまずいこと無いと思うので、ぜひ。
　
# BDDScenarioが邪魔
BDDScenarioというWeb Blockが1ケースに対応するのですが、大きすぎて邪魔です。
こんな感じです。大きすぎますね。
![qiita_tdd4.PNG](https://qiita-image-store.s3.amazonaws.com/0/332987/3c97d3e2-602c-047c-cab3-335db8fe7aca.png)

こういうときは、OutSystemsではIf Widgetを使います。
![qiita_tdd5.PNG](https://qiita-image-store.s3.amazonaws.com/0/332987/1d137ca4-782d-2083-1939-5072e802a8e5.png)
常にCondition=TrueのIfのTrueにBDDScenarioブロック、Falseに何が置いてあるかを説明するテキストを配置です。
Ifはデザイナ上で、True/False両方表示、Trueのみ表示、Falseのみ表示が選択できるので普段はFalseのみ表示で開発し、そのシナリオを修正したいときだけTrueのみ表示にすればOK。

# (自分に)広い心で
OutSystemsはオブジェクト指向ではないので、Interfaceへの引き上げとかデザインパターンの検討など本通りにできない部分が結構あります。

データと操作をひとまとめにすることもできません。
複数のデータを組み合わせて複合データが欲しいときは、Structure/Entityを使いましょう。背後にテーブルがいるのがEntity、いないのがStructureです。

相違は仕方ないので、OutSystemsの歩幅は本とは違うのだということであまり気にしない方が良さそうです。