T-DASHのテストシナリオ実行を自動化出来るかやってみた！

本記事は、[『テスト自動化ツールT-DASHの活用方法や事例を記事にしよう！ by T-DASH Advent Calendar 2022』](https://qiita.com/advent-calendar/2022/t-dash02)に参加しています。
よろしくお願いいたします！！
2022/12/5を担当しております。

https://qiita.com/advent-calendar/2022/t-dash02

前回（12/4）の担当記事

https://qiita.com/94dango/items/e1b111bbbe3073e4d4e7

[『テスト自動化ツールT-DASHの良い点・悪い点をレビューしてみた！ by T-DASH Advent Calendar 2022](https://qiita.com/advent-calendar/2022/t-dash01)』にも参加しております。

https://qiita.com/advent-calendar/2022/t-dash01

T-DASH」の使い方全般の記事はこちら

https://qiita.com/94dango/items/aa302f7bafc0598e8e68

本記事は、 **「T-DASH」のテストシナリオを自動実行出来るのか** 試した記事です。

「T-DASH」はE2Eテストを自動化するアプリです。「T-DASH」で作成済みのテストシナリオを自動実行出来れば、CI/CDに組み込むことでスマートにデプロイとスモークテストを実現できるかもしれません。
ところが残念なことに「T-DASH」はCI/CDツールとの連携インターフェースがありません。またテストシナリオをスケジュール実行する機能も備わっていません。つまりテストシナリオは毎回手動で実行開始しないとテストが実行できないわけです。

せっかくテストを自動化できるアプリなのに、このアプリの実行自体を自動化出来ないのは非常にもったいないです。
ということで、本記事では「T-DASH」のテストシナリオを自動実行出来るのか挑戦していきたいと思います。

:::note info
本記事では次の環境で動作を確認しています。
・Windows11(22H2)
・T-DASH Ver.2.0.003
・Python Ver.3.10.0
・Selenium Ver.4.7.2
:::

:::note warn
※「T-DASH」本体が提供している機能ではなく、無理やり自動実行しています。当然サポート対象外の利用方法ですのでご承知の上、ご覧ください。
:::

# 要求仕様

「T-DASH」の作成済みのテストシナリオを選択し、テスト実行を開始して終了するまでを自動化したい。

- 複数テストシナリオがあることを想定し、一意のテストシナリオを選択して実行できること
- 自動実行は、複数回実行できること

# 調査

- 「T-DASH」はブラウザーで動作するアプリであるため、ブラウザー（httpリクエスト）を利用して、「T-DASH」を操作する必要があります。
- テストプロジェクトには一意のURLが割り当てられており、「T-DASH」アプリが起動している状態であれば、URLに直接アクセスすることで実行したいテストプロジェクト画面にアクセスできます。
- テストプロジェクト画面にあるテストシナリオのテスト実行ボタンは<button>要素になっているため、この要素を叩く必要があります。

# 基本仕様

上記の調査結果を踏まえて、次の方針で試すことに決定しました。

1. 何らかの方法でテストプロジェクトのURLにアクセスする。
1. テスト実行ボタンをクリックして、テスト実行する。

# 設計

ブラウザーを操作する手段として、seleniumを利用していきます。

# 環境構築

Pythonインストールします。

```terminal:terminal
>python -V
Python 3.10.0
```

開発用のフォルダーを作成し、仮想環境を作成します。 

```terminal:terminal
>cd d:
>cd my_python
>mkdir tdash
>cd tdash
>py -m venv .venv
```

VSCodeで開発用フォルダーを開き、インタープリターを仮想環境に切り替えます。

```terminal:terminal
>PS D:\my_python\tdash> &  d:/my_python/tdash/.venv/Scripts/Activate.ps1
```

Selenium を pip install します。
バージョン指定しなかったので最新版がインストールされました。

```terminal:terminal
(.venv) PS D:\my_python\tdash> pip install selenium
```

```terminal:terminal
(.venv) PS D:\my_python\tdash> pip list
Package          Version
---------------- ---------
（省略）
selenium         4.7.2
```

これで環境の準備は完了です。

# 実装

コードは[github](https://github.com/lilucso01git/start_tdash)からダウンロード出来ます。

```python:end.watcher.py
from watchdog.observers.polling import PollingObserver
from watchdog.events import RegexMatchingEventHandler
import time
import requests
import yaml

# LINE にメッセージを送信する
def line_notify(msg, TOKEN):
    try:
        access_token = TOKEN
        msg = msg + "\nテストが完了しました。"
        
        headers = {'Authorization': 'Bearer ' + access_token}
        payload = {'message': msg}
        
        print("LINE メッセージを POST します。")
        r = requests.post(LINE_NOTIFY_URL, headers=headers, params=payload,)
        if r.status_code == 200:
            print("LINE メッセージを送信しました。")
        else:
            print("ステータスコード: " + r.status_code)
            raise Exception
    except Exception as e:
        print(e)

class MyFileWatchHandler(RegexMatchingEventHandler):
    def __init__(self, regexes):
        super().__init__(regexes=regexes)

    # ファイル作成時の動作
    def on_created(self, event):
        filepath = event.src_path
        line_notify(filepath, TOKEN)


if __name__ == "__main__":

    # config を読み込む
    try:
        with open("./config.yaml", "r", encoding="utf-8") as f:
            config = yaml.safe_load(f)

        # LINE_NOTIFY_URL
        LINE_NOTIFY_URL = config["chat_url"]
        # LINE access_token
        TOKEN = config["access_token"]
        # 監視対象パス
        TARGET_PATH = config["target_path"]
    except Exception as e:
        print(e)

    # 対象ファイルパスのパターン
    PATTERNS = [r'.+report-.+.html$']

    # 監視を開始する
    event_handler = MyFileWatchHandler(PATTERNS)
    observer = PollingObserver()
    observer.schedule(event_handler, TARGET_PATH, recursive=True)
    observer.start()
    try:
        while True:
            time.sleep(5)
    except KeyboardInterrupt:
        observer.stop()
    observer.join()  
```

```yaml:config.yaml
chat_url : https://notify-api.line.me/api/notify
access_token: {あなたのアクセストークン}
target_path: C:\Users\{ユーザー名}\AppData\Local\Programs\T-DASH\projects\
```

# いざ、実行！！

**◆ 実行の様子（動画）**

ここに動画を入れる

1. 「T-DASH」を起動しておきます。
1. 「end.watcher.py」を実行します。
1. 「config.yaml」ファイルで定義している「target_path」のフォルダーをポーリング（5秒おき）監視します。
このフォルダーに **「"report-*.html"」ファイル（「テスト結果レポート」ファイル）が作成されたら、以降の処理が動作** します。
1. 「T-DASH」でテストシナリオを開きテストを実行します。
1.  **テスト実行が完了すると、「テスト結果レポート」ファイル（「"report-*.html"」）が作成** されます。
すると、ポーリングの **監視条件にヒット** します。
1. テスト結果レポートのファイル名と、テスト完了メッセージを **LINEに自動送信** します。

:::note info
LINE以外のチャットツールを利用している場合は、ソースコードの「line_notify」関数の部分をチャットツールのWebhook仕様に合わせて改造
すれば対応できます。
:::

# まとめ

いかがでしたでしょうか。
今回は「T-DASH」のテスト実行結果をチャットへ自動送信出来るかやってみました！
画面の前でじっと待っていなくても、テスト実行完了を（ほぼ）リアルタイムで普段利用しているチャットツールで確認することが出来ましたね。
2022/12


ノーコードでテストを自動化できるテストツール「T-DASH」のテストシナリオを自動実行するために、Seleniumでコード書いて自動化するのは、スマートじゃないですよね。
今後のバージョンアップで、標準機能としてテストシナリオの自動実行、スケジュール実行、CI/CD連携機能が実装されることを期待したいと思います。
最後までお読みくださいまして、ありがとうございました。