はじめに
自動テストツールのテスト結果をテスト管理ツールに自動投入したい場合、それぞれのAPIを利用して連携する方法があります。今回は、MagicPodの自動テスト結果を**QualityForward(以降QF)**に投入する方法を説明します。
前回の記事では、MagicPod WebAPIでテストケースごとの結果を取得できず、制約を設けた結果連携でした。バージョン0.95.0
で各テストケースの結果を取得できるようになったため、より詳細なテスト結果の連携を行います。
今回、具体的なサンプルコードは前回記事と殆ど同じなので割愛しています。
使用するツールと全体像
- Windows10 Pro
- Python 3.7.4
- requests 2.23.0
- MagicPod バージョン0.95.0(2022/1/22)
- QualityForward
処理の流れ
連携までの流れ
次の流れに沿って説明していきます。
1. 準備
1-1. QFの準備
- テストスイートの作成
- テストフェーズの作成
- 環境変数の設定
1-2. MagicPodの準備
- 自動テストの作成
- 環境変数の設定
2. 連携スクリプトの作成
2-1. QF連携スクリプト
2-2. MagicPod連携スクリプト
3. 実行
1. 準備
1-1. QFの準備
テストスイートの作成
テストスイートを新規作成し、連携に必要な次の項目を設定します。
テスト定義項目
項目名 | 内容 |
---|---|
識別ID | QF上のテストケース番号 |
優先度 | 本来の優先度ではなくA:自動/B:手動/C:未実装の区分で使用 |
テストメソッド名 | テストケースの名前 |
MagicPodテストケースID | MagicPod上のテストケースID |
MagicPodデータパターンID | MagicPod上のデータパターンID |
テスト結果項目
項目名 | 内容 |
---|---|
テスト実施者 | 自動テスト作成者のQFユーザID |
テスト実施日 | 自動テスト実行開始日 |
テスト結果 | PASS, FAIL, SKIP, CUT, BLOCK, N/A, Q&A |
started_at | テスト開始日時 |
ended_at | テスト終了日時 |
message | MagicPodのテスト結果URL |
テストフェーズの作成
作成したテストケースを紐づけて、テストフェーズを作成します。
1-2. MagicPodの準備
自動テストの作成
MagicPodでテストケースを作成し、一括実行における実行設定を決めます。今回はテストケースごとに付与できる「ラベル」を使い、プロジェクト内で「SimpleList
(サンプルアプリの名前)」のラベルを含むテストケースのみを実行しました。その他の接続設定は以下の通り。
この設定はMagicPod連携スクリプト内に記述します。同様の設定で想定通りに実行できるか、MagicPodのGUIを使ってあらかじめ確認しておくとよいでしょう。
環境変数の設定
MagicPod Web APIに必要なパラメータを設定します。組織名とプロジェクト名はプロジェクト画面のURLを参照すると分かりやすいです。
- base_url
https://magic-pod.com/api/v1.0/
- api_key
- ユーザメニューの「APIトークン」から取得
- organization_name
- 組織名。例の場合、
VeriServe
- 組織名。例の場合、
- project_name
- プロジェクト名。例の場合、
Sandbox
- プロジェクト名。例の場合、
2. 連携スクリプトの準備
2-1. QF連携スクリプト
前回の記事と同様に、QualityForward Blogで公開されている連携スクリプトを参考しています。具体的なスクリプトや解説は参考先に譲りますが、次の処理をメソッド化して使用するとよいでしょう。
QFのテストサイクルの作成
MagicPodのテスト実行のタイミングでテストサイクルを自動生成します。
タイミングを固定したい場合は、テストフェーズの設定で「テストサイクルの自動生成」をONにし、フェーズ作成日を開始日として2週間で自動生成することもできます。
POST /api/v2/test_phases/:test_phase_id/test_suite_assignments/:test_suite_assignment_id/test_cycles.json
QF上のテストケース一覧を取得
MagicPodのテストケースと突合するために、QF上のテストケース一覧を取得します。
GET /api/v2/test_suites/:test_suite_id/test_suite_versions/:test_suite_version_id/test_cases.json
QF上のテストケースとテスト結果のマッチング
QFのテストケースとMagicPodのテストケースを突合し、QFのテストケース番号(識別ID)を取得します。参考先では自動テストの1メソッドがQF上の1識別IDに対応していますが、ここではMagicPodの1テストケース内の1データパターンがQFのテストケース番号に対応するように突合しています。
for each <MagicPodテスト結果>:
for each <QFテストケース>:
if <MagicPodテスト結果中のテストケースIDとデータパターンIDの組合せ> in <QFテストケース中の識別子列>:
return <QFテストケース番号>
QFへのテスト結果投入
POST /api/v2/test_phases/:test_phase_id/test_suite_assignments/:test_suite_assignment_id/test_cycles/:test_cycle_id/test_results.json
※1秒間に1リクエストを超えないように設計
2-2. MagicPod連携スクリプト
連携に必要なAPI3種類と、テスト結果のパースをメソッド化するとよいでしょう。
MagicPodの自動テストを一括実行
1-2のMagicPodの準備で決めた実行設定をスクリプトに反映します。レスポンス内のbatch_run_number
は一括実行ごとに付与される番号で、テスト結果の取得に利用します。
POST /v1.0/{organization_name}/{project_name}/batch-run/
# 実行設定: 必要に応じて項目を追加
post_data = {
"environment": "magic_pod",
"os": "ios",
"device_type": "simulator",
"version": "14.4",
"model": "iPhone 12",
"app_type": "app_file",
"app_file_number": 1,
"send_mail": "false",
"included_test_case_labels": ["SimpleList"], # ラベル指定
}
MagicPodのテスト結果を取得
time
モジュール等を使って「レスポンス内のstatus
がrunning
の間待機する」処理を入れると、テスト実行完了後にテスト結果を取得することができます。
GET /v1.0/{organization_name}/{project_name}/batch-run/{batch_run_number}/
使用するレスポンスの項目は以下の通り。項目を追加したい場合は、QFのテスト結果定義列も一緒に追加します。
MagicPodのテスト結果をパース
QFのテスト結果定義に合わせるため、MagicPodのテスト結果をパースします。利用する項目と対応するQFの項目は次の通り。
data = {
"test_result[test_case_no]": QFのテストケース番号
"test_result[result]": `results`内の`status`,
"test_result[user_id]": QFのユーザID
"test_result[executed_at]": データ投入時の時間,
"test_result[content1]": `results`内の`started_at`,
"test_result[content2]": `result`内の`finished_at`,
"test_result[content3]": `result`内の`url`+`order`,
}
3. 実行
連携スクリプトを使って、処理の流れに沿ってMagicPodの実行からQFへのテスト結果投入までを実装します。
さらに連携スクリプトをCIツールに組み込むことで、定期実行やソースコミットなどトリガーを指定した自動実行が可能になります。
- MagicPodの自動テストを一括実行
- MagicPodのテスト結果を取得(実行終了まで待機)
- MagicPodのテスト結果をパース
- QFのテストサイクルの作成
- QF上のテストケースとテスト結果のマッチング
- QFへのテスト結果投入