OutSystemsでテスト自動化ツール(BDD Framework)を利用してみた

Pocket

1.    はじめに

アプリ・ソフトウェア開発は、IT技術の進歩に合わせてより多様で高機能なものが求められるようになってきています。その結果システムの規模は大きく複雑になっていき、その分テストにかかる工数も増加しています。アプリ・ソフトウェア開発を行う上で、テストにかかる工数は全体の30%~40%と言われています。

そのような背景の中で、昨今テストにかかる工数を減らそうと『テスト自動化』が注目を集めています。

OutSystems ではテスト自動化のフレームワークとして『BDD Framework』がForgeで提供されています。本稿ではこの『BDD Framework』の利用方法ならびに使用感を記述していきます。

 

2. BDD Frameworkとは

BDDとはBehavior Driven Developmentの頭語であり、コード開発の前にテストケースまたはテストコードを作成し、それに合わせて実装を行うという概念です。

OutSystemsでこのビヘイビア駆動開発(BDD)の概念を用いる際に利用されるフレームワークがBDD Frameworkです。

BDD Frameworkを使った自動テストの仕組みは、以下のように構成されます。(図1)
テスト対象のアプリケーションとは別に、テスト用のアプリケーションを準備し、テスト対象のロジック処理(Client Action、Server Action)を参照利用しながら自動テストの構築をしていきます。

図1.BDD Frameworkを使った自動テストの構成

 

3. BDD Frameworkを使ったサンプルの作成

それでは実装サンプルを作成していきます。今回サンプルとして使用する情報は以下です。

  • 構築するアプリケーション:顧客管理システム
  • 担当する機能:顧客登録(重複チェックのみ実施)
    ※重複チェックは同じ「顧客名」「住所」が既に登録されている場合、エラーとする仕様。

 

3-1. テストケースの作成

まずはテストケースを考えていきます。

BDDでは開発者以外の人でも読めるテストケースを作成することが一般的です。まずは実現したい機能を整理するために、「AS A:誰が利用するか」、「I WANT:どんな機能や性能を作るか」、「SO THAT:それによってどんな恩恵を得ることができるか」に分解して考えます。

今回の場合だと以下のようになります。

AS A ユーザー
I WANT ユーザーが顧客情報を登録できる
SO THAT 顧客情報をデータベースで管理できる

機能の整理が終わったら、次にテストケースに落とし込みます。BDDでは「GIVEN:前提条件として、テストケースに入る前のシステムの状態はどんな状態か」、「WHEN:シナリオがトリガーする条件はいつか」、「THEN:そのシナリオのあとに期待すべき結果はどのような結果か」、「AND:複合的に確認したい結果がある場合、整理のため分けて記述する」に落とし込みながら、テストケースを作成していくのが主流です。

今回の場合だと、以下のようになります。

シナリオ1
GIVEN 登録データの「顧客名」と「住所」に同じデータがすでに登録されている
WHEN ユーザーが登録ボタンを押下する
THEN エラーメッセージ「既に登録済みのデータです。」が表示されることを確認する
AND データベースにデータが登録されていないことを確認する
シナリオ2
GIVEN 登録データの「顧客名」と「住所」に同じデータは登録されていない
WHEN ユーザーが登録ボタンを押下する
THEN 成功メッセージ「データが登録されました。」が表示されることを確認する
AND データベースにデータが登録されていることを確認する

シナリオが作成できたので、実装並びにテストコードを作成していきます。なおシナリオは2つありますが、当記事ではシナリオ1のみを自動テストケースを対象として、ケースを作成します。

 

3-2 テスト対象のServer Action作成

テストケースを基に登録アクションをPublic:Yesで作成していきます。(図2)
テスト対象のServer Action自体は普段通りの作成手順のため、本稿では詳細の記載は省略します。

 注意点

  • BDD Frameworkで扱えるアクションは、Client またはServer Actionのみで、Screen Actionは扱えません。
  • 公開設定(Public)がYesのActionのみがテスト実行できます。

 

図2.テスト対象のServer Action

 

3-3. 自動テストの作成

テスト用のアプリケーションにテストコードを実装します。3-2で作成したアクションを参照し、
BDDScenario Blockを画面上に配置します。

