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

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

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

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

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

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

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

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

TestRailのmabl, backlog, slack連携

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

TestRailをmabl, backlogと連携して自動化してみた

連携の構成

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

処理の流れ

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

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

TestRail

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

  • TestRailの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']))
  • テスト結果の登録
    • テストに結果を登録します。
    • また、テストに添付ファイルを追加します。mablからスクリーンショットやログを取得した際は添付ファイルとして結果に追加できます。今回は添付ファイルは利用していません。
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で実行しています。

  • mablによるテスト実行
    • mabl_cliを用いてテストを実行します。
    • mablのローカル実行はSTDOUTで結果を取得するため、STDOUTをパースして実行結果のステータスと実行時間を取り出しています。
    • ここで取り出した実行結果や経過時間はTestRailの結果登録時に利用します。
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
  • mablのテスト実行時のスクリーンショットの取得
    • 今回は実装していません。
    • mablでテスト実行時のスクリーンショットを取得した場合、test-idではなくtestrun-idを指定する必要があります。
      • テストの実行:mabl tests run-cloud –run-id –headless
      • テスト結果ファイルの取得:mabl test-runs export -file <output.zip>

backlog

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

  • バグチケット登録
    • Redmineなどと同様に作成するチケット情報をPOSTするだけです。
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に投稿します。

  • slackへの投稿
    • あらかじめ作成したslackのwebhookを指定するだけです。
import slackweb

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

応用例

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

まとめ

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

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

TestRail クラウドの利用者、増えてます

TestRail のホスティングサービス、TestRail クラウドを提供しています。

1か月間、無償でご利用になれます。

ぜひ、この機会にテストの生産性向上を TestRail クラウドでお試しください。

 詳細はこちら 

タイトルとURLをコピーしました