Background
RanorexはWebのE2Eテスト自動化に優れている。
自動化がむつかしい部分の実装や、保守性等を考えての実装方法のtipsを列挙する
1. 変数系
変数の変数化
処理の中で、複数の変数に対してルーチン処理をさせたい場合がある
配列を使う手段もあるが、Ranorexの場合、外からのデータソースの授受は配列が使えない。
対応策
Reflectionを活用する
例えば 変数 local_aite_uma1_flag ~ local_aite_uma16_flag に対してルーチン処理を行いたい場合
- 数字の部分を変数化し、1-16でループさせる
- 変数名を "GetType().GetProperty" で作成する
- 作成した変数の変数の値を取得する場合、"GetValue"で取得
- 作成した変数の変数に値を代入する場合、"SetValue"で設定

2. 文字入力系
Key Sequence 文字入力
文字入力を行う一つの方法として、"Key Sequence"がある。
ただ、これを使うときには注意点がある。
windows上の文字入力モードに依存する点である。
課題
たとえば、英数文字を自動化で入力する処理があるとする。
ただ、IMEの日本語入力モードになっていると、日本語変換しようとした入力になってしまう。
そのため、実行時に入力モードを意識する必要がある。
対応策
- 入力モードのオンとオフをホットキーに割り当てる
今回の例では、"USモードに切り替える"を"Ctrl+0"とする


3. 値
画面上の値を正規表現等で取得
課題
文字列から一部値をとりたいことがある。
例えば、カンマ付き数字列から数字を取りたい場合等
対応策
- "Get Value"で取得する文字列から値をとるアクションを定義する


参考
C#で文字列操作するによく使う関数は以下のとおり
- Regex , Match を用いた正規表現
- Replace を用いた 文字変換(削除)
select のsetvalueの値指定
課題
Ranorexでselect-boxで値を選択する処理をcaptureすると、下図のようにactionがとられる
Action | Set value |
---|---|
Name | Tag Value |
Value | select HTML tagのoptionの値 (今回の例では 三連複は"8"である) |

この場合、この設定する値を変数化し、データドリブン等で値を設定する場合、optionの値を入れる必要がある。(今回の例では、単勝=1, 複勝=2, 三連複=8 etc)
こうなると、データドリブンのデータを用意するとき、そのoptionの値を入れる必要があり、mapping tableを持つ必要がでてくる。
解決
以下のステップで、select-boxで表示されている文字列を選べるようにする
- SPYでoptionのオブジェクトをrepositoryとして取る
この時、図のように WebElementとしてinnertextでとる - 1で取得したオブジェクトのinnertextに対する値を変数にする
- 1で取得したオブジェクトを"Invoke action" の "Select"でActionに追加する


4. 処理分岐
要素が表示されているときに正しいと判断する
課題
CSSでコンテンツの表示の制御を行っている場合、画面上存在しないが
要素を認識する場合がある。
これは、RanorexがHTMLベースで要素を認識しているためで、画面の表示の確認をdefaultしていないからである(と思う)
対応策
Xpath に @Visible='True' を定義する。
このoptionは表示の有無を確認している

5. 動作安定性
WebがLoad終わってから自動化処理を進める
Ranorexは、ページ遷移が完全に終わるのを待たない。
次のアクションの実行に入るが、その時にそのオブジェクトが出現するのを待つ。
そのため、ページがロードしてから次の処理に進んでいるように見える。
課題
CSS等でコンテンツレイアウトを定義している場合。
ページ表示にバナー等順次読み込み、その次にレイアウトを組み立てていくページがある。
この場合、バナーの配置がロード中に変わってしまう。
Ranorexは、バナーが出現したらマウスクリック等を行おうとするが、レイアウトが変わってしまうので
失敗してしまう可能性がある。
対応策
ページ遷移が発生した後、 WaitForDocumentLoaded 関数を読み出す
これはコンテンツが読み終わるまで(timeout指定可能)待つ

