テストシナリオマクロ最終更新日: 2020年8月6日

シナリオファイルの構造

シナリオファイル

ファイルの先頭は=で始めます。その次の行から、環境命令が続きます。

テスト命令の開始は==で始まる行で識別します。次の==が見つかるまでが、一つのシナリオです。

= シナリオ名
環境命令
...
== テスト命令のまとまり(一つの画面機能の操作)
テスト命令
...
== テスト命令のまとまり(一つの画面機能の操作)
テスト命令
...

一つの「テスト命令のまとまり」は、一つの画面の操作のみとします。ここに検索、一覧表示、詳細表示といった複数の画面をまたがるテスト命令を記述することはできません。

環境命令

書式は次の通りです。

:環境命令: "値"

環境命令はコロン (":") で囲みます。一つの空白で区切り、値部をダブルクォートで囲みます。

環境命令 必須 説明
:group: :group: "t001" このテストシナリオのグループIDです。一つのグループIDに複数のテストシナリオを用意することができます。
:id: :id: "CustomerTest" このテストシナリオのグループIDです。一つのグループIDに複数のテストシナリオを用意することができます。
:define: :define: 今日 TEXT(TODAY(),"yyyy-MM-dd") テスト命令で利用できる式を定義することができます。[後述]
:include: :include: "rule.def" 複数の環境命令をまとめた別ファイルを用意し、これをインクルードすることができます。[後述]

テスト命令部

書式は次の通りです。

テスト命令 "値","値",...
テスト命令 命令修飾
テスト命令 モデル名.項目名 "値","値",...

テスト命令と値は一つの空白で区切ります。値部はダブルクォートで囲みます。

詳細は後述します。

コメント

//ではじまる行はコメントとして扱われます。動作に影響はありません。

テスト命令の説明

