Slide 1

Slide 1 text

1 詳解xcresult YUMEMI.swift #13 〜裏iOSDC〜 Author: Shingo Tamaki

Slide 2

Slide 2 text

2 自己紹介と本日のお題について Agenda xcresultとxcresulttoolについて 活用事例:UIテスト結果をテスト管理ツールに連携する まとめ 02 03 04 01

Slide 3

Slide 3 text

3 Role: Merpay iOS EM 
 Career : KeywareSolutions→Techfirm→Origami→Merpay 
 Hobby : bouldering󰩥/airsoft🔫/martial arts(karate/kickboxing)🥊🤛
 玉城信悟


Slide 4

Slide 4 text

4 iOSDC Japan 2021 CfP https://fortee.jp/iosdc-japan-2021/proposal/b23aa86e-6078-46d1-b27e-908053590583

Slide 5

Slide 5 text

5 実はブログにも書いてます https://engineering.mercari.com/blog/entry/20201218-61f7110851/

Slide 6

Slide 6 text

6 xcresultとxcresulttool - xcresult - Xcode11から採用された新しい形式Result bundle - 中身はバイナリファイルとplist - xcresulttool - xcresultから情報を取得するためのApple純正のツール

Slide 7

Slide 7 text

7 xcresultに含まれる情報 - Test(テストレポート) - Build(ビルドログ) - Coverage(カバレッジレポート) - Log(実行時ログ) - Attachmentなどのファイル

Slide 8

Slide 8 text

8 xcresultの格納場所 デフォルトの格納場所 $HOME/Library/Developer/Xcode/DerivedData/${プロジェクト名-xxx}/Logs/Test xcodebuildコマンドでの-resultBundlePathパスで任意の場所に出力可能 Xcodeで開いて照会が可能

Slide 9

Slide 9 text

9 メルペイのUIテストのワークフロー

Slide 10

Slide 10 text

10 API連携のために情報の取り出しが必要 ❓ TestRail API

Slide 11

Slide 11 text

11 xcresulttool xcrun xcresulttool SUBCOMMANDで実行

Slide 12

Slide 12 text

12 xcresulttool get getサブコマンドでxcresult内の構 造化された情報をjson形式で出力 可能です。 ルートの構造である ActionsInvocationRecordは 以下のようなプロパティを持ってい ます。 - metadataRef: metaデータへ のリファレンス - metrics:エラー・警告の件数 やテストの失敗件数などのメ トリクス情報 - issues: エラー・警告、テスト の失敗に関するサマリ情報 - actions: 実行の詳細情報

Slide 13

Slide 13 text

13 xcresulttool formatDescription formatDescriptionサブコマンドで xcresultの内部構造で定義されている型を 調べる事が出来ます。 getサブコマンドで取得した jsonを読み解く 際に使ったり、xcresultから取り出したい情 報がどのような構造でどのような階層に格 納されているかを調べるのに使えます。 ⚠ それぞれの型の定義は照会出来ます が、それがどのような情報を持っているかと いった説明は出ません。型名、プロパティ名 から推測するのと、実際に出力した xcresultのファイルから読み取るしかない です。

Slide 14

Slide 14 text

14 xcresultの内部に持つ型 - Value: プリミティブな値 (Bool/Int/Double/String/Dateなど)を表す - Array: 配列であることを表す - Object: プロパティや親オブジェクトを持てたりす る。 - Reference: 他のオブジェクトへの参照型 Object「TestFailureIssueSummary」の例

Slide 15

Slide 15 text

15 Reference型 Reference型はそのidを使ってgetサブコマンドを 使って情報を取得する必要がある。 つまり、ルートからの getサブコマンドで全ての情報 が取れるわけではない。

Slide 16

Slide 16 text

16 連携したい情報を整理する ① ② ①UIテストコードとTestRail 上の TestCase IDを紐づける⛓ ②UIテストの実行ログを送り たい ③テスト失敗時は失敗した 画面のスクリーンショットを添 付したい ④テストの成功・失敗などの ステータスを取得する ③

Slide 17

Slide 17 text

17 ①TestRailのTestIDとの紐付け Activity名に固有のTestCaseIDを埋め込み、xcresultをパースする際にこ れをもってAPI連携に使用する

Slide 18

Slide 18 text

18 ②UIテストの実行ログを送りたい UIテストの構造化されたレポートの情報は xcresulttool getサブコマンドを3回実行する必要があります。 Root→testRef→summaryRefの順番で参照を繰り返します。 最終的にsubactivitiesのtitleからUIテストの構造化された各操作の名前を取得できるようになります。 見つけた🎉

Slide 19

Slide 19 text

19 ③テスト失敗時は失敗した画面のスクリーンショットを添付した い スクリーンショットなどの Attachmentを利用して残した 場合、subactivitiesのプロパティattachmentsを参照 してそのデータを取り出すことが可能。データの取り出し にはxcresulttool exportサブコマンドを使用する $ xcrun xcresulttool export --path sample.xcresult/ --type file --id 0~tCUck92hUZF... --output-path failed.jpeg

Slide 20

Slide 20 text

20 ④テストの成功・失敗などのステータスを取得する { "_type": { "_name": "ActionTestMetadata", "_supertype": {…} }, "duration": {…}, "identifier": { "_type": {…}, "_value": "MerpayEasypayTest/sampleTest( )" }, "name": {…}, "summaryRef": {…}, "testStatus": { "_type": {…}, "_value": "Failure" } }, ActionTestMetadataの testStatusからテストの結果を取 得可能

Slide 21

Slide 21 text

21 ①〜④の処理を行うスクリプトを作成 fastlaneのカスタムアクションとし て動かすためスクリプトは rubyで 作成

Slide 22

Slide 22 text

22 🎉 連携できた

Slide 23

Slide 23 text

23 おまけ:CIでの並列処理時の実行結果の統合 UIテストは時間がかかるため CircleCI上のワークフローの中ではテストの実行を端末やバージョンなどの Distributionに分けて並列で実行するようにしています。 TestRailへの連携はワークフローの実行単位レベル でシンプルに動的に登録したかったため、各ジョブで作られた xcresultファイルをマージして次のジョブへ連携 するようにしています。 $ xcrun xcresulttool merge primary.xcresult secondary.xcresult --output-path merged.xcresult

Slide 24

Slide 24 text

24 まとめ - XcodeのReport navigatorで表示される情報はxcresultから取得可能 - xcresultの情報取得にはxcresulttoolが必要 - xcresulttoolをそのまま使うには手間なので必要に応じてラッパーライブラリを利用したり やスクリプトを作る - https://github.com/fastlane-community/xcresult - https://github.com/ChargePoint/xcparse - https://github.com/XCTestHTMLReport/XCTestHTMLReport

Slide 25

Slide 25 text

25 以上 ご静聴ありがとうございました

Slide 26

Slide 26 text

26 iOSエンジニア向け採用説明会のご案内 9/29 19:30 - 21:00 https://mercari.connpass.co m/event/224432/