カスタム機器:道標が十分でない場合

Instruments for AppleのXcodeは、iOSアプリケーションのパフォーマンスを分析するためのツールです。 これらは、コードのデバッグに必要なデータを収集して表示するために使用されます。 昨年、Apple Custom Instrumentsを導入しました 。 これは、アプリケーションのプロファイリング用のツールの標準セットを拡張する機会です。 既存のツールでは不十分な場合は、新しいツールを自分で作成できます。必要に応じてデータを収集、分析、表示します。



1年が経過し、ネットワーク上での作成に関する新しい公開ツールや情報はほとんどありません。 そこで、状況を修正し、独自のカスタムインストゥルメントを作成した方法を共有することにしました。これにより、単体テストの弱い分離の理由が決まります。 これは標識技術に基づいており( 前の記事で説明しました )、テストが点滅する場所を迅速かつ正確に判断できます。







理論的最小値



Xcode用の新しいツールを作成するには、2つの理論的なブロックを理解する必要があります。 自分でそれを理解したい人のために、私たちはすぐに必要なリンクを提供します:





残りの部分-必要なトピックの簡単な要約を以下に示します。



最初に[ファイル]-> [新規]-> [プロジェクト]-> [macOSカテゴリ]-> [インストゥルメントパッケージ]を選択します。 作成されたプロジェクトには、拡張子.instrpkgのファイルが含まれます。このファイルでは、新しいツールがxml形式で宣言的に宣言されます。 マークアップ要素について理解しましょう。



なに 属性 説明

データスキーマ

インターバルスキーマ、ポイントスキーマなど

SQLスキーマのようなテーブル内のデータ構造を記述します。 スキームは、他のマークアップ要素で使用され、たとえばマッピング(UI)を記述するときなど、モデルの入力および出力でデータのタイプを決定します。

データスキーマのインポート

インポートスキーマ

既製のスキームをインポートします。 Appleが定義したデータ構造を使用できます。

ツールモデル

モデラー

ツールを.clpファイルに関連付けます。このファイルでは、ツールのロジックが定義され、モデルの入力および出力で予想されるデータスキームが通知されます。

ツールの説明

計器

データモデルを説明し、UIでのイベントの表示方法を決定します。 データモデルは、属性create-table、create-parameterなどを使用して記述されます。 ツールチャートはグラフ属性によって定義され、パーツテーブルはリスト、物語などによって定義されます。



新しいツールのロジックを補完する場合は、CLIPSコードで.clpファイルを作成します。 基本的な言語エンティティ:





アクティブになるルールとシーケンスは、着信するファクト、ルールの優先順位、および競合解決メカニズムに基づいて、CLIPS自体によって決定されます。



この言語は、プリミティブに基づくデータ型の作成、算術演算、論理演算および関数の使用をサポートしています。 クラスの定義、メッセージの送信、多重継承を備えた本格的なオブジェクト指向プログラミング(OOP)と同様に。



カスタムツールのロジックを作成できる言語の基本的な構文を検討してください。



1. fact



を作成するには、 assert



コンストラクトを使用します。



 CLIPS> (assert (duck))
      
      





したがって、ファクトテーブルにエントリduck



が表示され、 facts



コマンドを使用して表示できます。



 CLIPS> (facts)
      
      





事実を削除するには、 retract



コマンドを使用します: (retract duck)







2. rule



を作成するには、 defrule



コンストラクトを使用しdefrule







 CLIPS> (defrule duck) —     duck (animal-is duck)</i> —  animal-is duck     => (assert (sound-is quack))) —     sound-is quack
      
      





3.変数を作成して使用するには、次の構文を使用します(変数名の前に必須記号「?」があります)。



 ?<variable-name>
      
      





4.次を使用して、新しいデータ型を作成できます。



 CLIPS> (deftemplate prospect (slot name (type STRING) (default ?DERIVE)) (slot assets (type SYMBOL) (default rich)) (slot age (type NUMBER) (default 80)))
      
      





そのため、プロスペクトの名前と、対応するタイプの名前、資産、年齢、およびデフォルト値の3つの属性を持つ構造を定義しました。



5.算術および論理演算には接頭辞構文があります。 つまり、2と3を追加するには、次の構成を使用する必要があります。



 CLIPS> (+ 2 3)
      
      





または、2つの変数xとyを比較するには:



 CLIPS> (> ?x ?y)
      
      





実用例



このプロジェクトでは、 OCMockライブラリを使用してスタブオブジェクトを作成します。 ただし、mokが作成されたテストよりも寿命が長く、他のテストの分離に影響する場合があります。 その結果、単体テストの「点滅」(不安定性)につながります。 テストとモックの有効期間を追跡するために、独自のツールを作成します。 以下はアクションのアルゴリズムです。



ステップ1.道標イベントのマークアップを作成する



問題のあるmoxを検出するには、間隔イベントの2つのカテゴリが必要です-モカの作成と破棄の時間、テストの開始時間と終了時間。 これらのイベントを取得するには、 OCMock



ライブラリに移動し、 stopMocking



クラスのinit



およびstopMocking



メソッドのsignpost



OCMock



アップします。











次に、調査中のプロジェクトに移動し、ユニットテストでマークアップを実行し、 setUp



およびtearDown



