E2E自動テストのダッシュボードを作ってみた

# はじめに
私達のチームはスマホアプリを開発しており、ここ半年ほど前からMagicPodを使ってE2Eテストの自動化に取り組んできました。

よし、主要機能のテストは全部自動化できたぞ！
あれ、全部自動でやってくれるのは楽なんだけど実行時間長すぎない？
あれれ、ソースコード変更していないのにいつの間にか失敗するようになったぞ、、、

そしていつしか、使うにも実行時間が長すぎ＆フレーキーな自動テストができあがってしまいました。
これはやばい、何か改善策を、、ということで、まずは自動テストの現状を可視化することから始めよう！とダッシュボードを作ることにしました。

# 作ってみたダッシュボード

そして作ってみたダッシュボードはこちらです。
DatadogのScreenBoardを使っています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3735277/e4d0f599-2e00-9e5f-a48f-36ab50407c18.png)

## テスト実行結果の取得

MagicPodにはWeb APIが用意されていて、実行されたテストの結果を取得することができます。
今回は、BatchRun APIのレスポンスから、テストケースごとの実行結果（status）、実行時間（duration_seconds）を取得しています。

https://app.magicpod.com/api/v1.0/doc/

そして、そのAPIを使ってBigQueryにエクスポートするツールがあります。こちらのツールを参考に今回はDatadogにメトリクスを送信するツールを作りました。

https://github.com/takeyaqa/magicpod-analyzer


## 集計するメトリクス

集計しているメトリクスはMagicPodのテストケースごとの実行回数と実行時間です。
そしてメトリクスごとにMagidPocのテストケース名、実行結果（成功/失敗/中止）、OS情報を付与しています。
これらのメトリクスを用いて以下をダッシュボード上で表示しています。

###  合計（OSごと）成功率

これは単純に全実行回数と成功実行回数を使って成功率を表示しています。

また、しきい値を設定し、そのしきい値を超えたら背景色を変えるなどの設定ができるので、成功率がXX%を下回ったら背景を赤にすることができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3735277/b6455bb9-2e58-f2f4-faad-da7db59aa7ea.png)

### 合計（OSごと）平均実行時間
実行時間を秒数で集計しているので、それをminute（1時間以上であれば自動的にhour）で表示するようにしています。

また、表示するUnit（単位）を設定できます。また「AutoScale Unit」を有効にしておくと自動でminuteからhourに変換してくれます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3735277/dde3a845-33b3-8d77-8cdd-29e4e465d159.png)


### テストケースごとの実行結果分布
メトリクスにテストケース名があるので、成功したテストや失敗したテストごとにどのテストケースが多いかをPie Chartで表しています。この分布によって、フレーキーなテストケースを洗い出すことができるので、複数要素で分布を示すことができるPie Chartはとても良さそうです。

### 日ごとの成功率の分布
日ごとに先ほどの成功率を表示しています。

### 日ごとの実行時間の分布
こちらも、日ごとに合計実行時間を表示しています。

## Datadogのメトリクスの形式

https://docs.datadoghq.com/ja/metrics/custom_metrics/

Datadogへ送信するメトリクスはカスタムメトリクスを使っています。MagicPod Web APIのレスポンスを以下のように変換して送信しています。
こちらはCOUNTタイプを使ってテストケース1つにつきCOUNT数1を送信しています。tagsパラメータにテストケース名、実行結果（成功/失敗/中止）、OS情報をつけることで、ダッシュボード上でテストケースなどで分類できるようにしています。

```json
{
   "series":[
      {
         "metric":"magicpod.testcase.count",
         "points":[
            [
               {
                  "timestamp":1719759600,
                  "value":1
               }
            ]
         ],
         "type":"count",
         "host":"magicpod",
         "tags":[
            "testcase:テストケース名",
            "status:SUCCESS",
            "os:Android"
         ]
      }
   ]
}
```

実行時間に関しては、GAUGEタイプで秒数を指定し、他のパラメータはCOUNTと同じように送信しています。

```json
{
   "series":[
      {
         "metric":"magicpod.testcase.duration",
         "points":[
            [
               {
                  "timestamp":1719759600,
                  "value":300
               }
            ]
         ],
         "type":"gauge",
         "host":"magicpod",
         "tags":[
            "testcase:テストケース名",
            "status:SUCCESS",
            "os:Android"
         ]
      }
   ]
}

```

実際に使ってみて気づいたのですが、カスタムメトリクスは前日以前のデータポイントは集計できないみたいです。（まあカスタムメトリクスでこんな使い方をする人はあまりいないと思うのですが笑）
せっかくこれまでの実行結果があるので集計したかったのですが、メトリクスとしてDatadogの画面に出てきてくれなかったので、きっと使えないのでしょう。

# 今後について

まだメトリクスの計測を始めたばかりですが、まずはフレーキーなテストの信頼度を高めるべくダッシュボードを使って分析していきたいと思っています。
ちなみに実行時間が長い点においては、テストピラミッドが砂時計型の状態であることが影響していそうなので、過剰なE2Eテストを適切なテストサイズにする改善を取り組み始めています。
自動テストの効果を存分に発揮して、よりアジャイルに開発していけるようになりたいですね。