T-DASHのテスト実行完了をチャットで通知してみた！

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

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

2022/12/4担当記事はこちら

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

2022/12/5担当記事はこちら

https://qiita.com/94dango/items/9429fa4eec20a994cc61

[『テスト自動化ツール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」のテストシナリオの実行が完了したら、 **チャットでテスト完了のお知らせを通知** したい。

:::note info
「T-DASH」のテスト実行を自動実行する方法は2022/12/5担当記事
T-DASHのテストシナリオ実行を自動化出来るかやってみた！
https://qiita.com/94dango/items/9429fa4eec20a994cc61 で紹介しています。
:::

# 調査

「T-DASH」で **テストシナリオのテスト実行が完了すると、画面上で通知メッセージが表示** されます。

![mpc-be64_pP4v76U32V.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/302008/d93f210f-e0f8-2930-3c5e-6f6a9accb140.png)

単発で実施するテストであればテスト実行完了まで画面を見ていてもよいのですが、次のような課題があります。

- スモークテストやリグレッションテストなど頻繁に自動テストする場合、毎回社員が画面を見るのは人件費が高くつく（失敗する可能性が低いテストほど無駄なコストを支払うことになる）
- 短いテストシナリオなら待っていられるが、5分以上かかるようなテスト実行の完了をじっと待つのは精神的にツライ

上記課題を回避する方法として「テスト実行完了をリアルタイムに目視で確認せず、後で任意のタイミングで実行完了を確認する」運用でカバーすることも可能です。
しかし、そもそもテスト効率化（省力化）のためにテスト自動化を導入される企業が多いのではないでしょうか。
テスト実行が完了したのなら、さっさと実行結果を確認（成功/失敗）し、 **万一失敗していたらすぐに調査したい** とエンジニアの多くは思うのではないでしょうか。

画面に付きっきりにならず、テスト完了を普段の業務のコミュニケーションツールとして利用しているチャット（LINE、Googgle Chat、Slack、Temas、Skypeなど）にリアルタイム送信出来れば、とっても助かると思いませんか？

「T-DASH」でテスト実行結果をチャットへ通知出来れば、この課題をクリア出来そうです。
それでは早速「T-DASH」でチャット通知を設定していきましょう……とご紹介したい所ですが、
残念ながら記事執筆時点で「T-DASH」でテスト実行完了をチャット通知する機能は用意されておりません。

「T-DASH」でテスト実行が完了すると、テスト結果レポートが生成されます。
このテスト結果レポートの生成を監視すれば、テスト完了したことをキャッチ出来そうです。

ということで、本記事では **テスト実行完了をチャット通知できるか** 挑戦していきます！！

# 基本仕様

さてやることは至ってシンプルです。
テスト実行が完了したら、テスト結果レポートが生成されたことを何からの方法でキャッチして、チャットに投稿するプログラムが必要になります。

- テスト実行の完了（「テスト結果レポート」が生成された）を、（ほぼ）リアルタイムに自動的にキャッチする
- キャッチした結果（テスト完了）をチャットに自動的に送信する

# 設計

テスト結果レポートの生成をキャッチする手段として「watchdog」ライブラリを利用します。
通知先のチャットツールは何でもよいのですが、今回はLINEに通知していきます。
「requests」ライブラリは、LINEのWebhookへPOSTリクエストするために利用します。
「PyYAML」ライブラリは、LINEのアクセストークンを外部のYAMLファイルから読み込むために利用しています。
※アクセストークンをソースコードにハードコーティングしたくないためです。

:::note info
本記事では次の環境で動作を確認しています。
・Windows11(22H2)
・T-DASH Ver.2.0.003
・Python Ver.3.10.0
・watchdog Ver.2.1.9
・requests Ver.2.28.1
・PyYAML Ver.6.0
・LINE Ver.7.14.1.2907
:::

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

# 環境構築

Pythonインストールします。

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

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

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

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

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

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

```terminal:terminal
(.venv) PS D:\my_python\tdash\tdash_end_watcher> pip install requests requests PyYAML
```

```terminal:terminal
(.venv) PS D:\my_python\tdas\tdash_end_watcher> pip list
Package            Version
------------------ ---------
certifi            2022.9.24
charset-normalizer 2.1.1
idna               3.4
pip                21.2.3
PyYAML             6.0
requests           2.28.1
setuptools         57.4.0
urllib3            1.26.13
watchdog           2.1.9
```

これで環境の準備は完了です。
LINEのWebhookの設定方法について本記事では解説しておりません。

LINEの公式ドキュメントをご参照ください。

https://developers.line.biz/ja/docs/messaging-api/receiving-messages/

# 実装

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

```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\
```

# いざ、実行！！

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

https://twitter.com/i/status/1602487616192262144

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/5 担当の記事[「T-DASHのテストシナリオ実行を自動化出来るかやってみた！」](https://qiita.com/94dango/items/9429fa4eec20a994cc61 ) と組み合わせてあげれば、 **テスト実行からテスト完了通知までをすべて無人化することだって出来ますね！** 
「出来たらいいな（魅力的品質）」が叶うと、とっても嬉しいですね！

https://qiita.com/94dango/items/9429fa4eec20a994cc61 

## 今後の課題

テストの実行完了をチャットに通知する出来るようになりましたが、 **テスト結果（成功/失敗）の情報も知りたい** ですよね。
※一つ出来ると、さらに欲求が出てきてキリがないですけれど。

時間があればテスト結果（成功/失敗）の情報も通知できるよう改良に挑戦していきたいと思います。

仕組みを作るまで多少の工数はかかりますが、一度作ってしまえば何かと便利になりそうです。
**「利用したい機能がないからテスト自動化ツールの導入を断念する」のではなく、ツールで出来ない部分を工夫次第で課題を解決出来ないかも含めて検討** することもQAエンジニアには必要なスキルかもしれません。
今回もよい学びがありました。
**Qiitaアドカレは、学びを増やすよい機会となっております。**
最後までお読みくださいまして、ありがとうございました。