日本語表記
ログオン [ユーザ名] [パスワード] ログオン "admin" "wagby"
ログオン! [ユーザ名] [パスワード] ログオン! "admin" "wagby"
ログオン [ユーザ名] [パスワード] [言語] ログオン "admin" "wagby" "日本語"
ログオン "admin" "wagby" "English"
ログオフ ログオフ
ページタイトル? [ページタイトル] ページタイトル? "メニュー"
ページタイトル?? [ページタイトル] ページタイトル?? "メニュー"
タイトル? [タイトル] タイトル? "Wagby アプリケーション ログオン"
メニュー メニュー
メニュー [メニュー] メニュー "サービス > 顧客検索"
サブメニュー [メニュー] サブメニュー "サービス > 顧客検索"
エラーメッセージ?? [文言] [文言] ... エラーメッセージ?? "ユーザ名またはパスワードが間違っています"
警告メッセージ? [文言] [文言] ... 警告メッセージ? "顧客名称 は必須項目となっています。"
情報メッセージ? [文言] [文言] ... 情報メッセージ? "1件の顧客データを新規登録しました。"
エラーメッセージ数 [整数]
警告メッセージ数 [整数]
情報メッセージ数 [整数]
情報メッセージ数 "1"
画面 登録 [モデル名(省略可)] 画面 登録
画面 登録 "顧客"
画面 更新 [モデル名(省略可)] 画面 更新
画面 更新 "顧客"
画面 コピー 画面 コピー
画面 親モデル詳細 画面 親モデル詳細
画面 検索 画面 検索
画面 一覧 画面 一覧
画面 一覧更新 画面 一覧更新
ボタン 保存 ボタン 保存
ボタン キャンセル ボタン キャンセル
ボタン 削除 ボタン 削除
ボタン ウィザード次 ボタン ウィザード次
ボタン ウィザード前 ボタン ウィザード前
ボタン 検索 ボタン 検索
ボタン リセット ボタン リセット
ボタン [オリジナルボタン名] ボタン "オリジナルボタン1"
?ボタン [画面に用意されているボタン] ?ボタン "登録画面へ"
?ボタン "一覧表示へ"
準備 モデル名 準備 顧客
検索準備 モデル名 準備 顧客
入力 モデル名.項目名 [値] 入力 顧客.顧客名称 "山田"
入力 モデル名.コンテナ名[INDEX].項目名 [値] 入力 顧客.問い合わせ[1].内容 "電話ありました。"
入力 モデル名.郵便番号項目名 [郵便番号] 入力 顧客.郵便番号 "901-2227"
選択肢確認? モデル名.項目名 [値] [値]... 選択肢確認? 顧客.業種リストボックス "流通" "製造" "販売"
ボタン クリア モデル名.項目名 ボタン クリア 顧客.業種ラジオボタン
?ボタン クリア モデル名.項目名 ?ボタン クリア 顧客.業種ラジオボタン
ボタン トグル モデル名.項目名 ボタン トグル 顧客.業種チェックボックス
?ボタン トグル モデル名.項目名 ?ボタン トグル 顧客.業種チェックボタン
ボタン 開く モデル名.項目名 ボタン 開く 顧客.業種サブウィンドウ
ボタン 閉じる モデル名.項目名 ボタン 閉じる 顧客.業種サブウィンドウ
ボタン #OK ボタン #OK
アップロード モデル名.項目名 [ファイル] アップロード 顧客.写真 "myphoto.png"
ダウンロード モデル名.項目名 [ファイル] ダウンロード 顧客.写真 "myphoto.png"
入力可 モデル名.項目名 入力可 顧客.顧客名称
入力不可 モデル名.項目名 入力不可 顧客.顧客名称
入力 モデル名.追記型リストボックス項目名 [値] 入力 顧客.趣味 "読書"
入力 モデル名.追記型リストボックス項目名 [値]
#SELECT
入力 顧客.趣味 "読書" #SELECT
入力 モデル名.繰り返し項目名 [値] [値]... 入力 顧客.メールアドレス "yamada" "y@mada"
入力 モデル名.繰り返し項目名[INDEX] [値] 入力 顧客.メールアドレス[1] "yamada"
入力 モデル名.繰り返し項目名 #CLEAR 入力 顧客.メールアドレス #CLEAR
ボタン 追加 モデル名.繰り返し項目名 ボタン 追加 顧客.メールアドレス
ボタン 挿入|追加|削除 モデル名.コンテナ名 ボタン 挿入 顧客.問い合わせ
ボタン 追加 顧客.問い合わせ
ボタン 削除 顧客.問い合わせ
入力存在 モデル名.項目名 入力存在 顧客.顧客名称
入力非存在 モデル名.項目名 入力非存在 顧客.顧客名称
値確認 モデル名.項目名 値確認 顧客.顧客名称 "山田"
値確認 モデル名.繰り返し項目名 値確認 顧客.メールアドレス "yamada" "y@mada"
値確認 モデル名.コンテナ名[INDEX].項目名 値確認 顧客.問い合わせ[1].内容 "電話ありました。"
サイズ確認 モデル名.繰り返し項目名 [整数]
サイズ確認 モデル名.コンテナ名 [整数]
サイズ確認 顧客.問い合わせ "2"
値確認RO モデル名.項目名 [値] 値確認RO 顧客.登録ユーザ "admin"
出力存在 モデル名.項目名 出力存在 顧客.顧客名称
出力非存在 モデル名.項目名 出力非存在 顧客.顧客名称
検索条件 モデル名.項目名 [値] 検索条件 顧客.顧客名称 "山田"
検索条件 モデル名.項目名(下限) [数値] 検索条件 顧客.ID(下限) "1"
検索条件 モデル名.項目名(上限) [数値] 検索条件 顧客.ID(上限) "100"
検索条件 モデル名.項目名(開始) [日付値] 検索条件 顧客.訪問日(開始) { TEXT(TODAY(),"yyyy-MM-dd") }
検索条件 モデル名.項目名(終了) [日付値] 検索条件 顧客.訪問日(終了) { TEXT(TODAY(),"yyyy-MM-dd") }
検索結果 [文言] 検索結果 "1件中、1件目から1件目を表示しています。"
一覧値確認 モデル名[INDEX].項目名 [値] 一覧値確認 顧客[1].顧客名称 "山田"
一覧値確認 モデル名.モデル参照検索項目.参照先モデル名[INDEX].項目名 [値] 一覧値確認 サポート.顧客名.顧客[1].顧客名称 "山田"
ボタン 詳細 モデル名[INDEX]
(注:一覧値確認を事前に行っていること)
ボタン 詳細 顧客[1]
ダウンロード モデル名.項目名 ダウンロード 顧客.写真
フォントサイズ [大|中|小] フォントサイズ "大"
ワークフロー 申請フロー選択 [フロー名] ワークフロー 申請フロー選択 "年休申請フロー"
ワークフロー コメント [コメント] ワークフロー コメント "年休申請します。"
ワークフロー 申請 ワークフロー 申請
ワークフロー 承認 ワークフロー 承認
ワークフロー 差し戻し ワークフロー 差し戻し
ワークフロー 却下 ワークフロー 却下
ワークフロー 取り消し ワークフロー 取り消し
ワークフロー 決裁 ワークフロー 決裁
ワークフロー 値確認[INDEX].項目名 [値] ワークフロー 値確認[1].処理者 "山田"
ワークフロー 値確認[1].処理内容 "新規登録"
ワークフロー 値確認[2].コメント "年休申請します。"
ウィンドウサイズ [幅] [高さ] ウィンドウサイズ "800" "600"
スクリーンショット [ファイル名] スクリーンショット "capture1"
エクスポート #ALL エクスポート #ALL
エクスポート [モデル] エクスポート "顧客" "お知らせ"
エクスポート #RESET エクスポート #RESET
エクスポート #DOWNLOAD [ファイル名] エクスポート #DOWNLOAD "data_test01.zip"
エクスポート #DELETE [ファイル名] エクスポート #DELETE "data_test01.zip"
インポート [ファイル] インポート "data_test01.zip"
フォーカスアウト フォーカスアウト

