Upgrade to Pro — share decks privately, control downloads, hide ads and more …

詳解xcresult.pdf

Shingo Tamaki
September 28, 2021

 詳解xcresult.pdf

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

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

Shingo Tamaki

September 28, 2021
Tweet

More Decks by Shingo Tamaki

Other Decks in Technology

Transcript

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

    View Slide

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

    View Slide

  3. 3
    Role: Merpay iOS EM 

    Career :
    KeywareSolutions→Techfirm→Origami→Merpay 

    Hobby : bouldering󰩥/airsoft🔫/martial
    arts(karate/kickboxing)🥊🤛

    玉城信悟


    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  11. 11
    xcresulttool
    xcrun xcresulttool SUBCOMMANDで実行

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  16. 16
    連携したい情報を整理する


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

    View Slide

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

    View Slide

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

    View Slide

  19. 19
    ③テスト失敗時は失敗した画面のスクリーンショットを添付した

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

    View Slide

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

    View Slide

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

    View Slide

  22. 22
    🎉
    連携できた

    View Slide

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

    View Slide

  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

    View Slide

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

    View Slide

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

    View Slide