有償のUIテストツールとはどんなものか、とりあえず触れてみた

今回は、[**Ranorex**](https://ranorex.techmatrix.jp/ "Ranorexサイト")という製品のトライアル版を使用して、UIテストツールを体験してみました。Ranorexは、**Windowsアプリ**、**Webアプリ**、**モバイルアプリ**に対応したUIテストを自動化するための有償ツールです。

*※Ranorexは海外製品ですが、国内では総販売代理店の[**テクマトリックス社**](https://www.techmatrix.co.jp/index.html)から日本語版がリリースされています。*

##### もくじ
1. 準備
1. テスト作成
1. テスト実行
1. テスト結果の確認
1. テスト運用
1. 感想

## 1. 準備
Ranorexは、オンプレのツールで[**Windows環境**](https://ranorex.techmatrix.jp/requirements/ "ソフトウェア要件")にインストールして使用します。
インストーラー(exe）は、テクマトリックス社の[**Ranorex製品サイト**](https://s.techmatrix.co.jp/form/RXtry0001IND?k3ad=RX_HEADER&_gl=1*uov41e*_gcl_aw*R0NMLjE3MTkyODQ0NjMuRUFJYUlRb2JDaE1JajZibzJlSDFoZ01WbUdBUEFoMGgzZ085RUFBWUFTQUFFZ0lZWWZEX0J3RQ..*_gcl_au*MTQxMTM4Nzk1My4xNzE3NDg4ODA3*_ga*MTgxNDc2NjAyNy4xNjk5NDI5NTIx*_ga_0GKP80182F*MTcyMTk1NjE0NC4zODkuMS4xNzIxOTU3NTE4LjU4LjAuMA.. "体験版ダウンロード")から入手できます。また、ライセンスの申請手続きやインストールなどは不要であり、Ranorexをインストールした時点で14日間は無償で使用できるようになります。
*※本記事では、国内リリース版の最新バージョン（v11.3.3）のRanorexを使用しています。（2024/08/22 時点）*

### テスト対象アプリとテストケース
#### テスト対象アプリ
トライアル用に提供されている[**Windowsアプリ（RxDemoApp.exe）**](https://support.ranorex.com/rx-media/rx-user-guide/v8.2/download/RxDemoApp.zip "RxDemoApp.exe")を使用します。

#### テストケース
1. アプリ（RxDemoApp.exe）を起動します。
1. **Intoduction** タブをクリックします。
1. **Enter your name** の入力フォームに **Taro** と入力します。
1. **Submit** ボタンをクリックします。
1. 画面上に **Welcome, Taro!** と表示されることを確認します。
1. アプリを終了します。

## 2. テスト作成
### 2-1. プロジェクト作成
はじめにRanorexのプロジェクト（ソリューション）を作成します。
このプロジェクトにテストスクリプトやオブジェクト情報などが保存されます。
<details><summary>手順</summary>

1. Windows のスタートメニューを選択し、**Ranorex Studio 11** を選択後、**Ranorex（Ranorex Studio）** を起動します。または、デスクトップに起動用のアイコンが作成されている場合は、アイコン（RanorexStudio 11 (32bit)）をダブルクリックして起動します。<br><br>
1. **ファイル** メニューから、**新規作成** - **ソリューション（ウィザードを使用）** を選択します。<br><img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3826232/abedbcd2-cf1d-7b2c-22cf-4f244b5603ae.png"><br><br>
1. 表示される画面で、次の設定をおこないます。<br>
    1. **Desktop** をクリック（※テスト対象アプリの種類を選択）<br>
    1. **続行** をクリック<br>
    1. **アプリケーションの参照** タブの **アプリ参照** をクリックし、サンプルのWindowsアプリ（RxDemoApp.exe）を選択後、**続行** をクリック<br>
    1. **単一のアプリをレコーディング** を選択し、**続行** をクリック<br>
    1. **完了** をクリック<br><br>
1. Ranorex Studioに、作成したプロジェクト（ソリューション）が表示されます。<br><img width="600" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3826232/fc57e77d-cd4c-7a49-f00e-d933488b9175.png">
</details>

### 2-2. テストスクリプトの作成
次に自動化用のテストスクリプトを作成します。Ranorexは、アプリの画面操作をテストスクリプトとして自動生成してくれるレコーディング機能があります。

<details><summary>手順</summary>

1. テストスクリプト（Recoding1）をダブルクリックします。<br><img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3826232/533a762e-0751-630d-0272-44ff09297de3.png"><br><br>
1. 表示されるテストスクリプトの画面で **RECORD** をクリックします。<br><img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3826232/eac90eeb-da35-633f-20e5-22581f71ded7.png"><br><br>
1. デスクトップの右下にレコーダーが表示され、テストのレコーディング状態になります。この時、実行されるマウスおよびキーボード操作はテストスクリプトとして記録されます。本記事の **テスト対象アプリとテストケース** - **テストケース**を使用してレコーディングをおこないます。<br><img width=400 src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3826232/e8230256-2195-0aba-a849-c8a0ecef2ad3.png">
<br>*※レコーダーの細かい操作（レコーディングの修正や一時停止、スクリーンショットの取得など）は、[**ユーザーガイド**](https://support.ranorex.com/ja/userguide/ranorex-studio-fundamentals/ranorex-recorder/recorder-hotkeys/ "ユーザーガイド")が参考になります。*<br><br>*※テストケースの1）と6）のステップは、**テスト用のプロジェクト作成** で既に作成されているのでここでは、3) ～ 5）までのステップをレコーディングします。*<br><br>
    1. **Intoduction** タブをクリックします。<br>　<img width=500 src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3826232/6fd15c33-f3fa-aa71-b0fc-e6471abfa7c7.png"><br><br>
    1. **Enter your name** の入力フォームに **Taro** と入力します。<br>　<img width=500 src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3826232/c5160dac-aab8-1222-bbaa-af240dab3440.png"><br><br>
    1. **Submit** ボタンをクリックします。<br>　<img width=500 src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3826232/d1df8329-6d4d-1652-c330-f6b16408f05b.png"><br><br>
    1. 画面上に **Welcome, Taro!** と表示されることを確認します。<br>レコーディング中にバリデーションを設定する場合は、以下の操作をおこないます。<img width=500 src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3826232/d05185a0-29eb-10ab-0995-a42547a71c5f.png"><br><br>
        1. )　デスクトップの右下にレコーダーにある **Validate** をクリックします。<br>　　　<img width=400 src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3826232/9f6f7339-0384-4fe0-af51-28c3942e24af.png"><br><br>
        1. )　**Welcome, Taro!** の文字列にマウスカーソルをあて、紫色の枠で囲まれたらクリックします。<br>　　　<img width=400 src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3826232/90d5ab27-bb09-7e28-2452-f4671559d60e.png"><br><br>
        1. )　**次へ** をクリックします。<br>　　　<img width=400 src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3826232/62f09605-5230-ebe6-31d4-e92517793c0e.png"><br><br>
        1. )　**Text** のチェックボックスのみを有効にし、**OK** をクリックします。<br>　　　<img width=400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3826232/ae7c7112-5fba-65cc-11ad-1247d59af42d.png"><br><br>
1. レコーディングの終了後、レコーダーの **STOP** をクリックします。<br><img width=400 src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3826232/90720492-3f98-0afe-f4a1-77dad0a2762a.png"><br><br>
1. 画面操作と画面内のオブジェクト情報がテストスクリプト（Recoding1）に記録されます。<br><img width=500 src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3826232/90e965c4-5cfd-d5f7-dfb0-6aef3645194c.png">
</details>

## 3. テスト実行
1. **テストスイート** を表示します。<br>*※テストを実行する前に、テスト対象アプリを終了しておきます。*
<img width=500 src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3826232/71ed1f86-ce0f-fe69-015a-c0e74d1306c4.png"><br><br>
1. **RUN** をクリックするとテストが実行されます。<br><img width=500 src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3826232/c8b895a3-eb85-9565-f5e7-e9d12f3caf1f.png">


## 4. テスト結果の確認
テスト終了後、テスト結果レポートが生成され、Ranorex Studio上に表示されます。
各テストケースごとにアクションの実行ログがレポートされ、バリデーションの結果として成功が緑色、失敗が赤色の文字で表示されます。
<img width=700" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3826232/242b3820-c473-6529-8daf-5a5fbcb50496.png"><br>
バリデーションの結果が失敗の場合は以下のようにレポートされます。
メッセージの **actual** が実際の値（**'Welcome,·Taro!**）で、**expected** が期待する値（**Welcome,·Hana!**）です。<br><img width=700 src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3826232/9f3081fc-720d-6f18-fc9c-6b2053915090.png"><br>

スクリーンショットを取得した場合は、以下のようにレポートされます。
レポート内のスクリーンショットをクリックすると、フルサイズのスクリーンショットが参照できます。
<img width=500 src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3826232/1ace7387-0b7a-928e-d659-93cce4368382.png">


## 5. テストの運用
Ranorexで作成したテストは、exeファイルとして出力されるので、バッチでの夜間実行や、CI環境に簡単に組み込むことができます。<img width=500 src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3826232/35d0ce3e-73fe-526e-26c2-d6551186b195.png">

また、コマンドライン実行時にオプションも用意されているので、テスト環境に合わせてテスト内容を変えることも可能です。

<details><summary>コマンドオプション 一覧</summary>

    help|?
        このヘルプ テキストを表示します。
    listconfigparams|lcp
        設定可能なすべての設定パラメーターとその値の一覧を表示します。
    config|cfg:<config parameter name>=<value>
        設定パラメーターの値を設定します。
    agent|a:<agent name>
        指定したエージェントへテスト実行をリダイレクトします。
        /a:<agent>  エージェント名、マシン名、または URL  (http://<ip>:8081/api) を指定します。
        /a:[<tags>]  タグ(カンマ区切り)を指定します。タグにスペースが含まれる場合にはクォートで囲ってください。
        /a:?  設定よびネットワーク上で見つかったすべてのエージェントをリストします。
    artifacts:<file patterns>
        テスト実行の成果物として収集するファイルのパターンをセミコロン区切りで指定します。'agent' パラメーターの指定が必要です。
        デフォルトは '*.rxzlog;*.junit.xml' です。
    endpoint|ep:<endpoint name>
        テスト実行中にオートメーション ルートとして使用されるエンドポイントの名前を指定します。
        指定されていない場合、'localhost' が使用されます。
    endpointconfig|epc:<configuration name>
        テスト実行中にエンドポイントで使用される設定名を指定します。
        エンドポイントの種類によっては使用できません。
    endpointconfigfilepath|epcfp: <configuration file path>
        テスト実行中にエンドポイントで使用される設定ファイルのパスを指定します。
    maintenancemode|m
        メンテナンスモードを有効にします。RanorexException が Test Suite Runner によりキャッチされ、
        テスト実行が中断されるとともにダイアログが表示されます。
    testrail
        テスト実行結果を TestRail にレポートします。'truser' および 'trpass' パラメーターの指定が必要です。
    truser
        TestRail へサインインするためのメールアドレスを指定します。'testrail' パラメーターの指定が必要です。
    trpass
        TestRail へサインインするためのパスワードまたは API Key を指定します。'testrail' パラメーターの指定が必要です。
    trvideo
        (オプション) TestRail にビデオレポートをアップロードします。'testrail' パラメーターの指定が必要です。
    trrunid
        (オプション) テスト実行結果をレポートする、TestRail における TestRun の識別子を指定します。
        このオプションを指定しない場合、新しい TestRun が作成されます。
    trrunname
        (オプション) テスト実行結果をレポートする、TestRail における新しい TestRun の名称を指定します。
        このオプションを指定しない場合、初期設定が使用されます。
    jiratasks|jit:<set of tasks>
        /jit:on     Jira 設定ファイルに関係なく、すべてのタスクを有効にします。
        /jit:off    Jira 設定ファイルに関係なく、すべてのタスクを無効にします。
        /jit:t1,t2  Jira 設定ファイルに関係なく、有効にしたいタスクをカンマ区切りで指定します。
                    他のすべてのタスクは無効になります。(有効なタスク名: createlink, autohandle)
    jirauser|jiu
        Jira へサインインするためのユーザー名を指定します。
    jirapass|jip
        Jiraへサインインするためのパスワードまたは API Key を指定します。
    reportfile|rf:<report file path>
        レポート ファイルの名前 (およびパス) を設定します。
        パスが指定されない場合は、現在のディレクトリが使用されます。
        デフォルトでは、rxtst ファイルに指定されたファイル名が使用されます。
        (例: %S_%Y%M%D_%T.rxlog)
    zipreport|zr
        レポート (関連ファイルを含む) を 1 つのアーカイブ (".rxzlog") に圧縮します。
    junit|ju
        レポートを JUnit フォーマットで生成します。レポートは標準のレポートと同じ場所に配置されます。
    zipreportfile|zrf:<zip report file path>
        zipreport|zr とともに使用し、圧縮レポート ファイルの名前 (およびパス) を設定します。
        パスが指定されない場合は、レポート ファイルのパスが使用されます。
        ファイルの拡張子が ".rxzlog" ではない場合、".rxzlog" に置換されます。
        デフォルトでは、rxtst ファイルで指定されたレポート ファイル名、または reportfile|rf で指定された値に、
        拡張子 ".rxzlog" を付けたものが使用されます。 (例: %S_%Y%M%D_%T.rxzlog)
    reportlevel|rl: Debug|Info|Warn|Error|Success|Failure|<any integer>
        ログ メッセージがログ ファイルに含まれるために必要とされる最低限のレポート レベルを設定します。
        レポートを完全に無効にするには 'None' を指定します。
        これらのレベルに対応する整数値は次のとおりです。
        Debug=10, Info=20, Warn=30, Error=40, Success=110, Failure=120
    videorecording|vr: Off|KeepFailedTests|KeepAllTests
        ビデオ レコーディング モードを設定します。
    videorecordingsource|vrs: Auto|Screen1..Screen4
        ビデオ レコーディングの対象スクリーンを設定します。'Auto' の場合、マウス カーソルがあるスクリーンが使用されます。
    listglobalparams|lp
        すべてのグローバル パラメーターとその値の一覧を表示します。
    listtestcaseparams|listtestcontainerparams|ltcpa:<name or guid of test case>
        すべてのテスト ケース パラメーターとその値の一覧を表示します。
    testcase|testcontainer|tc:<name or guid of test case>
        このテスト ケースのみを実行します。
    testsuite|ts:<path to test suite file>
        テスト スイート (rxtst) ファイルで定義されたテスト ケースを実行します。
        デフォルトでは次の設定が使用されます。
        - <TestSuiteExe> と同じ名前の rxtst ファイルを使用
        - または <TestSuiteExe> と同じフォルダーにある最初の rxtst ファイルを使用
    runconfig|rc:<configuration name>
        rxtst ファイルで定義されている指定の設定のテスト ケースを実行します。
        設定は、Ranorex Studio またはテスト スイート ランナーを使用して編集できます。
        デフォルトでは、現在選択されている実行設定が使用されます。
    module|mo:<module name or guid>
        指定された名前または guid を持つモジュールを実行します。
        <TestSuiteExe> によってロードされたアセンブリと rxtst ファイルで参照されているアセンブリが検索されます。
    param|pa:<global parameter name>=<value>
        テスト スイートに指定されたグローバル パラメーターの値を作成または上書きします。
    testcaseparam|testcontainerparam|tcpa:<name or guid of test case>:<parameter name>=<value>
        テスト スイートに指定されたテスト ケース パラメーターの値を作成または上書きします。
    runlabel|rul:<custom value>
        テスト実行に対して、カスタムの実行ラベルを設定します。
    runid:<custom value>
        テスト実行に対して、カスタムの実行識別子を設定します。
    sutversion:<custom value>
        テスト実行に対して、テスト対象アプリのバージョンを設定します。
    testcasedatarange|testcontainerdatarange|tcdr:<name or guid of test case>=<data range>
        テスト ケースのデータ範囲を設定します。
</details>

## 6. まとめ
最近の有償ツールにはある標準機能（データ駆動テスト、スクリーンショット、画像比較、分岐など）は実装されている。また、対応アプリの種類や細かな機能設定ができる分、ツールの学習コストが掛かりそうなイメージであるが、そこは、無償のトレーニングやQAサイトなどが用意されているため、これらを活用することでカバーできそうです。
基本、ノーコードでテストケースを作成するツールであるが、コードも使用できるため、テストスクリプト内の特定の操作のみをコード化するなど自由に拡張することもできます。