ルール

  • 一行で一つの命令セットです。一つの命令を、改行を挟んで複数行で記述することはできません。
  • 引数の文字列は原則として、ダブルクォートで囲みます。
  • 繰り返し項目、繰り返しコンテナ項目の添字(INDEX)は 1 から開始されます。
  • 一覧表示の行数の添字(INDEX)は 1 から開始されます。
  • 一覧表示の各行に用意されているボタン押下操作の前に、"一覧値確認" 処理を(少なくとも一回)行っている必要があります。
  • スクリーンショットは png 形式画像です。保存位置は build/reports/tests となります。この命令を利用する時はヘッドレスモードをtrueにしてください。

メタ文字

用意しているメタ文字は次の通りです。

メタ文字 付与できる命令 説明
? タイトル
ページタイトル
メッセージの末尾
完全一致
ボタン 存在することの確認
- ボタン 存在しないことの確認
?? タイトル
ページタイトル
メッセージの末尾
部分一致
! ログオン
各種の画面遷移ボタンの末尾
標準では、画面遷移後は常にエラーがないことを確認している。この「エラーがないことを確認する」処理をスキップする。

Excel関数の利用

値の部分を {...} で囲み、式を記述することができます。

入力 顧客.問い合わせ[1].日付 { TEXT(TODAY(),"yyyy-MM-dd") }

式を事前に定義する

環境命令部に define 命令を用意することができます。

:define: 今日 TEXT(TODAY(),"yyyy-MM-dd")

命令部では特別な指定&を使って、これを参照することができます。

入力 顧客.問い合わせ[1].日付 &今日

複数の define 命令を別ファイルで定義する

複数の define 命令をまとめた別ファイルを用意することができます。例えば rule.def というファイルを用意します。

:define: 今日 TEXT(TODAY(),"yyyy-MM-dd")
:define: 明日 TEXT(MOVEDAY(TODAY(),1),"yyyy-MM-dd")
:define: 昨日 TEXT(MOVEDAY(TODAY(),-1),"yyyy-MM-dd")

include 命令でこのファイルを取り込むことができます。

:include: "rule.def"
include 命令によって取り込むことができるのは、環境命令のみです。

Javaコードを埋め込む

テスト命令行に特別表記<%%>を使うことができます。この中に直接、Javaコードを書くことができます。

<%
System.out.println("Hello,WTF!");
%>

サンプル

モデル customer に対するテストのサンプルを示します。

