サイトアイコン TestRail Blog

TestRailとmabl, backlog, slackを連携させてみた

2021年6月22日にmablが主催する人類よ!これがテスト管理ツールだ!テスト管理ツール天下一武道会がついに開催!へTestRail代表として登壇いたしました。

催しの中でTestRailとmabl(自動テスト), backlog(タスク管理), slack(チャットツール)を連携させた環境を用いてデモを行いましたので、今回はこの連携の中身についてご紹介します。

テスト管理をテスト自動化に組み込む意図

弊社テクマトリックスでは、かれこれ20年近くソフトウェア開発向けのテストツールを取り扱っています。コードを解析してバグを見つける静的解析ツールUIテスト自動化ツールソフトウェアの構造を可視化する構造分析ツールなど、様々なアプローチでソフトウェアの品質向上を目的に活動してきました。ここ10年ほどはテスト自動化をテーマとして活動されているお客様も多く、Jenkinsを用いたクラウド上の開発環境の構築などもご提案する機会が増えました。

自動化されたテストの対極にあるのが手動テストです。手動テストはユーザビリティテストや探索的テストなどの観点も含まれるため、手動テストがなくなることはありません。自動化されたテストと手動テストは混在して開発チームに存在することになります。

テスト結果は自動/手動テスト、テスト内容ごとにばらばらに管理されているのが当たり前とされているように思います。しかし、リリースするソフトウェアは1つです。それであれば、そのソフトウェアのテスト結果はすべて1つにまとめられているのが正しい姿ではないかと感じます。

テスト管理をテスト自動化に組み込む意図は、自動化されたテストと手動テストの結果をまとめて管理/管理することで、開発ソフトウェアの状態を早く正しく把握できる仕組みを持つことです。

TestRailのmabl, backlog, slack連携

動いている様子を動画として公開しています。

連携の構成

今回の処理はPythonスクリプトにて実装しました。詳しい処理の流れや内容は後述します。

処理の流れ

  1. TestRailのテストケースからテストランを作成
  2. mablをCLIで実行
  3. mablのテスト結果をTestRailに登録
  4. mablのテスト結果が失敗(テストNG)であった場合、backlogにチケットを起票
  5. すべての自動テストが完了したらslackへ通知

各ツールのインターフェイスと接続方法

TestRail

TestRailはREST APIによる呼び出しが可能です。 今回の連携では、テストケースからテストランを作成する処理とテスト結果を登録する処理を利用します。

from testrail import *

def tr_create_testrun():
  client = APIClient("https://<testrail-server/")
  client.user     = "username@domain"
  client.password = "password" # OR APIKey

  # POST index.php?/api/v2/add_run/:project_id
  # https://docs.testrail.techmatrix.jp/testrail-api2/reference-runs#add_run
  testrun = client.send_post('add_run/'+str(PROJECT_ID),
    {
      "suite_id": TESTSUITE_ID,           # テストスイートID
      "name": NEW_TESTRUN_NAME,           # テストラン名
      "assingedto_id": ASSIGNED_USER_ID,  # アサインするユーザーID
      "include_all": True,                # テストスイートのすべてのテストをランに含める
    }
  )

  # GET index.php?/api/v2/get_tests/:run_id
  # https://docs.testrail.techmatrix.jp/testrail-api2/reference-tests#get_tests
  tests = client.send_get('get_tests/'+str(testrun['id']))
for test in tests:

  # mablでのテスト実行 ...

  # POST index.php?/api/v2/add_result/:test_id
  # https://docs.testrail.techmatrix.jp/testrail-api2/reference-results#add_result
  result_dict = client.send_post(
  'add_result/'+str(test['id']),
    {
      "status_id": STATUS, # テスト結果ステータス (mablの実行結果を利用)
      "comment": COMMENT,  # コメント (mablの実行結果を利用)
      "elapsed": ELAPSED,  # 経過時間 (mablの実行結果を利用)
      "defects": DEFECT_ID # 不具合チケットのID (バックログのチケットIDを利用)
    }
  )

  # POST index.php?/api/v2/add_attachment_to_result/:result_id
  # https://docs.testrail.techmatrix.jp/testrail-api2/reference-attachments#add_attachment_to_result
  attachment_dict = client.send_post(
      'add_attachment_to_result/'+str(test['id']),
        ATTACHMENT_PATH  # 添付ファイルのパス
  )