図3.BDD FrameWorkのイメージ

 

各ステップを構築していきます。

Setup

Setupはテストデータの準備を行います。
今回はユーザーの重複チェックで、エラーを発生させるために事前に同じデータを登録しておく必要があります。まずはローカル変数に重複用データを用意し、事前に登録しておきます。そのデータ内容と同じデータをテスト実行時にも使用するので登録用データとしてコピーしておきます。(図4、図5)

図4.Setupの構築例①

図5.Setupの構築例②

 

Given

Givenではテストケースの前提条件が揃っているか確認します。
登録データの「顧客名」「住所」と同じデータがすでに登録されていることを確認します。
前提条件がそろっていない場合は、正確なテストができないため必ずエラーハンドリングするようプログラムを作成します。(図6、図7)

図6.Givenの構成例①

図7.Givenの構成例②

 

When

Whenはテストケースの操作部分で、基本的にテスト対象のアクションを配置します。
3-2で作成した「CreateCustomer」アクションを呼び出します。
先ほど記載の通り「CreateCustomer」のPublicがNoの場合、ここで使用できません。
また次のThen(実行結果の検証部分)で返り値を使用できるように、Blockのローカル変数に値を格納しておきます。(図8)

図8.Whenの構成例

 

Then

Thenは実行結果の検証部分で、Whenの実行結果をチェックします。(図9)

今回のサンプルでは、以下の2点を確認します。

  • 処理結果ステータスが「true」であること
  • メッセージ「既に登録済みのデータです。」が出力されること

図9.Thenの構成例

 

Teardown

Teardownはテストデータのリセットを行います。
今回のサンプルでは、テストで使用したCustomerのデータを削除します。
データの削除がない場合、次回のテスト実行時に想定と異なる結果が生じるため必ず削除するようにしてください。(図10)

図10.Teardownの構成例

 

3-4. 自動テストの実行

作成した自動テストを実行します。Publishを実施し、ブラウザで画面を表示させます。
テストが成功するとすべてグリーンとなります。(図11)

図11.テスト実行例(成功)

 

失敗すると以下のようになります。(図12)

図12.テスト実行例(失敗)

 

ここまででBDD Frameworkを使って自動テストを導入してみました。導入自体はForgeの部品もあり手軽にできました。次章はBDD Frameworkを利用してみて気づいた点・注意点等を記載していきます。

4. BDD Frameworkを利用してみて

テスト自動化(BDD Framework)を導入すると、以下のようなメリットがあると言われています。

  • テストモジュールを実装後は自動実行のため、人為的ミスを防げる。
  • 1度テストモジュールを実装すると、同じテストを繰り返し実行可能なためリグレッションテストに向いている。またテストモジュールを他の環境にデプロイすることで、他の環境でも同じテストの実行が可能。

その一方で実際に導入してみて以下の注意点があると感じました。

  • 公開されているアクション(Public:Yes)のみテストが実行できるので画面を用いたテスト等は従来通り手作業でテストを実施する必要がある。
  • 初めにテストケース/テストコードを作成するなど、従来のテストとは作業順序が異なるため、BDDの概念を十分理解した上で進める必要がある。
  • テスト自動化の導入で初回のテスト工数は減らない。BDD Frameworkのテストモジュールの実装は基本的に時間がかかる為、実装のために工数を確保しておく必要がある。
    例:テスト1ケース毎にSetup、Given、When、Then、Teardownを実装していく必要があるため、テスト対象のモジュールを実装するのと同じように実装そのものに時間を必要とする。

 

5. おわりに

今回はOutSystemsのBDD Frameworkによる自動テストを紹介しました。
自動テストはデメリットにあげたような課題もありますが、開発の効率化に対して有用な手段の一つとなります。
今回の記事を見て、OutSystemsにおけるテストの自動化に興味が湧いた方は是非一度お問い合わせ下さい。

お問い合わせ先

執筆者プロフィール

Ota Jumpei
Ota Jumpeitdi OutSystems推進室
様々なローコード開発ツールを幅広く挑戦中です。
直近のテーマは英語の説明をスラスラ読むために語学力を向上すること。
Pocket

関連記事