validateするときのrepositoryの存在チェック
ValidateのAttributeContainを実施するとき、そのrepositoryが完全な形(LOADが完全に終わり表示されている)になっていないと、失敗するときがある
以下がそのエラーの例
Module execution was aborted because a validation step has failed.
Attribute 'InnerText' of element for item 'XXXXX' can not be evaluated (element is not valid).
これは、画面が表示され、そのrepositoryのattributeを取りに行くが、完全に表示されてないため
失敗する
そのため、これが発生する場合、その直前にrepositoryが存在することを確認する処理waitForなどを使う
repositoryをclickするなどの処理は、そのrepositoryの存在のチェック(timeoutあり)してから進むので、上記問題は考えなくていいが、validationの場合、存在する前提で動いていると思われるので、このようなエラーが起きると思われる
エラー時の処理
Ranorexはエラーが発生したとき、それ以降どのようにふるまうかを設定することができる
-
- 次の繰り返しに移動して続行
-
- 次のテストケースに移動して続行 (default)
-
- 次の親テストケースに移動して続行
-
- 停止

各レコードモジュールで失敗したときに、どうなると最適化を考えて設定する。
例1. ランダムのデータを大量に作成したい場合
繰り返し処理でデータを大量に作成したく、かつ一部失敗しても問題ない場合を想定する。
その場合、1回のループで失敗しても、次のループで改めて実行を繰り返しても問題はない。
その場合の選択肢として、"1. 次の繰り返しに移動して続行"を選ぶとよい
例2. 毎日チェックするタスク(CI)の場合
定期的な動作確認として使い場合を想定する。
その場合、早くエラーを検知通知することが求められる。
その場合、失敗した時点で以降の処理を中断し "4. 停止" 、Jenkinsはエラーを返すのがベター。
原因解析後、再実施させればよい
例3. 失敗しても後処理が必要な場合
スマートフォルダを利用し、最後のスマートフォルダにエラーになったとしても後処理をさせる必要がある場合を想定する。
その場合、"3. 次の親テストケースに移動して続行" を選ぶとよい。
データソース肥大化によるパフォーマンス低下
データソースでエクセルを多く使っていると、Ranorex Studio自体のレスポンスが低下する
その回避策は以下の通りである
”データの自動ロードの無効化”
[データソースの管理]画面 にて [データの自動ロード]のチェックボックスをオフ
6. Mobile
Timeout
appiumをつかった、real device SP web、Native Appをテストするとき、起動時に時間がかかる
そのため、タイムアウトすることがよく発生する
そのタイムアウトを設定にて長めに設定する


Android App install できない
APKをInstrumentするときに失敗するときがある

この時、以下の方法で回避することができる
APKツール 最新化
https://bitbucket.org/iBotPeaches/apktool/downloads/
ここから、最新のAPKをdownloadする
※ただし、Ranorex versionとの相性があるかもしれない
Ranorex 8.3.1 の場合 APK 2.4.0
C:\Program Files (x86)\Ranorex 8.3\Bin\RxEnv\Android\tools\apkTool
ここのapktool.jarと差し替える
Instrumentation flagsに以下オプション(APKファイルの参照メソッド総数の上限設定)を定義する
-static -multidex -smali_redist

APK インストルメントオプションの変更
以下OPTIONの無効化をする
- "Full image comparison"

7. Report
compressed log
実行結果のreportを1ファイルに、圧縮する。
ほかのメンバーと結果を共有するとき、これをONにしてzlogを使うと便利

8. browser open & close
Browserのclose applicationは closeWindowsを使う
close applicationの killProcessは便利なところがある。
ブラウザの複数タブが立ち上がっている場合、タブの数を気にせずに終了させることができる
しかし、それをつかうと、次回起動時警告が出るときがある。
chromeであれば、前回正しく終了できませんでした と。
このアラートがでると、やっかいである。
次回起動時に、その周辺にあるボタンをクリックできないから。
そのため、基本的には closeWindowsを使う。
