GitLab RunnerでUIテストを自動実行してみた

## GitLab とは
[GitLab](https://about.gitlab.com/ja-jp/) とは、ソフトウェア開発のためのDevSecOps（※）プラットフォームです。
※DevSecOpsは、開発（Development）、セキュリティ（Security）、運用（Operations）のプロセスを統合し、効率的かつ安全にソフトウェアを開発・運用するための手法のこと。

GitLab は Gitリポジトリの管理、コードレビュー、CI/CD（継続的インテグレーションと継続的デリバリー）、プロジェクト管理など、ソフトウェア開発の全段階をサポートする機能を提供しています。

## テスト自動化ツールとの連携
今回、UIテスト自動化ツール [Ranorex](https://ranorex.techmatrix.jp/)（※） で作成したテストシナリオをGitLabのCI/CD機能を使って動かしてみました。
※Ranorex は、デスクトップ/Web/モバイルアプリの自動化に対応しています。
　テスト対象アプリのUI操作を記録し、テストの作成/実行を可能とします。

GitLabのCI/CD機能でパイプラインを実行するには、GitLab Runnerというツールを使用します。
今回は、以下のような構成図で検証してみました。
![GitLab実行構成.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3826211/39f48752-3423-4249-1ed4-e3485b007473.png)

 ## 環境構築① PowerShell と GitLab Runnerの設定
 今回、以下のWebページを参考に、環境構築しました。
・GitとCI/CDに関する知識ゼロのSEが、Windows OSにGitLabのRunnerを入れてCI/CDパイプラインでPowerShellコマンドを試すだけ
[https://blogs.networld.co.jp/entry/2022/06/13/130206](https://blogs.networld.co.jp/entry/2022/06/13/130206)

 私の環境では、以下のソフトウェアをインストールしています。
 * PowerShell 7.4.6
 * GitLab Runner ※64bit向けの最新Runnerを使用

## 環境構築② GitLab の設定
GitLab 上では、今回 Personal ProjectとしてRanorex_Integrationプロジェクトを作成しました。
GitLabのリポジトリ上に、Ranorex のソリューション一式をプッシュしています。
GitLabでCI/CD機能を使用するには、プロジェクトのルートディレクトリに .gitlab-ci.yml ファイルを設置します。
![project.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3826211/f13f1187-7a27-6e6d-5fcd-9034ea456d95.png)

ymlファイルには、ジョブ（ビルド、テスト、デプロイなど）を定義し、定義したジョブがパイプライン上で実行されます。
今回は、build と run のジョブを用意しました。各ジョブの概要とymlファイルの内容は、以下となります。
* build ジョブ：リポジトリ上にあるRanorex ソリューションをMSBuildでビルドする
※Ranorex ソリューションは、MSBuildでビルドをかけることで、最新のexeモジュールを作成することができます。
* run ジョブ：新たに生成されたexeモジュールを実行する

```.gitlab-ci.yml
stages:
  - build
  - run

variables:
  MSBUILD_PATH: "C:/Program Files (x86)/Microsoft Visual Studio/2019/BuildTools/MSBuild/Current/Bin/MSBuild.exe"
  SOLUTION_PATH: "ranorex_WebTest\\ranorex_WebTest.sln"
  EXE_PATH: "ranorex_WebTest\\ranorex_WebTest\\bin\\Debug\\ranorex_WebTest.exe"

build_job:
  stage: build
  tags:
    - Ranorex_integration
  script:
    - 'echo "Current directory:"'
    - 'pwd'
    - '& "$env:MSBUILD_PATH" "$env:CI_PROJECT_DIR\$env:SOLUTION_PATH" /p:Configuration=Debug'

run_job:
  stage: run
  tags:
    - Ranorex_integration
  script:
    - 'Start-Process -NoNewWindow -FilePath "$env:CI_PROJECT_DIR\\$env:EXE_PATH"'
  dependencies:
    - build_job

```

## パイプラインの実行
パイプラインを実行すると、順番にジョブが実行されていきます。
![pipeline.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3826211/d856d27d-c302-1f05-029d-11a103139a72.png)
ジョブごとにコンソール画面が表示されるため、ジョブの実行状況も確認できます。
![console.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3826211/8b55b097-2499-193d-a614-90e4ffc08cc7.png)

Ranorex で作成したUIテストを自動実行したので、マシン上でテストが実行されました。
また、Ranorex 側で生成されるレポートも出力されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3826211/a89ba543-6c24-4b03-5442-a906b65da4be.png)

このように、テスト自動化ツールで作成したシナリオをGitLabのCI/CDパイプラインで実行することができました。

## 直面したエラー
RanorexのテストシナリオをGitLab CI/CDパイプラインで実行しようとすると、以下のエラーが発生しました。
>この操作には、対話型のウィンドウ ステーションが必要です。

このエラーは、GitLab RunnerをWindowsのサービスで起動していることが原因でした。
※Windowsのサービスは一般的に対話型セッションを持たないため、UIテスト自動化ツールを実行しようとすると、このエラーが発生することがあります。

対応策として、以下の手順によりエラーが解消されました。
1. Windowsのサービス画面を開き、gitlab-runner を停止します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3826211/0d553d9e-8bd4-be4f-08f0-b7addcc8cd7c.png)

2. コマンドプロンプトを管理者権限で実行します

3. GitLab Runnerの実行モジュールのフォルダーに移動し、以下のコマンドを実行します
>gitlab-runner-windows-amd64.exe run

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3826211/c14c0d88-d0c8-f3a3-c97b-75c61765c114.png)

これにより、GitLab Runnerが起動します。
再度GitLab上からパイプラインを実行するとエラーが解消され、Ranorex のテストが実行できました。

## まとめ
GitLabのRepositoryとCI/CD（Pipelines）機能を使用し、UIテスト自動化ツールで作成したテストを実行してみました。
GitLabを今回初めて触ってみましたが、GitLabのUIは大変わかりやすく直観的に使用できることから、初心者でも使用しやすいと感じました。

自動テストをCI/CDに組み込むことでよりテストの効率性が向上します。自動テストをCI/CDに組み込みたい方は、ぜひ本記事を参考としてみてください。