tearDown











ステップ2. Instrument Packageテンプレートから新しいツールを作成する







まず、入力のデータ型を決定します。 これを行うために、 signpost



スキーム.instrpkg



インポートしsignpost



。 これで、 signpost



によって作成されたイベントはツールに分類されます。







次に、出力のデータのタイプを決定します。 この例では、同時イベントを出力します。 各イベントには時間と説明があります。 これを行うには、スキームを宣言します。







ステップ3.ツールのロジックを説明します



拡張子.clp



別のファイルを作成し、CLIPS言語を使用してルールを設定します。 新しいツールにロジックが定義されているファイルを知らせるには、 modeler



ブロックを追加します。







このブロックでは、 production-system



属性を使用して、ロジックを含むファイルへの相対パスを指定します。 属性output



およびrequired-input



、それぞれ入力および出力のデータスキームrequired-input



定義します。







ステップ4.ツールのプレゼンテーションの詳細を説明します(UI)



.instrpkg



ファイルでは、ツール自体の説明、つまり結果の表示が残ります。 schema-ref



属性で以前に宣言detected-mocks-narrative



schema-ref



を使用して、 create-table



属性でデータのテーブルを作成します。 そして、情報出力のタイプを設定します-物語(説明):







ステップ5.ロジックコードを書く



エキスパートシステムのロジックを定義する.clp



ファイルに.clp



ましょう。 ロジックは次のようになります。テストの開始時刻が真岡の人生の間隔と交差する場合、このモックは別のテストから「来た」と考えられます。これは現在の単体テストの分離に違反します。 最終的に関心のある情報を含むイベントを作成するには、次の手順を実行する必要があります。



1.フィールドを使用してモックとunitTest構造体を定義します-イベントの時間、イベント識別子、テストの名前、mokのクラス。







2. unitTest



の着信イベントに基づいて、タイプmock



およびunitTest



ファクトを作成するルールを定義します。







これらのルールは次のように読むことができます:入力時に、希望するsubsystem



category



name



、およびevent-type



のos-signpostタイプのファクトを取得した場合、上記で定義されたタイプ(unitTestまたはmock)で新しいファクトを作成し、値を入力します。 ここで覚えておくことが重要です-CLIPSは大文字と小文字を区別する言語であり、サブシステム、カテゴリ、名前、イベントタイプの値は、調査中のプロジェクトのコードで使用されたものと一致する必要があります。







標識イベントからの変数の値は、次のように渡されます。







3.完了したイベントをリリースするルールを決定します(結果に影響しないため、冗長です)。







ステップ6.結果を生成するルールを定義します。



このようなルールを読むことができます。



もし



1)unitTestとモックがあります。



2)この場合、テストの開始は既存のmokaより遅くなります。



3)検出されたモックの物語スキーマで結果を保存するためのテーブルがあります。



それから



4)新しいレコードを作成します。



5)時間を記入します。



6)...および説明。







その結果、新しいツールを使用すると次の図が表示されます。







カスタム計測器のソースコードと計測器を使用するためのサンプルプロジェクトは、GitHubで表示できます。



ツールのデバッグ



デバッガーは、カスタムツールのデバッグに使用されます。







彼は許可する



1. instrpkgの説明に基づいてコンパイルされたコードを参照してください。

2.実行時にツールに何が起こるかについての詳細情報を参照してください。







3.新しいツールの入力として使用できるシステムデータスキームの完全なリストと説明を表示します。







4.コンソールで任意のコマンドを実行します。 たとえば、list-defrulesコマンドを使用してルールのリストを表示するか、factsコマンドを使用してファクトを表示します







CIサーバーでのセットアップ



コマンドラインからツールを実行して、CIサーバーでのユニットテストまたはUIテストの実行中にアプリケーションのプロファイルを作成できます。 これにより、たとえば、メモリリークをできるだけ早くキャッ​​チできます。 パイプラインのテストのプロファイルを作成するには、次のコマンドを使用します。



1.属性付きのツールの実行:



 xcrun instruments -t <template_name> -l <average_duration_ms> -w <device_udid>
      
      







2.次のコマンドを使用して、同じシミュレーターでテストを実行します。



 xcodebuild -workspace <path_to_workspace>-scheme <scheme_with_tests> -destination <device> test-without-building
      
      







その結果、拡張子.traceのレポートが作業ディレクトリに作成されます。これは、Instrumentsアプリケーションで開くか、ファイルを右クリックして[パッケージの内容を表示]を選択することで開くことができます。



結論



道標を本格的なツールにアップグレードする例を見て、CIサーバーの「実行」に自動的に適用し、「点滅」(不安定)テストの問題の解決に使用する方法を説明しました。



カスタム計測器の可能性に飛び込むと、他のどのような場合に計測器を使用できるかをよりよく理解できます。 たとえば、マルチスレッドの問題-スレッドセーフデータアクセスを使用する場所とタイミングを理解するのにも役立ちます。

新しいツールの作成は非常に簡単でした。 しかし、主なことは、数日かけてメカニックとドキュメントを研究して今日作成した後、バグを修正しようとするいくつかの眠れない夜を避けることができるということです。



ソース





この記事は、iOS開発者であるAnton Vlasovの@regnoによって書かれました。



All Articles