[T-DASH] テストが失敗したら、teamsやslackに通知させる

# Outline

テスト自動化で、テストが失敗したらteamsやslackに通知させたいときがある。

CIとT-DASHを連携していれば、CIツール上で、teamsやslackに通知させるようにpost設定すればよい。

参考

https://qiita.com/emurin/items/ba2fc4e3e5744ca6d7c5


ただし、CIを使いたくない場合もある。
本記事は、T-DASH単体で、なんとか通知させる仕組みを実現する

https://service.valtes.co.jp/t-dash/


# 技術的な情報

## Automatic variables

robot frameworkでは、実行中のテストに関する情報の、自動変数がある。
これを用いて、テストの状態を知ることができる



https://robotframework.org/robotframework/latest/RobotFrameworkUserGuide.html#automatic-variables

| 変数 | 内容 | 
|:-----------|:------------|
| ${PREV TEST NAME}       | 直前に実行したテストケースの名前        |
| ${PREV TEST STATUS}       | 直前に実行したテストケースの状態、 PASSまたはFAIL        |


## webhook

teamsやslackに通知するとき、pythonには通知用ライブラリがある

pymsteamsやslackwebである
これを用いれば、簡単に通知を送ることができる。


https://pypi.org/project/pymsteams/

https://pypi.org/project/slackweb/

## T-DASHのテストスイート内の挙動

テストスイート内では、複数のテストケースがある場合、一つのテストケースが失敗しても、後続のテストケースが実行される。
つまり、テストケースが実行（成功・失敗関係なく）、次のテストケースが実施されたときに、先ほどの自動変数${PREV TEST STATUS}の情報をもとに制御すれば、失敗のテストケースが発生したときに通知を行うことができる。


参考

https://qiita.com/emurin/items/8445e9d629e191451b41



# T-DASH

## カスタム動作

robotframework library
以下設定ファイルを Log.yamlで保存する

``` @Log.yaml
ACT-CAT-CUSTOM-fe5cf4c9-7f6b-41ca-a1c9-694c399fd681:
  action_category_name: Log
  icon: ''
  color: '#e811cd'
  custom_data:
    file_name: Log
    pip_list:
    - pymsteams
    - slackweb
    library_list:
    - RequestsLibrary
    - lib_notice.py
  actions:
    ACT-CUSTOM-d8d67d32-0e47-47e0-82f7-a0b6c4fa1d73:
      action_name: 前のテストケースが失敗したらteamsに通知
      action_type: operation
      action_format: 前のテストケースが失敗したらteamsに通知
      action_note: ''
      action_args: []
      action_def:
      - - Log
        - 'Pre : ${PREV TEST NAME} : ${PREV TEST STATUS}'
      - - Run Keyword If
        - '''${PREV TEST STATUS}'' == ''FAIL'''
        - send_message2teams
        - ${PREV TEST NAME}
        - ${PREV TEST STATUS}
    ACT-CUSTOM-2e48d614-fb4b-4366-942d-d938ef5a2254:
      action_name: 前のテストケースが失敗したらslackに通知
      action_type: operation
      action_format: 前のテストケースが失敗したらslackに通知
      action_note: ''
      action_args: []
      action_def:
      - - Log
        - 'Pre : ${PREV TEST NAME} : ${PREV TEST STATUS}'
      - - Run Keyword If
        - '''${PREV TEST STATUS}'' == ''FAIL'''
        - send_message2slack
        - ${PREV TEST NAME}
        - ${PREV TEST STATUS}

```
次に、Custom.yamlをT-DASHの動作定義 -> カスタム動作 -> カスタム動作をインポート にてインポートし、実際にインポートされた設定内容を開く

以下のように、2つのカスタム関数が作成される。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267085/5441b5d9-b1b0-d117-e907-2d3f616e2b75.png)



python ライブラリ
以下スクリプトを lib_notice.pyのファイル名として保存する

```@lib_notice.py
# pip install pymsteams

import pymsteams
import slackweb


team_webhook_url = "https://webhook.office.com/xxxxx"
slack_webhook_url = "https://hooks.slack.com/xxxxx"

def send_message2teams (testcase,status):
	
	teams = pymsteams.connectorcard(team_webhook_url)
	teams.title("T-DASH alert")
	teams.text("TestCase : " + testcase + " , " + "Status : " + status)
	teams.send()

def send_message2slack (testcase,status):
	
	slack = slackweb.Slack(url=slack_webhook_url)
	slack.notify(text="TestCase : " + testcase + " , " + "Status : " + status)

```

尚、webhookのurlや送るメッセージは適時修正すること。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267085/174b7440-6317-a791-3deb-9764d91da151.png)

先ほどインポートしたカスタム関数を開き、ライブラリを追加するをクリックする

開くと、pipインストールとLibraryが以下のようになっています。
もし、なっていない場合、installを行ってください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267085/f2dd9fd2-97ae-a69a-45e7-89c02ff8b390.png)


上記で作成したpython scriptを下図の自作ライブラリのフォルダに格納する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267085/3d1f0ab9-7987-7cd4-8bce-e170518c01ce.png)

## テストケース

通知を行うだけのテストケースを作成します
今回は、teams通知のカスタム関数を使った例を示す。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267085/98ade370-79e7-888b-b05d-007122df5ce1.png)

## テストスイート

テストスイート内で、実行させる各テストケースの次に、先ほどの通知のテストケースを呼び出します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267085/bdced2ec-4abc-79a0-d5a6-66773f47b666.png)

## テスト実行

今回の例では、失敗させるテストケースで失敗します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267085/a7532568-a642-b800-5cec-e839ef6027aa.png)

失敗させたため、teamsに以下のように通知されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267085/b5856d82-feed-279a-90d3-171e6a41708f.png)