MagicPodとQualityForwardでテスト実行から結果投入まで連携する・改

## はじめに

自動テストツールのテスト結果をテスト管理ツールに自動投入したい場合、それぞれのAPIを利用して連携する方法があります。今回は、**MagicPod**の自動テスト結果を**QualityForward（以降QF）**に投入する方法を説明します。

[前回の記事](https://qiita.com/vZke/items/9068491573e509bb3c4a)では、MagicPod WebAPIでテストケースごとの結果を取得できず、制約を設けた結果連携でした。バージョン`0.95.0`で各テストケースの結果を取得できるようになったため、より詳細なテスト結果の連携を行います。

今回、具体的なサンプルコードは前回記事と殆ど同じなので割愛しています。

## 使用するツールと全体像

![20220131172926.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/548627/ed87de1d-626f-f257-0548-1f871762d7dd.png)

- Windows10 Pro
- Python 3.7.4
  - requests 2.23.0
- [MagicPod](https://magic-pod.com/) バージョン0.95.0(2022/1/22)
  - [MagicPod Web API](https://magic-pod.com/api/v1.0/doc/)
- [QualityForward](https://www.veriserve.co.jp/qualityforward/)

**処理の流れ**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/548627/4587c9bb-d9b3-19cd-2704-c5b2ca1fc45e.png)

## 連携までの流れ

次の流れに沿って説明していきます。

```text
1. 準備
  1-1. QFの準備
    - テストスイートの作成
    - テストフェーズの作成
    - 環境変数の設定
  1-2. MagicPodの準備
    - 自動テストの作成
    - 環境変数の設定
2. 連携スクリプトの作成
  2-1. QF連携スクリプト
  2-2. MagicPod連携スクリプト
3. 実行
```

## 1. 準備

### 1-1. QFの準備

**テストスイートの作成**

テストスイートを新規作成し、連携に必要な次の項目を設定します。

**テスト定義項目**

![20220203162821.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/548627/7d22fb05-18c2-598c-70be-6775b451d8f8.png)

| 項目名                   | 内容                                             |
| ------------------------ | ------------------------------------------------ |
| 識別ID                   | QF上のテストケース番号                             |
| 優先度                   | 本来の優先度ではなくA:自動/B:手動/C:未実装の区分で使用 |
| テストメソッド名         | テストケースの名前                               |
| MagicPodテストケースID   | MagicPod上のテストケースID                       |
| MagicPodデータパターンID | MagicPod上のデータパターンID                     |

**テスト結果項目**

![20220203163742.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/548627/65a37a96-e2e0-39bc-4b0a-91051faddd04.png)

| 項目名       | 内容                                   |
| ------------ | -------------------------------------- |
| テスト実施者 | 自動テスト作成者のQFユーザID           |
| テスト実施日 | 自動テスト実行開始日                   |
| テスト結果   | PASS, FAIL, SKIP, CUT, BLOCK, N/A, Q&A |
| started_at   | テスト開始日時                         |
| ended_at     | テスト終了日時                         |
| message      | MagicPodのテスト結果URL                |

**テストフェーズの作成**

作成したテストケースを紐づけて、テストフェーズを作成します。

![20220203164323.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/548627/f4ba45fb-12fa-76f1-e745-7364f295d152.png)

## 1-2. MagicPodの準備

**自動テストの作成**

MagicPodでテストケースを作成し、一括実行における実行設定を決めます。今回はテストケースごとに付与できる「ラベル」を使い、プロジェクト内で「`SimpleList`（サンプルアプリの名前）」のラベルを含むテストケースのみを実行しました。その他の接続設定は以下の通り。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/548627/22f96ad8-97c9-9d72-3d7e-f0519ba0722a.png" width="75%">

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/548627/c5bbb134-fc2b-ffde-5196-7515ab8d268e.png">　<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/548627/439535ca-a932-ab38-207c-08a87603a247.png">

この設定はMagicPod連携スクリプト内に記述します。同様の設定で想定通りに実行できるか、MagicPodのGUIを使ってあらかじめ確認しておくとよいでしょう。

**環境変数の設定**

MagicPod Web APIに必要なパラメータを設定します。組織名とプロジェクト名はプロジェクト画面のURLを参照すると分かりやすいです。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/548627/cb369dfb-f57b-eec7-f61b-f12ba726dd44.png" width="75%">

- base_url
  - `https://magic-pod.com/api/v1.0/`
- api_key
  - ユーザメニューの「APIトークン」から取得
- organization_name
  - 組織名。例の場合、`VeriServe`
- project_name
  - プロジェクト名。例の場合、`Sandbox`

## 2. 連携スクリプトの準備

### 2-1. QF連携スクリプト

前回の記事と同様に、[QualityForward Blog](https://qf-support.hatenablog.com/entry/2021/05/20/095905)で公開されている[連携スクリプト](https://github.com/Veriserve/qf_api_sample/tree/master/sample/post_automated_test_results)を参考しています。具体的なスクリプトや解説は参考先に譲りますが、次の処理をメソッド化して使用するとよいでしょう。

**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のテストケース番号に対応するように突合しています。

```python
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/`

```python
# 実行設定: 必要に応じて項目を追加
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 Web APIより
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/548627/a0a3cb1e-b3fc-dbf5-e2c9-9d6d89f14b56.png)



**MagicPodのテスト結果をパース**

QFのテスト結果定義に合わせるため、MagicPodのテスト結果をパースします。利用する項目と対応するQFの項目は次の通り。

```python
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へのテスト結果投入


## 参考

- [【導入事例の紹介】 QualityForwardで手動テストと自動テストを一元管理しよう <前編> - QualityForward Blog](https://qf-support.hatenablog.com/entry/2021/05/20/095905)
- [API経由でテスト結果を投入する - QualityForward Blog](https://qf-support.hatenablog.com/entry/2020/03/19/120857)
- [MagicPod Web API](https://magic-pod.com/api/v1.0/doc/)
- [TestRailとmabl, backlog, slackを連携させてみた | TestRail Blog](https://blog.testrail.techmatrix.jp/testrail-mabl-backlog-slack/)
    - 各種ツールは異なりますが、連携の流れやスクリプトなど参考になりました。