Upgrade to Pro — share decks privately, control downloads, hide ads and more …

[OutSystems] ユニットテスト in OutSystems

kata_junn
December 16, 2024

[OutSystems] ユニットテスト in OutSystems

OutSystems でユニットテストって書くべきなの?という議論を支えるための資料を目指しました

kata_junn

December 16, 2024
Tweet

More Decks by kata_junn

Other Decks in Technology

Transcript

  1. ユニットテスト in OutSystems 2024-12-05 OSUG*OJEC 合同開催 in Osaka 伊藤忠テクノソリューションズ 片野

    潤一(@kata_junn) ~あるいはユニットテストで幸せになるための方法論~
  2. 片野 潤一 かたのじゅんいち / かたじゅん 伊藤忠テクノソリューションズ(略称:CTC) 主業務 ローコードプラットフォーム: OutSystems の推進

    - プリセールス、技術支援 - トレーニング講師、講師育成 @kata_junn kata_junn 社内活動 - 社内 OutSystems Developer 向け勉強会開催、登壇 - Webinar 企画、登壇 社外活動 - OutSystems User Group、Qiita、名城大学非常勤講師 OutSystems 経験 - 約 9 年、OutSystems 資格全て
  3. ユニットテストは何をもたらすのか? • ソフトウェア品質特性の一つである、変更容易性を向上させ ることができる 変更容易性:必要な変更をストレスなく行えること • プロジェクトの停滞を回避し、適切な開発スピードを長い間 維持できるようになる • プロジェクト開始直後は生産性が高かったけれど、時間が経つ

    につれて低くなってない?…が避けられる手段になり得る 開発プロジェクトの成長を持続可能な状態に保つ テストの自動化によってセーフティクリティカルなソフトウェアのテス トをシフトレフトする, htakahashi, 2017-10-05, https://parasoft.techmatrix.jp/%E3%83%86%E3%82%B9%E3%83%88% E3%81%AE%E8%87%AA%E5%8B%95%E5%8C%96%E3%81%AB%E3%8 2%88%E3%81%A3%E3%81%A6%E3%82%BB%E3%83%BC%E3%83%95 %E3%83%86%E3%82%A3%E3%82%AF%E3%83%AA%E3%83%86%E3% 82%A3%E3%82%AB%E3%83%AB • プロダクションコードに変更を加えても、退行が発生しない ことに自信が持てるようになる。生産性にも寄与する。 開発者体験の向上
  4. 世の風潮的には、ユニットテストは有用かつ当たり前 “単体テストを導入することは当然のことと思われるようになってきました Googleのソフトウェアエンジニアリング ―持続可能なプログラミングを支える技術、文化、プロセス(初版 第3刷), 2021-11-29, オライリージャパン, 12章 ユニットテスト “バグの防止に続くテストの最重要目的は、エンジニアの生産性の改善である

    - 規模が小さく、高速で決定的 - 開発者が頻繁に実行でき、フィードバックを直ちに得られる - テスト失敗時に何が間違っていたのかを理解しやすい ―――単体テストに関する議論は 「単体テストを書くべきか?」から「良い単体テストを書くとはどういう意味 なのか?」に移ってきており ――― 単体テストの考え方/使い方(初版 第7刷), 2022-12-28, マイナビ出版, 第1章 なぜ、単体(Unit)テストを行うのか
  5. ユニットテストと呼ばれるものが持つ性質 • 1単位の振る舞いを検証すること • 実行時間が短いこと • 他のテストケースから分離された状態で実行されること “自動化されていて、次の3つの性質を全て備えるもの 単体テストの考え方/使い方(初版 第7刷),

    2022-12-28, マイナビ出版, 第2章 単体テストとは何か? - テストケース同士が影響を及ぼさないこと - つまり、共有依存を排除しなければならない - OutSystems において、共有依存の代表的なものはデータベース - OutSystems でユニットテストが書かれない最大の要因と考える
  6. OutSystems でユニットテストを書く2大巨頭 テスト系で唯一の Supported 黒魔術でユニットテスト ”らしさ” を実現 BDDFramework Testing Framework

    - OutSystems の仕組みに則ってテストの 仕組みを提供 - Client Action をテストする兄弟 Forge もある - Mocking 機能で共依存を排除可能 - Private な Action もテスト可能 - デフォルトでテスト終了時にロールバック - O11 のコード生成の仕組みが変わると動かなくなる https://www.outsystems.com/forge/component- overview/12754/testing-framework-o11 https://www.outsystems.com/forge/component- overview/1201/bddframework-o11
  7. 2つの Forge まとめ(コスト観点) テスト対象のAction Public Client Server Action の 呼び出しがない

    〇 やりやすい - 非対応 Server Action の 呼び出しがある △ Server 側のセットアップ/後 始末にコストがかかる - 非Public Client ー - 非対応 - 非対応 Public Server 共有依存がない 〇 テスト可、やりやすい 〇 やりやすい 共有依存がある × 共有依存のセットアップ/後始 末にコストがかかる。動いて いるアプリとも競合する。 〇 Mock 機能があるためやりやすい 非Public Server 共有依存がない × テスト不可 運用で、_ や private 等を Prefix としてつけ、Public に する方法もあるにはあるが、 アンチパターン 〇 テスト可 共有依存がある × 〇 Mock 機能があるためやりやすい BDDFramework Testing Framework ※ Screen Action など、何を使ってもテストができないものもあります。そういうのは E2E で頑張りましょう!
  8. 2つの Forge まとめ(コスト観点) テスト対象のAction Public Client Server Action の 呼び出しがない

    〇 やりやすい - 非対応 Server Action の 呼び出しがある △ Server 側のセットアップ/後 始末にコストがかかる - 非Public Client ー - 非対応 - 非対応 Public Server 共有依存がない 〇 テスト可、やりやすい 〇 やりやすい 共有依存がある × 共有依存のセットアップ/後始 末にコストがかかる。動いて いるアプリとも競合する。 〇 Mock 機能があるためやりやすい 非Public Server 共有依存がない × テスト不可 運用で、_ や private 等を Prefix としてつけ、Public に する方法もあるにはあるが、 アンチパターン 〇 テスト可 共有依存がある × 〇 Mock 機能があるためやりやすい BDDFramework Testing Framework ※ Screen Action など、何を使ってもテストができないものもあります。そういうのは E2E で頑張りましょう!
  9. テスト対象のAction Public Client Server Action の 呼び出しがない 〇 やりやすい -

    非対応 Server Action の 呼び出しがある × Server 側のセットアップ/後 始末にコストがかかる - 非Public Client ー - 非対応 - 非対応 Public Server 共有依存がない 〇 テスト可、やりやすい 〇 やりやすい 共有依存がある × 共有依存のセットアップ/後始 末にコストがかかる。動いて いるアプリとも競合する。 〇 Mock 機能があるためやりやすい 非Public Server 共有依存がない × テスト不可 運用で、_ や private 等を Prefix としてつけ、Public に する方法もあるにはあるが、 アンチパターン 〇 テスト可 共有依存がある × 〇 Mock 機能があるためやりやすい BDDFramework Testing Framework ※ Screen Action など、何を使ってもテストができないものもあります。そういうのは E2E で頑張りましょう! ここが OutSystems でユニットテストをすべき箇所 ユーティリティ ユーティリティ、重要なビジネスロジック
  10. オマケ ODC でも同じことが言える? O11 と Public の意味合いが変わったため、同じことが言えない 生成されるコードも変わった(はず)ので、Testing Framework も対応できていない

    え、じゃあどうしたら…? 製品ネイティブな機能としてユニットテストをサポートするよう、 ODC エンハンスリクエストを挙げましょう!!!!!!!!!!!!!!! ユニットテスト以外はどうなの? 現状は O11 も ODC もフロントエンド部分は大きく変わらないため、 E2E テストは O11 から ODC に移行しても(ほぼ)そのまま動きます