mabl

mablはCLIによるテスト実行が可能です。 今回の連携では、TestRailのテストケースにmablのtest-idをカスタムフィールドとして設定しています。これによりTestRailのテストランを作成した後、各テストの情報からmablのtest-idを指定して実行する処理を実装できます。なお、今回はmablをローカルおよびheadlessで実行しています。

import subprocess
import re

def run_command(cmd):
  process = subprocess.Popen(cmd, stdout=subprocess.PIPE, shell=True)
  res = process.communicate()[0].strip()
  return res.decode()

def mabl_execute_test_local(test_id):

    # 1. run mabl testrun
    cmd_out = log = run_command(
        MABL_EXE + " tests run --id " + test_id + " --headless")

    # 2. parse stdout of mabl tests run
    status_list = ['Passed', 'Skipped', 'Failed']
    status = "Passed"
    for st in status_list:
        result = re.findall(st+': '+'(\d)', cmd_out)
        if len(result) != 0:
            if result[0] is not '0':
                status = st
                break

    total_time = re.findall('Total time: (\d+)\.\d+\ seconds', cmd_out)  # seconds固定
    return status, total_time[0] + " s", log

backlog

REST APIにてチケット登録を行います。 今回はmablのテスト結果がFailedだった場合は、backlogの種別”バグ”としてチケットを作成します。mablの実行ログも内容に貼り付けます。

import requests

def backlog_add_issue(project_id, title, issue_type, priproty, description):

  url = BACKLOG_URL + 'api/v2/issues?apiKey=' + BACKLOG_APIKEY
  data = {
      'projectId': project_id,
      'summary': title,
      'issueTypeId': issue_type,
      'priorityId': priproty,
      'description': description
  }
  headers = {
      'Content-Type': 'application/x-www-form-urlencoded'
  }
  res = requests.post(url, data=data, headers=headers).json()
  return res['issueKey']

slack

一連のテスト実行や登録が終わったら、テストが終了したことをslackに投稿します。

import slackweb

def slack_notify(message):
    slack = slackweb.Slack(url=SLACK_WEBHOOK_URL)
    slack.notify(text=message)
    return

応用例

今回の例ではPythonコードをそのまま実行して連携しましたが、同様の処理をJenkins等のCIツールに組み込むことで、コードコミットをトリガーとして実行することが可能になります。 コードをコミットすると自動化されたテストが実行、結果が登録されますので、手動テストはUntestedのテストのみを対象に実施すれば良いです。これで自動テストと手動テストの結果がまとめて管理できるようになります。

まとめ

ツール同士がオフィシャルにサポートされていたり、便利なプラグインが公開されていたりすれば、実装することなく連携ができます。しかし、各ツールのインターフェイスが公開されていれば、今回ご紹介したように簡単に連携させることができますし、自分のチームのニーズに合った情報を連携させたり、好きなタイミングで好きなツールで通知を行うことができ、柔軟性が増します。

自動テストの導入や改善を検討されている場合、テスト管理との連携を視野に入れて検討されることをおすすめします。テスト結果のフィードバック性能が大幅に改善します。

関連する製品

テスト管理ツール TestRail

テストケースの管理やテスト結果の記録、チームでの情報共有など、Excelを使ったテスト管理の業務に限界を感じていませんか?TestRailはシンプルで使いやすいUIを提供し、テストにかかるさまざまな管理コストの削減に貢献します。

■ TestRailの特長 ■

日本国内では、テスト管理にExcelを使っていたお客さまからの乗り換えが多く、Web上で完結するテスト管理を実現されています。

TestRail でテスト管理のお悩みを解決しませんか?

 

モバイルバージョンを終了