= 顧客モデルのテスト
:group: "t001"
:id: "CustomerTest"
// ユーザ定義
:define: 今日 TEXT(TODAY(),"yyyy-MM-dd")
// ユーザ定義インクルード
:include: "rule.def"
// ------ tests are from here  ------
== ログオンのテスト
//ログオン "admin" "wagby" "English"
//ログオン "admin" "wagby" "日本語"
ログオン "admin" "wagby"
ページタイトル? "メニュー"
// スクリーンショット取得時はヘッドレスモードをtrueにすること。
スクリーンショット "capture1"
== ログオフのテスト
ログオフ
タイトル? "Wagby アプリケーション ログオン"
== ログオンユーザのパスワードミスのテスト
// '!' = no error check
ログオン! "user01" "user01"   
エラーメッセージ?? "ユーザ名またはパスワードが間違っています"
== トップメニューのテスト
ログオン "admin" "wagby"
ページタイトル? "メニュー"
メニュー "サービス > 顧客検索"
ページタイトル? "顧客 検索"  
// 引数なしの「メニュー」は、メインメニューに戻る
メニュー  
ページタイトル? "メニュー"
サブメニュー "サービス > 顧客検索"
ページタイトル? "顧客 検索"
フォントサイズ 大
ウィンドウサイズ 800 600
== 顧客の登録をキャンセル    
// 3番目にモデルを指定することもできる。通常は不要。
画面 登録 "顧客"
ページタイトル? "顧客 新規登録"
ボタン キャンセル  
ページタイトル? "顧客 検索"
ボタン "オリジナルボタン"
== 顧客の登録をテスト
画面 登録
ページタイトル? "顧客 新規登録"
入力 顧客.顧客名称 "山田"
入力 顧客.顧客カナ "ヤマダ"
入力 顧客.会社名称 "ジャスミン商事"
入力 顧客.電話番号 "09000000000"
選択肢確認? 顧客.業種リストボックス "流通" "製造" "販売"
入力 顧客.業種リストボックス "流通"
入力 顧客.業種ラジオボタン "流通"
?ボタン クリア 顧客.業種ラジオボタン
ボタン クリア 顧客.業種ラジオボタン
入力 顧客.業種チェックボックス "流通" "製造"
?ボタン クリア 顧客.業種チェックボックス
ボタン クリア 顧客.業種チェックボックス
ボタン 開く 顧客.業種サブウィンドウ
ボタン 閉じる 顧客.業種サブウィンドウ
入力 顧客.業種サブウィンドウ "流通"
入力 顧客.生年月日リストボックス形式 "1972-5-15"
アップロード 顧客.写真 "myphoto.png"
入力可 顧客.顧客名称
入力不可 顧客.顧客カナ
入力 顧客.趣味 "読書"
入力 顧客.趣味 "読書" #SELECT
入力 顧客.メールアドレス "yamada" "y@mada" "Yamada" "YaMaDa"
入力 顧客.メールアドレス[1] "yamada"
ボタン 追加 顧客.メールアドレス
入力 顧客.メールアドレス[2] "y@mada"
入力 顧客.メールアドレス #CLEAR
入力 顧客.メールアドレス "yamada" "y@mada"
入力 顧客.問い合わせ[1].日付 { TEXT(TODAY(),"yyyy-MM-dd") }
入力 顧客.問い合わせ[1].日付 &今日
入力 顧客.問い合わせ[1].内容 "電話ありました。"
ボタン 追加 顧客.問い合わせ
入力 顧客.問い合わせ[2].日付 &明日
入力 顧客.問い合わせ[2].内容 "回答しました。"
ボタン 挿入 顧客.問い合わせ
ボタン 削除 顧客.問い合わせ
入力非存在 顧客.顧客名称
ボタン 保存
ページタイトル? "顧客 詳細表示"
情報メッセージ数 "1"
// "情報メッセージ" だけだと、"情報メッセージ??" と解釈。textsに展開される。
情報メッセージ "1件の顧客データを新規登録しました。"
// "情報メッセージ?" は、exactTexts に展開される。
情報メッセージ? "1件の顧客データを新規登録しました。"
情報メッセージ?? "1件の顧客データを新規登録しました。"
// 他に「エラーメッセージ」「警告メッセージ」がある。
== 顧客の詳細表示のテスト
ページタイトル? "顧客 詳細表示"
値確認 顧客.顧客名称 "山田"
値確認 顧客.会社名称 "ジャスミン商事"
値確認 顧客.電話番号 "09000000000"
値確認 顧客.業種リストボックス "流通"
値確認 顧客.業種ラジオボタン "流通"
値確認 顧客.業種チェックボックス "流通" "製造"
値確認 顧客.生年月日リストボックス形式 "1972-5-15"
値確認 顧客.写真 "myphoto.png"
ダウンロード 顧客.写真 "myphoto.png"
値確認 顧客.メールアドレス "yamada" "y@mada"
値確認 顧客.問い合わせ[1].日付 { TEXT(TODAY(),"yyyy-MM-dd") }
値確認 顧客.問い合わせ[1].日付 &今日
値確認 顧客.問い合わせ[1].内容 "電話ありました。"
値確認 顧客.問い合わせ[2].日付 &明日
値確認 顧客.問い合わせ[2].内容 "回答しました。"
サイズ確認 顧客.問い合わせ "2"
値確認RO 顧客.登録ユーザ "admin"
出力非存在 顧客.顧客名称
== 顧客の検索テスト
画面 検索
ページタイトル? "顧客 検索"
検索条件 顧客.ID(下限) "1"
検索条件 顧客.ID(上限) "100"
検索条件 顧客.顧客名称 "山田"
ボタン 検索
ページタイトル? "顧客 検索"
検索結果 "検索条件に合致したデータは1件見つかりました。"
== 顧客の一覧表示テスト
//「一覧画面へ」ボタンをクリック(検索画面と一覧画面が分かれている場合)
画面 一覧
ページタイトル? "顧客 一覧"
検索結果 "1件中、1件目から1件目を表示しています。"
// 一覧の値を確認してから(一覧表示の各行に用意されている)ボタンを操作すること
一覧値確認 顧客[1].ID "1"
一覧値確認 顧客[1].顧客名称 "山田"
ボタン 詳細 顧客[1]
ページタイトル? "顧客 詳細表示"
== 削除
ページタイトル? "顧客 詳細表示"
ボタン 削除
//ボタン [OK]
ページタイトル? "顧客 一覧"
== ログオフ 最終処理
ログオフ
タイトル? "Wagby アプリケーション ログオン"

