mablのアプリケーション毎の実行回数をレポーティングAPIで取得する

システム本部デベロッパーエクスペリエンス室のQAエンジニア、伊藤由貴(@yoshikiito)です。

われわれシステム本部ではチームごとにシステムテストの自動化にも取り組んでいますが、そのなかでmablも活用しています。 もともとmablをはじめシステムテストの自動化に関して少し経験があったので、わたしが各部に対してmablの管理や活用支援、利用開始時のサポート、mabl社の方とのやりとりなどを担当しています。

mablを本部全体で使う上での課題

mablは、ツールとしての機能は申し分なく、いろいろなテストが自動化できます。 一方システム本部での導入にあたっては、とある課題がありました。

それは、複数の開発部で1つのワークスペースを共有した際に実行回数をどうするか問題です。

mablでは、契約するプランによって月ごとの実行回数上限が決まっています。 仮にこれを1000回だとすると、たとえば

  • 開発部Aが月に300回
  • 開発部Bが月に500回
  • 開発部Cが月に200回

といった形でルールを決めて、その中で使ってもらう必要がありました。

※開発部ごとにワークスペースや契約を分けるという手段もあるのですが、費用や活用状況などを鑑みて、現在はこの形で運用をしています。

mablのアプリケーション上では、開発部ごとに何回実行したか、という数字は見ることができません。全体として今月何回、という形で表示されます。 そのため、各開発部および各開発部のWebサービスごとに何回実行したのか、を知る手段が必要でした。

アプリケーション毎の実行回数をレポーティングAPIで取得する

そこで、今回の主題であるmablのレポーティングAPIを用いてアプリケーション(テスト対象のWebサービス)毎に、当月の実行回数を取得するスクリプトを書きました。 また、取ってきた実行回数をシステム本部内に共有するため、普段使っているTeamsのチャネルにWebhookで送信する処理も行っています。

用意・確認するもの

ワークスペースIDと各アプリケーションID

mabl CLIでも取得できますし、mablのアプリケーション上でも確認できます(mablリソースID

mabl APIと認証のための情報

mabl APIを発行し、それをReporting APIのページ(Get test run summaries over a time range)で入力するとサンプルコードが表示されます。

AUTHENTICATIONのBasicの欄にkeyとご自身のAPI keyを入れ、REQUESTの項目に出てくるheadersのところを使います。 このあとに出てくるコードをご覧ください。

Teamsのチャネルの受信Webhook

こちらを参考に取得します。

Teamsへの投稿が不要な場合は無くてもOKです。

コード&やっていること

わたしが使い慣れているため、Python(とChatGPT)で書きました。

mablのReporting API Get test run summaries over a time range を用いて、ある時点からある時点までの実行結果を取得できます。

当月の月初からスクリプト実行時点まで、を指定して実行結果をjson形式で取得し、その中にどのアプリの実行結果が何回出てくるかをカウントする、という処理です。

import requests
import datetime
import json

# json中に指定文字列が何回出てくるかを返す by ChatGPT
def count_key_value_pairs_in_json(data, target_key, target_value):
    count = 0
    if isinstance(data, dict):  # 辞書の場合
        if target_key in data and data[target_key] == target_value:
            count += 1
        for value in data.values():
            count += count_key_value_pairs_in_json(value, target_key, target_value)
    elif isinstance(data, list):  # リストの場合
        for item in data:
            count += count_key_value_pairs_in_json(item, target_key, target_value)
    return count


# mabl上に登録されているアプリケーションのIDを辞書形式で記載
app_dict = {'アプリケーション1':'abcdefghijklmnopqrstuvwxyz1-a',
            'アプリケーション2':'abcdefghijklmnopqrstuvwxyz2-a',
            'アプリケーション3':'abcdefghijklmnopqrstuvwxyz3-a',
            'アプリケーション4':'abcdefghijklmnopqrstuvwxyz4-a'}

# 実行日の月初とスクリプト実行時のUnixTime(ミリ秒)を取得
latest_end_time_unix_microsec = int(datetime.datetime.now().timestamp())*1000
beginning_of_the_month = datetime.datetime.now().replace(day=1, hour=0, minute=0,second=0, microsecond=0)
beginning_of_the_month_unix_microsec = int(beginning_of_the_month.timestamp()*1000)

# Teamsメッセージ用の結果取得日時を変数に入れる
today = datetime.datetime.now().strftime('%Y年%m月%d日 %H:%M')

# リクエストを作成
query = "https://api.mabl.com/results/workspace/ワークスペースID/testRuns?earliest_run_start_time=" + str(beginning_of_the_month_unix_microsec) + "&latest_end_time=" + str(latest_end_time_unix_microsec) + "&limit=2000"

# 認証
headers = {
    "accept": "application/json",
    "authorization": "mabl reporting apiのページから取得"
}

# Teams投稿用の文章
teams_message = ""

# mablのレスポンスを取得
response = requests.get(query, headers=headers)
json_data = response.json()

# 取得したjsonに対して、application_idごとに出現回数=実行回数をカウント
for app_name, app_id in app_dict.items():
    num_of_runs = count_key_value_pairs_in_json(json_data, "application_id", app_id)
    teams_message = teams_message + app_name + ": " + str(num_of_runs) + " times</br>"

print(teams_message)

webhook_url = "Teamsで投稿したいチャネルのWebhook"

requests.post(webhook_url, json.dumps({"title": today + "時点の当月累計実行回数", "text":teams_message}))

成功すると、下図のようにTeamsに投稿されます。

アイコンとbot名(実行回数通知くん)はTeams側での設定なので、四角で囲まれた2023年07月03日〜のところが上記コードの実行結果となります。

その他、処理を行ううえでの注意点としてはapplication_idだけを検索すると正しく実行回数が計算できない点です。json中ではimage_hrefimage_artifact_urlにもアプリケーションIDが含まれる場合があります。 そのため、

"application_id": "abcdefghijklmnopqrstuvwxyz1-a"

という、KeyとValueのペアの出現をカウントする必要がありました。そのためにcount_key_value_pairs_in_jsonを使っています。

これから

このスクリプトで毎日Teamsにアプリケーション毎の実行回数を見えるようにしたことで、自チームの実行回数もそうですが、他のチームではどのくらいmablを使っているのかも同時に見えるようになりました。

もちろん、mablをたくさん使うことがすばらしい!という単純な話ではありません。しかし、現状はまだまだ活用の余地がある状態です。そのため、「まだ回数余裕があるからもっと使おう!」とか「ほかのチームが活用しているから、自分たちももっとやろう!」という前向きな材料として使ってもらえるといいなと思っています。

システム本部で私と一緒に横断QAしてくださる方を募集しています

現在、私と一緒にQAチームを立ち上げ、mablでのテスト自動化含めて良い取り組みをどんどん広げていってくれるQA仲間を募集しています。

すぐの転職は考えていないけれど興味があるかも、という方はカジュアル面談からでも歓迎です。

興味をもっていただけた方は以下から詳しい内容を見てみてください!

カカクコム採用サイト