Autifyの過去のテスト実行回数を取得するワンライナーをつくる試み

この記事は **[Autify アドベントカレンダー2021](https://qiita.com/advent-calendar/2021/autify)** の7日目のエントリです。

本日も、[前回](https://qiita.com/meikos/items/77ac14cfd3352b517b08)に続き**Autify API**を使用したちょっとしたTipsをご紹介します。

Autifyでは設定画面から当月のテスト実行回数を確認できますが、**先月や先々月に何回テストを実行したか**確認したくなるとき、ありませんか？
できれば、成功・失敗のステータス別の件数も取れたらいいな。

というわけで、今回は**テスト結果を取得するAPI（[result API](https://autifyhq.github.io/autify-api/#/result/get_projects__project_id__results)）**を利用して、過去のテスト実行回数を取得してみます！

# 実施前提

**Autify API**を利用する前提として、以下の情報が手元にあること

* **プロジェクトID**
* **パーソナルアクセストークン**

加えて、以下のコマンドが使えるコマンドライン環境があることとします。

* **[curl](https://curl.se/docs/)**
* **[jq](https://stedolan.github.io/jq/)**
* その他cut, sort, uniq等の標準コマンド

各コマンドについては、各公式ドキュメントをご覧ください！

# ざっくり実行

手始めに、result APIを呼び出すとどんな情報が返ってくるのか、curlコマンドとjqコマンドを使って見てみましょう。
`<プロジェクトID>` や `<パーソナルアクセストークン>` は、ご自身のものに置き換えてみてください。

```bash
$ curl -H "Authorization: Bearer <パーソナルアクセストークン>" 'https://app.autify.com/api/v1/projects/<プロジェクトID>/results' | jq .

[
  {
    "id": ******,
    "status": "passed",
    "duration": 47295,
    "started_at": "2021-12-07T00:43:37.950Z",
    "finished_at": "2021-12-07T00:44:25.246Z",
    "created_at": "2021-12-07T00:43:28.457Z",
    "updated_at": "2021-12-07T00:44:26.675Z",
    "review_needed": false,
    "test_plan": null
  },
  {
    "id": ******,
    "status": "failed",
    "duration": 159715,
    "started_at": "2021-12-03T07:43:56.887Z",
    "finished_at": "2021-12-03T07:46:36.603Z",
    "created_at": "2021-12-03T07:43:49.740Z",
    "updated_at": "2021-12-03T07:46:40.106Z",
    "review_needed": false,
    "test_plan": null
  },
  (...中略...)
 ] 
```
こんな感じで、テスト結果がずらずらっと30件出てきます。
テスト結果をステータス毎に集計したり、実行日時で絞り込みをしたりしようと思ったら、`status` と `created_at` を使うと良さそうな予感。

では、この2つのフィールドを取り出してCSV出力してみましょう。
得られたテスト結果を `jq -r '.[] |  [.status, .created_at] | @csv'` に渡してみます。

```bash
$ curl -H "Authorization: Bearer <パーソナルアクセストークン>" 'https://app.autify.com/api/v1/projects/<プロジェクトID>/results' | jq -r '.[] |  [.status, .created_at] | @csv'

"passed","2021-12-07T00:43:28.457Z"
"failed","2021-12-03T07:43:49.740Z"
"passed","2021-11-24T12:01:10.659Z"
"passed","2021-11-24T11:33:17.440Z"
"passed","2021-11-24T11:26:54.875Z"
"passed","2021-11-24T11:18:29.809Z"
"passed","2021-11-24T11:11:39.785Z"
"failed","2021-11-24T11:08:31.178Z"
"passed","2021-11-22T02:09:49.702Z"
"passed","2021-11-18T10:35:34.246Z"
(...以下略...)
```

いやはや、jq先生は便利ですね。
さらに、ここでは**2021年11月分**の結果のみを抽出すべく `select(.created_at | startswith("2021-11"))` を追加してみます。


```bash
$ curl -H "Authorization: Bearer <パーソナルアクセストークン>" 'https://app.autify.com/api/v1/projects/<プロジェクトID>/results' | jq -r '.[] | select(.created_at | startswith("2021-11")) | [.status, .created_at] | @csv'

"passed","2021-11-24T12:01:10.659Z"
"passed","2021-11-24T11:33:17.440Z"
"passed","2021-11-24T11:26:54.875Z"
"passed","2021-11-24T11:18:29.809Z"
"passed","2021-11-24T11:11:39.785Z"
"failed","2021-11-24T11:08:31.178Z"
"passed","2021-11-22T02:09:49.702Z"
"passed","2021-11-18T10:35:34.246Z"
"passed","2021-11-18T06:37:36.926Z"
"passed","2021-11-18T03:16:55.527Z"
(...以下略...)
```

無事、2021年11月分だけがフィルタされました！

あとはjqの出力結果に `cut -f1 -d, | sort | uniq -c` あたりをかませてみたらどうでしょう。

```bash
$ curl -H "Authorization: Bearer <パーソナルアクセストークン>" 'https://app.autify.com/api/v1/projects/<プロジェクトID>/results' | jq -r '.[] | select(.created_at | startswith("2021-11")) | [.status, .created_at] | @csv'

  17 "passed"
   1 "failed"
```

出ました！ `passed` が17件、`failed` が1件。

この結果がどうやら

* **最新のテスト30件の結果のうち**
* **2021年11月に実行された**
* **テスト結果のステータス別件数**

のようです。

# 実用に向けて

さて、APIで取得できる最初の30件に対象のテスト結果がすべて含まれていれば上記のコマンドで良いのですが、実際に使おうと思ったらpageパラメータで指定する**ページ数**の考慮が必要です。

たとえば、ページ1から10までで返却される300件を対象にテスト結果を絞り込み、ステータス毎に数えるならこんな感じになるでしょうか。

```bash
results=`for i in {1..10}; do curl -H "Authorization: Bearer <パーソナルアクセストークン>" "https://app.autify.com/api/v1/projects/<プロジェクトID>/results?page=$i"; done`; echo $results | jq -r '.[] | select(.created_at | startswith("2021-11")) | [.status, .created_at] | @csv' | sort | cut -f1 -d, | uniq -c
```

うむむ、実行はできるものの、ワンライナーと呼ぶにはだいぶ長くなってしまいました。
そして、API呼出処理自体も固定回数ではなく、対象データがある限りループする、といった感じにしたいところです。

というわけで、ある程度ボリュームのある処理を伴う絞り込みや集計を行うならば、素直に分かりやすいスクリプトを書くか、CSV出力したものをスプレッドシートで取り扱った方がやりやすいかもしれません。

けれども、こういうちょっとしたワンライナーは**「ちょっとデータの様子を見たい」**時に便利だったりしますよね。
皆さんも「こんな工夫をしているよ」「こんなスクリプトを書いているよ」といったものがあったら、是非伺いたいなと思います☺️