一覧更新

...
== 一覧更新
画面 一覧更新 "顧客"
ページタイトル? "顧客 一覧更新"
ボタン 登録
入力 顧客[1].顧客名称 "山田"
ボタン コピー 顧客[1]
入力 顧客[2].顧客名称 "佐藤"
ボタン 新規 顧客[2]
入力 顧客[3].顧客名称 "鈴木"
ボタン 保存
情報メッセージ数 "1"
情報メッセージ? "1件の顧客データを新規登録しました。" "1件の顧客情報データをコピー登録しました。"
ページタイトル? "顧客 一覧表示"

ワークフロー

...
== ワークフロー
ログオン "yamada" "wagby"
ページタイトル? "メニュー"
メニュー "サービス > 顧客検索"
ページタイトル? "顧客 検索"  
画面 一覧
ページタイトル? "顧客 一覧"
検索結果 "1件中、1件目から1件目を表示しています。"
一覧値確認 顧客[1].顧客名称 "山田"
ボタン 詳細 顧客[1]
ページタイトル? "顧客 詳細表示"
ワークフロー 申請フロー選択 "年休申請フロー"
ワークフロー コメント "年休申請します。"
ワークフロー 申請
// 申請状況の確認
ワークフロー 値確認[1].処理者 "山田"
ワークフロー 値確認[1].処理内容 "新規登録"
ワークフロー 値確認[1].コメント ""
ワークフロー 値確認[2].処理者 "山田"
ワークフロー 値確認[2].処理内容 "申請"
ワークフロー 値確認[2].コメント "年休申請します。"

インポートエクスポート

...
== インポートエクスポート
メニュー  
ページタイトル? "メニュー"
サブメニュー "管理処理 > インポートとエクスポート"
ページタイトル? "インポートとエクスポート"
エクスポート #ALL
ページタイトル? "インポートとエクスポート"
エクスポート "顧客" "お知らせ"
ページタイトル? "インポートとエクスポート"
エクスポート #RESET
ページタイトル? "インポートとエクスポート"
エクスポート #DOWNLOAD "data_test01.zip"
ページタイトル? "インポートとエクスポート"
インポート "data_test01.zip"
ページタイトル? "インポートとエクスポート"
エクスポート #DELETE "data_test01.zip"
ページタイトル? "インポートとエクスポート"

ダウンロード

env.def, rule.def と CustomerTest.tsm およびリポジトリを含んだファイルをダウンロードできます。

ダウンロード後、テストシナリオマクロを customize/test/tsm フォルダに展開してください。

制約

次のケースには対応していません。

  • 一覧表示グリッド形式。
  • 一覧更新画面。
  • エラー/警告/情報メッセージのコード値による判定。
  • 日付型項目のDatePicker操作。
  • 複数ファイルアップロード。(ベースとなるWTFで未対応。)
  • ラジオボタン、チェックボックスで、選択されなかったものの表示。(ベースとなるWTFで未対応。)

記述上の制約

  • 画面に配置するボタン(「保存」など)は「上」に配置してください。下に配置したボタンを押すことには対応していません。
  • 画面の解像度を超えるウィンドウサイズを指定することはできません。
  • 複雑なテストシナリオは、画面単位で操作する複数の小さなシナリオに分割してください。一つの「テスト命令のまとまり」は、一つの画面の操作のみとします。(ここに検索、一覧表示、詳細表示といった複数の画面をまたがるテスト命令を記述することはできません。)

更新履歴

R8.5.1

  • 検索画面で "値確認", "選択肢確認?", "入力存在", "入力非存在" 命令を利用できるようになりました。
  • 画面遷移後、はじめに "入力" か "値確認" 命令を実行すると、対象モデルは自動で用意されます。それ以外の命令を行う場合は "準備" "検索準備" をまず行ってください。これによって対象モデルが用意されます。
  • ボタンが存在しないことをチェックする命令 "-ボタン" を利用できるようになりました。
  • 一覧値確認で「モデル名.モデル参照検索項目.参照先モデル名[INDEX].項目名」という書式を記述できるようになりました。
  • "フォーカスアウト" 命令を用意しました。入力項目にあるマウスのフォーカスを解除します。