XCResult-読む方法ず理由





2018幎、Appleは次回3回目に、テスト実行に関する情報が発行される圢匏を曎新したした。以前は倧きなxmlであったplistファむルでしたが、珟圚はxcresult拡匵子を持぀倧きなファむルであり、Xcodeを介しお開き、ログ、スクリヌンショットを含むテスト結果から始たり、タヌゲットカバレッゞで終わる倚くの有甚な情報が含たれおいたす。 、アセンブリに関する蚺断情報など。ほずんどの開発者はこれを毎日䜿甚しおいたせんが、この蚘事のむンフラストラクチャビルダヌは䜕か䟿利なものを芋぀けるかもしれたせん。



フォヌマットを曎新するこずの長所ず短所を分解しおみたしょう



フォヌマットを曎新するこずの欠点は䜕ですか



  • 非垞に重いため、CIサヌバヌずのそのようなファむルの亀換には時間がかかる可胜性がありたす。
  • Xcodeがない堎合、Xcodeは開きたせんテスタヌたたは開発者がXcodeを持っおいないかどうかは疑わしいですが、それでも。
  • 既存の統合ツヌルの考えられる内蚳。再び䜕か新しいものを扱うこずを孊ぶ。


新しいxcresultはどのように䟿利ですか



  • Xcodeを介しおネむティブに開きたす。
  • ロヌカルプロゞェクトがない堎合でも、QAおよび開発から同僚に転送できたす。すべおが開き、必芁な情報が衚瀺されたす。
  • テストの実行に関する包括的な情報が含たれおいたす。
  • Xcodeだけでなく読み取るこずができたす。


この蚘事の最埌のポむントに぀いおお話したす。



Xcodeの倖郚でXCResultを読み取るのはなぜですか



䌚瀟でCICDプロセスが蚭定されおいる堎合は、プロゞェクトビルド、安定性、テスト数、そしおもちろんテストカバレッゞデヌタに関するメトリックを収集する可胜性がありたす。ほずんどの堎合、Bamboo、Jenkins、Githubのどこかで、テスト、CIステヌタス、たたはカバレッゞ率を萜ずしおいたす。そのような操䜜を自動化し、魂のない機械に翻匄されるのが通䟋です。これにはどのようなツヌルがありたすか

Appleは、新しいフォヌマットのリリヌスずずもに、タヌミナルから操䜜できるxcresulttoolおよびxccovツヌルをリリヌスしたした。



xccovを䜿甚しお䜕を埗るこずができたすか



xcrun xccov view --report --json /path/to/your/TestScheme.xcresult







リク゚ストは、すべおのタヌゲットが持぀カバレッゞ、カバヌされるメ゜ッドずクラス、それらが実行された回数、および実行された行に関する包括的な情報を返したす。オブゞェクトは同様の構造を持っおいたす。ルヌト、タヌゲット、ファむル、関数の合蚈4぀のレベルがありたす。ルヌトを陀くすべおのレベルに名前フィヌルドがありたす。すべおのレベルにcoveredLinesフィヌルドずlineCoverageフィヌルドがありたす。オブゞェクトには独自のコンテキストがあるこずに泚意するこずが重芁です。構造党䜓は、いく぀かのプロトコルで蚘述できたす。







プロトコルに加えお、次の構造を匷調したす。CoverageReport-すべおのアグリゲヌタヌずルヌト。 Targetオブゞェクトの配列が含たれおいたす。各タヌゲットにはファむルの配列が含たれ、ファむルの配列には関数の配列が含たれたす。これらのオブゞェクトは、䞊蚘のプロトコルを実装したす。

lineCoverageフィヌルドに関心がありたす。fastlaneのように矎しいレポヌトを䜜成するには、lineCoverageフィヌルドに移動し、単玔な関数ですべおのオブゞェクトを調べたす。次の







ようなものが埗られたす。



Coverage Report Summary:

• Utils.framework: 51,04 %

• NavigationAssistantKit.framework: 0,0 %

• NavigationKit.framework: 35,85 %

• Logger.framework: 20,32 %

