Save 37% off PRO during our Black Friday Sale! »

詳解xcresult.pdf

Db5cf21a75ebe2484b95ea9dec5f573b?s=47 Shingo Tamaki
September 28, 2021

 詳解xcresult.pdf

事例を元にxcresultとxcresuttoolの使い方について解説しました。

このスライドはこの記事を元にしています。
https://engineering.mercari.com/blog/entry/20201218-61f7110851/

Db5cf21a75ebe2484b95ea9dec5f573b?s=128

Shingo Tamaki

September 28, 2021
Tweet

Transcript

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

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

  3. 3 Role: Merpay iOS EM 
 Career : KeywareSolutions→Techfirm→Origami→Merpay 


    Hobby : bouldering󰩥/airsoft🔫/martial arts(karate/kickboxing)🥊🤛
 玉城信悟

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

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

  6. 6 xcresultとxcresulttool - xcresult - Xcode11から採用された新しい形式Result bundle - 中身はバイナリファイルとplist -

    xcresulttool - xcresultから情報を取得するためのApple純正のツール
  7. 7 xcresultに含まれる情報 - Test(テストレポート) - Build(ビルドログ) - Coverage(カバレッジレポート) - Log(実行時ログ)

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

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

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

  11. 11 xcresulttool xcrun xcresulttool SUBCOMMANDで実行

  12. 12 xcresulttool get getサブコマンドでxcresult内の構 造化された情報をjson形式で出力 可能です。 ルートの構造である ActionsInvocationRecordは 以下のようなプロパティを持ってい ます。

    - metadataRef: metaデータへ のリファレンス - metrics:エラー・警告の件数 やテストの失敗件数などのメ トリクス情報 - issues: エラー・警告、テスト の失敗に関するサマリ情報 - actions: 実行の詳細情報
  13. 13 xcresulttool formatDescription formatDescriptionサブコマンドで xcresultの内部構造で定義されている型を 調べる事が出来ます。 getサブコマンドで取得した jsonを読み解く 際に使ったり、xcresultから取り出したい情 報がどのような構造でどのような階層に格

    納されているかを調べるのに使えます。 ⚠ それぞれの型の定義は照会出来ます が、それがどのような情報を持っているかと いった説明は出ません。型名、プロパティ名 から推測するのと、実際に出力した xcresultのファイルから読み取るしかない です。
  14. 14 xcresultの内部に持つ型 - Value: プリミティブな値 (Bool/Int/Double/String/Dateなど)を表す - Array: 配列であることを表す -

    Object: プロパティや親オブジェクトを持てたりす る。 - Reference: 他のオブジェクトへの参照型 Object「TestFailureIssueSummary」の例
  15. 15 Reference型 Reference型はそのidを使ってgetサブコマンドを 使って情報を取得する必要がある。 つまり、ルートからの getサブコマンドで全ての情報 が取れるわけではない。

  16. 16 連携したい情報を整理する ① ② ①UIテストコードとTestRail 上の TestCase IDを紐づける⛓ ②UIテストの実行ログを送り たい

    ③テスト失敗時は失敗した 画面のスクリーンショットを添 付したい ④テストの成功・失敗などの ステータスを取得する ③
  17. 17 ①TestRailのTestIDとの紐付け Activity名に固有のTestCaseIDを埋め込み、xcresultをパースする際にこ れをもってAPI連携に使用する

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

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

    xcrun xcresulttool export --path sample.xcresult/ --type file --id 0~tCUck92hUZF... --output-path failed.jpeg
  20. 20 ④テストの成功・失敗などのステータスを取得する { "_type": { "_name": "ActionTestMetadata", "_supertype": {…} },

    "duration": {…}, "identifier": { "_type": {…}, "_value": "MerpayEasypayTest/sampleTest( )" }, "name": {…}, "summaryRef": {…}, "testStatus": { "_type": {…}, "_value": "Failure" } }, ActionTestMetadataの testStatusからテストの結果を取 得可能
  21. 21 ①〜④の処理を行うスクリプトを作成 fastlaneのカスタムアクションとし て動かすためスクリプトは rubyで 作成

  22. 22 🎉 連携できた

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

    xcrun xcresulttool merge primary.xcresult secondary.xcresult --output-path merged.xcresult
  24. 24 まとめ - XcodeのReport navigatorで表示される情報はxcresultから取得可能 - xcresultの情報取得にはxcresulttoolが必要 - xcresulttoolをそのまま使うには手間なので必要に応じてラッパーライブラリを利用したり やスクリプトを作る

    - https://github.com/fastlane-community/xcresult - https://github.com/ChargePoint/xcparse - https://github.com/XCTestHTMLReport/XCTestHTMLReport
  25. 25 以上 ご静聴ありがとうございました

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