2021年6月22日にmablが主催する人類よ!これがテスト管理ツールだ!テスト管理ツール天下一武道会がついに開催!へTestRail代表として登壇いたしました。
催しの中でTestRailとmabl(自動テスト), backlog(タスク管理), slack(チャットツール)を連携させた環境を用いてデモを行いましたので、今回はこの連携の中身についてご紹介します。
テスト管理をテスト自動化に組み込む意図
弊社テクマトリックスでは、かれこれ20年近くソフトウェア開発向けのテストツールを取り扱っています。コードを解析してバグを見つける静的解析ツールやUIテスト自動化ツール、ソフトウェアの構造を可視化する構造分析ツールなど、様々なアプローチでソフトウェアの品質向上を目的に活動してきました。ここ10年ほどはテスト自動化をテーマとして活動されているお客様も多く、Jenkinsを用いたクラウド上の開発環境の構築などもご提案する機会が増えました。
自動化されたテストの対極にあるのが手動テストです。手動テストはユーザビリティテストや探索的テストなどの観点も含まれるため、手動テストがなくなることはありません。自動化されたテストと手動テストは混在して開発チームに存在することになります。
テスト結果は自動/手動テスト、テスト内容ごとにばらばらに管理されているのが当たり前とされているように思います。しかし、リリースするソフトウェアは1つです。それであれば、そのソフトウェアのテスト結果はすべて1つにまとめられているのが正しい姿ではないかと感じます。
テスト管理をテスト自動化に組み込む意図は、自動化されたテストと手動テストの結果をまとめて管理/管理することで、開発ソフトウェアの状態を早く正しく把握できる仕組みを持つことです。
TestRailのmabl, backlog, slack連携
動いている様子を動画として公開しています。
連携の構成
今回の処理はPythonスクリプトにて実装しました。詳しい処理の流れや内容は後述します。
処理の流れ
- TestRailのテストケースからテストランを作成
- mablをCLIで実行
- mablのテスト結果をTestRailに登録
- mablのテスト結果が失敗(テストNG)であった場合、backlogにチケットを起票
- すべての自動テストが完了したらslackへ通知
各ツールのインターフェイスと接続方法
TestRail
TestRailはREST APIによる呼び出しが可能です。 今回の連携では、テストケースからテストランを作成する処理とテスト結果を登録する処理を利用します。
- TestRailのAPI呼び出し
- APIにアクセスするためのAPIバインディングのサンプルが用意されています。
- 今回はPythonを利用します。
- テストランの作成
- テストランに含めるテストケースを選択し、テストランを作成します。
- 作成したテストランからテストを取得し、テストごとに実行~結果の登録を実施します。
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
テストケースの管理やテスト結果の記録、チームでの情報共有など、Excelを使ったテスト管理の業務に限界を感じていませんか?TestRailはシンプルで使いやすいUIを提供し、テストにかかるさまざまな管理コストの削減に貢献します。
■ TestRailの特長 ■
- テストにさまざまな情報を関連づけて一元管理
- Webブラウザー上でテストケースを簡単に入力や編集可能
- テスト実施の準備と結果の共有が容易
- 進捗や比較などのレポートを提供
- 要件 / 課題管理ツールやテスト自動化ツールと連携
日本国内では、テスト管理にExcelを使っていたお客さまからの乗り換えが多く、Web上で完結するテスト管理を実現されています。
TestRail でテスト管理のお悩みを解決しませんか?