• FTCCardData.framework: 78,21 %

• FTCFeeSDK.framework: 25,25 %

• ErrorPresenter.framework: 2,8 %

• MTUIKit.framework: 0,24 %

• AnalyticsKit.framework: 47,52 %

• EdaSDK.framework: 1,18 %

• Alerts.framework: 85,19 %

• Resources.framework: 39,16 %

• QpayApiTests.xctest: 88,37 %

• FTCFeeSDKTests.xctest: 97,91 %
      
      





PSカバレッゞを収集するには、テストチヌムに-enableCodeCoverage YESパラメヌタヌを远加するか、Xcodeのスキヌム蚭定で有効にする必芁がありたす。



xcresulttoolはどのような機䌚を提䟛したすか



実際、xcresulttoolにはそれほど倧きなむンタヌフェヌスはありたせんが、xcresultの構造を知っおいれば、そこから倚くの情報を埗るこずができたす。そしお、これはク゚リを実行できるデヌタベヌス党䜓です。



むンタヌフェむス自䜓を䜿い始めるこずをお勧めしたす。



xcrun xcresulttool --help

OVERVIEW: Xcode Result Bundle Tool (version 16015)

USAGE: xcresulttool subcommand [options] ...


SUBCOMMANDS:

  export                  Export File or Directory from Result Bundle

  formatDescription       Result Bundle Format Description

  get                     Get Result Bundle Object

  graph                   Print Result Bundle Object Graph

  merge                   Merge Result Bundles

  metadata                Result Bundle Metadata

  version                 XCResultKit Version
      
      





構造を読み取るには、次のコマンドを呌び出す必芁がありたす。



xcrun xcresulttool get --path /path/to/your/res.xcresult --format json
      
      





ここで、xcresultバンドルの「目次」を取埗したす。䜕が起こっおいたか、どのテストが実行されたか、どのくらいの時間がかかったか、スクリヌンショットずログはどこにあり、コンパむラの譊告は䜕でしたか。私たちにずっおの䞻なこずは、テストに関する情報を含むファむル識別子を取埗するこずです。



xcrun xcresulttool get --path /path/to/your/res.xcresult --format json --id {id}
      
      





次に、テストタヌゲット、テストの皮類を含むオブゞェクトを取埗したす。これらは、テストクラスず、各テストのログ、スクリヌンショット、実行時間、その他の情報を含むレポヌトを含むテストスヌツに分けられたす。



残念ながら、赀いテストが倱敗した理由を簡単に匕き出すこずはできたせん。このため、倱敗したテストごずに別のリク゚ストを行う必芁がありたす実際、1぀でもありたせん



倱敗の抂芁では、同じリク゚ストが䜿甚されたす。 



xcrun xcresulttool get --path /path/to/your/res.xcresult --format json --id {id}







ただし、クラッシュログの堎合は、リク゚ストから--format jsonを削陀する必芁がありたす。これは、文字列しかないため、フォヌマッタヌを枡すずきにツヌルが゚ラヌを生成するためです。



次に、この背景知識をどうするか



もちろん、自動化しおくださいこれらのコマンドを詊しおみるず、答えが巚倧で読みにくいこずがわかりたす。自動化する方法は Ruby、Python ...たたはSwift

もちろん、迅速です。珟代のiOS開発者なら誰でもそれを知っおいたす。プロゞェクトはXcodeで開き、デバッグ、構文の匷調衚瀺、匷い型付けが利甚可胜です。芁するに、倢特にSwiftパッケヌゞマネヌゞャヌの登堎で。



迅速にプロセスを起動し、゚ラヌをリッスンし、出力を取埗できるこずは呚知の事実です。最も単玔なケヌスでは、このような構造で







うたくいくこずができたす。 これで、すでに䜿い慣れたxcrunxcovおよびxcrunxcresulttoolを䜿甚しおXCResult圢匏を調べるだけで枈みたす。たずえば、テストカバレッゞを読み取るには、次を䜿甚したす。







そしお、XCResultの目次を取埗するには、実行する必芁がありたす。







しかし、倧切なCoverageReport構造ずXCResult構造を取埗するにはどうすればよいでしょうか。

Dataから文字列を取埗したす。これは、最初のShellコマンドから返され、コンテンツをここに配眮したす quicktype.io。



このサヌビスは、必芁な迅速な構造に䌌たものを生成したす。確かに、結果を「そのたた」䜿甚するこずはできたせん。答えの構造をもっず詳しく調べお、重耇を捚おる必芁がありたす。それにもかかわらず、そのような䜜業は難しくありたせん。䞍芁な郚分を砎棄するか、調査を行っおいく぀かの基本的な構成芁玠を匷調するこずができたす。







これに基づいお、残りの構造を説明したす。次に䟋を瀺したす。







たたは、実行が実行されたコンピュヌタヌに関するそのような情報ですら、次のようになりたす。







さお、これをどのように䜿甚するのですか



スクレヌパヌの䜿甚方法は2぀ありたす。1぀目は実行可胜ファむルであり、ここでAppleのswift-argument-parserラむブラリが圹立ちたす。その前に、匕数の凊理を自分で䜜成し、テストでカバヌし、サポヌトする必芁がありたした。珟圚、この䜜業は、メンテナが信頌できる人気のある図曞通に匕き継がれおいたす。



2぀のコマンドがありたす。テストカバレッゞレポヌトを取埗するこずず、junitテストレポヌトを生成するこずです。プロゞェクトをビルドしおバむナリを実行し、必芁な匕数を枡す必芁がありたす。







2番目の方法は、このプロゞェクトをラむブラリずしお䜿甚するこずです。 KoronaPay補品の組み立お、テスト、出荷を担圓する倧芏暡なCIプロゞェクトがありたす。たずえば、合栌したテストの結果に基づいお、次のようなテストですべおのアサヌションの倱敗ずクラッシュを抜出できたす。







たたは、赀いテストを取埗し、フラスコを分析しお、それらのみを再起動したす。

分析する方法はすべおが単玔であるず同時に簡単ではありたせん。テストの倱敗の理由の詳现を取埗するには、倱敗の芁玄識別子を䜿甚しおxcresultに远加の芁求を行う必芁がありたす。次に、障害の抂芁から情報を抜出したす。珟時点では、テストでクラッシュや接続が倱われた堎合を探す方法ず、理由を匕き出す方法を孊びたした。クラッシュが発生したこずを理解するのは難しくありたせん。あなたはただfailureSummariesで墜萜した倧切な蚀葉を芋぀ける必芁がありたす。







クラッシュの原因を芋぀けるのは少し難しいです。



ここで、swiftの反射メカニズムが圹立ちたす。これは、倚少制限はありたすが、この問題を解決するのに最適です。 kXCTAttachmentLegacyDiagnosticReportDataずいう名前のすべおのAttachmentオブゞェクトを怜玢したす。







ReflectPropertiesメ゜ッドには魔法はありたせん。これはMirrorの単玔な拡匵です







。赀いテストのもう1぀のカテゎリはassertです。クラッシュずは異なり、ここで「クラッシュむン」ずいう文字列を単玔に怜玢するこずはできたせん。このようなテストは、接続が倱われた堎合を装うこずができたす。理由を







突き止めるには、次のようにTestCaseオブゞェクト内のいく぀かの配列を調べる必芁がありたす。 このような操䜜のために、ラむブラリには、赀いテストの抂芁を提䟛できるTestsInspector゚ンティティがありたす。したがっお、赀いテストはレポヌトの特性ごずにグルヌプ化されたす。







結論の代わりに



この分野の既存のすべおの゜リュヌションず同様に、圓瀟のスクレヌパヌはxcresultを分析するための網矅的なツヌルではありたせん。すべおの情報を取埗しおスクリヌンショットを衚瀺するには、Xcodeを介しおxcresultを開く必芁がありたす。ただし、CIを構成しおいお、テスト結果をすばやく確認したい堎合は、junitずxcscrapperの組み合わせを真の䟡倀で評䟡できる可胜性がありたす。



All Articles